blob: 755ea1b9b3af399b17c0052277a3a3d9a0e30d03 [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");
Gabor Horvathe3085992015-09-14 20:34:06 +00003325
3326 // Default nullability checks.
3327 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3328 CmdArgs.push_back(
3329 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003330 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003331
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003332 // Set the output format. The default is plist, for (lame) historical
3333 // reasons.
3334 CmdArgs.push_back("-analyzer-output");
3335 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003336 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003337 else
3338 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003339
Ted Kremenekfe449a22010-03-22 22:32:05 +00003340 // Disable the presentation of standard compiler warnings when
3341 // using --analyze. We only want to show static analyzer diagnostics
3342 // or frontend errors.
3343 CmdArgs.push_back("-w");
3344
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003345 // Add -Xanalyzer arguments when running as analyzer.
3346 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003347 }
3348
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003349 CheckCodeGenerationOptions(D, Args);
3350
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003351 llvm::Reloc::Model RelocationModel;
3352 unsigned PICLevel;
3353 bool IsPIE;
3354 std::tie(RelocationModel, PICLevel, IsPIE) =
3355 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003356
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003357 const char *RMName = RelocationModelName(RelocationModel);
3358 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003359 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003360 CmdArgs.push_back(RMName);
3361 }
3362 if (PICLevel > 0) {
3363 CmdArgs.push_back("-pic-level");
3364 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3365 if (IsPIE) {
3366 CmdArgs.push_back("-pie-level");
3367 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003368 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003369 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003370
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003371 CmdArgs.push_back("-mthread-model");
3372 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3373 CmdArgs.push_back(A->getValue());
3374 else
3375 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3376
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003377 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3378
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003379 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3380 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003381 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003382
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003383 // LLVM Code Generator Options.
3384
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003385 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3386 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003387 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3388 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003389 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003390 CmdArgs.push_back(A->getValue());
3391 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003392 }
3393 }
3394
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003395 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3396 StringRef v = A->getValue();
3397 CmdArgs.push_back("-mllvm");
3398 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3399 A->claim();
3400 }
3401
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003402 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3403 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003404 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003405 }
3406
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003407 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3408 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003409 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003410 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003411 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003412 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3413 CmdArgs.push_back("-fpcc-struct-return");
3414 } else {
3415 assert(A->getOption().matches(options::OPT_freg_struct_return));
3416 CmdArgs.push_back("-freg-struct-return");
3417 }
3418 }
3419
Roman Divacky65b88cd2011-03-01 17:40:53 +00003420 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3421 CmdArgs.push_back("-mrtd");
3422
Rafael Espindola224dd632011-12-14 21:02:23 +00003423 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003424 CmdArgs.push_back("-mdisable-fp-elim");
3425 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3426 options::OPT_fno_zero_initialized_in_bss))
3427 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003428
3429 bool OFastEnabled = isOptimizationLevelFast(Args);
3430 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3431 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003432 OptSpecifier StrictAliasingAliasOption =
3433 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003434 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3435 // doesn't do any TBAA.
3436 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003437 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003438 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003439 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003440 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3441 options::OPT_fno_struct_path_tbaa))
3442 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003443 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3444 false))
3445 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003446 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3447 options::OPT_fno_strict_vtable_pointers,
3448 false))
3449 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003450 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3451 options::OPT_fno_optimize_sibling_calls))
3452 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003453
Eric Christopher006208c2013-04-04 06:29:47 +00003454 // Handle segmented stacks.
3455 if (Args.hasArg(options::OPT_fsplit_stack))
3456 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003457
3458 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3459 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003460 OptSpecifier FastMathAliasOption =
3461 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3462
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003463 // Handle various floating point optimization flags, mapping them to the
3464 // appropriate LLVM code generation flags. The pattern for all of these is to
3465 // default off the codegen optimizations, and if any flag enables them and no
3466 // flag disables them after the flag enabling them, enable the codegen
3467 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003468 if (Arg *A = Args.getLastArg(
3469 options::OPT_ffast_math, FastMathAliasOption,
3470 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3471 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3472 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003473 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3474 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003475 A->getOption().getID() != options::OPT_fhonor_infinities)
3476 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003477 if (Arg *A = Args.getLastArg(
3478 options::OPT_ffast_math, FastMathAliasOption,
3479 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3480 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3481 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003482 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3483 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003484 A->getOption().getID() != options::OPT_fhonor_nans)
3485 CmdArgs.push_back("-menable-no-nans");
3486
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003487 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3488 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003489 if (Arg *A =
3490 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3491 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3492 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003493 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3494 // However, turning *off* -ffast_math merely restores the toolchain default
3495 // (which may be false).
3496 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3497 A->getOption().getID() == options::OPT_ffast_math ||
3498 A->getOption().getID() == options::OPT_Ofast)
3499 MathErrno = false;
3500 else if (A->getOption().getID() == options::OPT_fmath_errno)
3501 MathErrno = true;
3502 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003503 if (MathErrno)
3504 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003505
3506 // There are several flags which require disabling very specific
3507 // optimizations. Any of these being disabled forces us to turn off the
3508 // entire set of LLVM optimizations, so collect them through all the flag
3509 // madness.
3510 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003511 if (Arg *A = Args.getLastArg(
3512 options::OPT_ffast_math, FastMathAliasOption,
3513 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3514 options::OPT_fno_unsafe_math_optimizations,
3515 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003516 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3517 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003518 A->getOption().getID() != options::OPT_fno_associative_math)
3519 AssociativeMath = true;
3520 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003521 if (Arg *A = Args.getLastArg(
3522 options::OPT_ffast_math, FastMathAliasOption,
3523 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3524 options::OPT_fno_unsafe_math_optimizations,
3525 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003526 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3527 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003528 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3529 ReciprocalMath = true;
3530 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003531 if (Arg *A = Args.getLastArg(
3532 options::OPT_ffast_math, FastMathAliasOption,
3533 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3534 options::OPT_fno_unsafe_math_optimizations,
3535 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003536 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3537 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003538 A->getOption().getID() != options::OPT_fsigned_zeros)
3539 SignedZeros = false;
3540 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003541 if (Arg *A = Args.getLastArg(
3542 options::OPT_ffast_math, FastMathAliasOption,
3543 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3544 options::OPT_fno_unsafe_math_optimizations,
3545 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003546 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3547 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003548 A->getOption().getID() != options::OPT_ftrapping_math)
3549 TrappingMath = false;
3550 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3551 !TrappingMath)
3552 CmdArgs.push_back("-menable-unsafe-fp-math");
3553
Sanjay Patel76c9e092015-01-23 16:40:50 +00003554 if (!SignedZeros)
3555 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003556
Sanjay Patel359b1052015-04-09 15:03:23 +00003557 if (ReciprocalMath)
3558 CmdArgs.push_back("-freciprocal-math");
3559
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003560 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003561 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003562 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003563 options::OPT_ffp_contract)) {
3564 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003565 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003566 if (Val == "fast" || Val == "on" || Val == "off") {
3567 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3568 } else {
3569 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003570 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003571 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003572 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3573 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003574 // If fast-math is set then set the fp-contract mode to fast.
3575 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3576 }
3577 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003578
Sanjay Patel2987c292015-06-11 14:53:41 +00003579 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003580
Bob Wilson6a039162012-07-19 03:52:53 +00003581 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3582 // and if we find them, tell the frontend to provide the appropriate
3583 // preprocessor macros. This is distinct from enabling any optimizations as
3584 // these options induce language changes which must survive serialization
3585 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003586 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3587 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003588 if (!A->getOption().matches(options::OPT_fno_fast_math))
3589 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003590 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3591 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003592 if (A->getOption().matches(options::OPT_ffinite_math_only))
3593 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003594
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003595 // Decide whether to use verbose asm. Verbose assembly is the default on
3596 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003597 bool IsIntegratedAssemblerDefault =
3598 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003599 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003600 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003601 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003602 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003603
Rafael Espindolab8a12932015-05-22 20:44:03 +00003604 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3605 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003606 CmdArgs.push_back("-no-integrated-as");
3607
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003608 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3609 CmdArgs.push_back("-mdebug-pass");
3610 CmdArgs.push_back("Structure");
3611 }
3612 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3613 CmdArgs.push_back("-mdebug-pass");
3614 CmdArgs.push_back("Arguments");
3615 }
3616
John McCall8517abc2010-02-19 02:45:38 +00003617 // Enable -mconstructor-aliases except on darwin, where we have to
3618 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003619 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003620 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003621
John McCall7ef5cb32011-03-18 02:56:14 +00003622 // Darwin's kernel doesn't support guard variables; just die if we
3623 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003624 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003625 CmdArgs.push_back("-fforbid-guard-variables");
3626
Douglas Gregordbe39272011-02-01 15:15:22 +00003627 if (Args.hasArg(options::OPT_mms_bitfields)) {
3628 CmdArgs.push_back("-mms-bitfields");
3629 }
John McCall8517abc2010-02-19 02:45:38 +00003630
Daniel Dunbar306945d2009-09-16 06:17:29 +00003631 // This is a coarse approximation of what llvm-gcc actually does, both
3632 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3633 // complicated ways.
3634 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003635 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3636 options::OPT_fno_asynchronous_unwind_tables,
3637 (getToolChain().IsUnwindTablesDefault() ||
3638 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3639 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003640 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3641 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003642 CmdArgs.push_back("-munwind-tables");
3643
Chandler Carruth05fb5852012-11-21 23:40:23 +00003644 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003645
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003646 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3647 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003648 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003649 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003650
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003651 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003652 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003653
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003654 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003655 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003656 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003657 }
3658
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003659 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003660 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003661 if (!CPU.empty()) {
3662 CmdArgs.push_back("-target-cpu");
3663 CmdArgs.push_back(Args.MakeArgString(CPU));
3664 }
3665
Rafael Espindolaeb265472013-08-21 21:59:03 +00003666 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3667 CmdArgs.push_back("-mfpmath");
3668 CmdArgs.push_back(A->getValue());
3669 }
3670
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003671 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003672 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003673
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003674 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003675 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003676 default:
3677 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003678
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003679 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003680 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003681 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003682 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003683 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003684 break;
3685
Tim Northover573cbee2014-05-24 12:52:07 +00003686 case llvm::Triple::aarch64:
3687 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003688 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003689 break;
3690
Eric Christopher0b26a612010-03-02 02:41:08 +00003691 case llvm::Triple::mips:
3692 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003693 case llvm::Triple::mips64:
3694 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003695 AddMIPSTargetArgs(Args, CmdArgs);
3696 break;
3697
Ulrich Weigand8afad612014-07-28 13:17:52 +00003698 case llvm::Triple::ppc:
3699 case llvm::Triple::ppc64:
3700 case llvm::Triple::ppc64le:
3701 AddPPCTargetArgs(Args, CmdArgs);
3702 break;
3703
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003704 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003705 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003706 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003707 AddSparcTargetArgs(Args, CmdArgs);
3708 break;
3709
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003710 case llvm::Triple::x86:
3711 case llvm::Triple::x86_64:
3712 AddX86TargetArgs(Args, CmdArgs);
3713 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003714
3715 case llvm::Triple::hexagon:
3716 AddHexagonTargetArgs(Args, CmdArgs);
3717 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003718 }
3719
Hans Wennborg75958c42013-08-08 00:17:41 +00003720 // Add clang-cl arguments.
3721 if (getToolChain().getDriver().IsCLMode())
3722 AddClangCLArgs(Args, CmdArgs);
3723
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003724 // Pass the linker version in use.
3725 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3726 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003727 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003728 }
3729
Eric Christopherb7d97e92013-04-03 01:58:53 +00003730 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003731 CmdArgs.push_back("-momit-leaf-frame-pointer");
3732
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003733 // Explicitly error on some things we know we don't support and can't just
3734 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003735 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003736 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3737 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003738 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003739 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003740 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3741 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003742 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003743 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003744 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003745 }
3746
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003747 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003748 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003749 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003750 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003751 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3752 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003753 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003754 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003755 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003756
Chad Rosierbe10f982011-08-02 17:58:04 +00003757 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003758 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003759 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3760 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003761 }
3762
Manman Ren17bdb0f2013-11-20 20:22:14 +00003763 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3764 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003765 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003766 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003767 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikiece3e7a62015-07-30 21:42:22 +00003768 if ((A->getOption().matches(options::OPT_gline_tables_only) ||
3769 A->getOption().matches(options::OPT_g1)) &&
3770 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003771 // FIXME: we should support specifying dwarf version with
3772 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003773 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003774 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003775 const llvm::Triple &Triple = getToolChain().getTriple();
3776 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003777 Triple.getOS() == llvm::Triple::FreeBSD ||
3778 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003779 CmdArgs.push_back("-gdwarf-2");
David Blaikiece3e7a62015-07-30 21:42:22 +00003780 SplitDwarfArg = nullptr;
Douglas Katzman553927a2015-09-14 20:31:28 +00003781 } else if (A->getOption().matches(options::OPT_gdwarf_2) ||
3782 A->getOption().matches(options::OPT_gdwarf_3) ||
3783 A->getOption().matches(options::OPT_gdwarf_4)) {
3784 A->render(Args, CmdArgs);
3785 } else if (!A->getOption().matches(options::OPT_g0) &&
3786 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003787 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003788 const llvm::Triple &Triple = getToolChain().getTriple();
3789 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003790 Triple.getOS() == llvm::Triple::FreeBSD ||
3791 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003792 CmdArgs.push_back("-gdwarf-2");
3793 else
3794 CmdArgs.push_back("-g");
3795 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003796 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003797
Reid Kleckner124955a2015-08-05 18:51:13 +00003798 // Forward -gcodeview.
3799 Args.AddLastArg(CmdArgs, options::OPT_gcodeview);
3800
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003801 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3802 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003803 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3804 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003805 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003806
Eric Christopher138c32b2013-09-13 22:37:55 +00003807 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003808 if (Args.hasArg(options::OPT_gmodules)) {
3809 CmdArgs.push_back("-g");
3810 CmdArgs.push_back("-dwarf-ext-refs");
3811 CmdArgs.push_back("-fmodule-format=obj");
3812 }
3813
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003814 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3815 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003816 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003817 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003818 CmdArgs.push_back("-g");
3819 CmdArgs.push_back("-backend-option");
3820 CmdArgs.push_back("-split-dwarf=Enable");
3821 }
3822
Eric Christopher138c32b2013-09-13 22:37:55 +00003823 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3824 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3825 CmdArgs.push_back("-backend-option");
3826 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3827 }
Eric Christophereec89c22013-06-18 00:03:50 +00003828
Eric Christopher0d403d22014-02-14 01:27:03 +00003829 // -gdwarf-aranges turns on the emission of the aranges section in the
3830 // backend.
3831 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3832 CmdArgs.push_back("-backend-option");
3833 CmdArgs.push_back("-generate-arange-section");
3834 }
3835
David Blaikief36d9ba2014-01-27 18:52:43 +00003836 if (Args.hasFlag(options::OPT_fdebug_types_section,
3837 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003838 CmdArgs.push_back("-backend-option");
3839 CmdArgs.push_back("-generate-type-units");
3840 }
Eric Christophereec89c22013-06-18 00:03:50 +00003841
Ed Schouten6e576152015-03-26 17:50:28 +00003842 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3843 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3844
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003845 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003846 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003847 CmdArgs.push_back("-ffunction-sections");
3848 }
3849
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003850 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3851 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003852 CmdArgs.push_back("-fdata-sections");
3853 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003854
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003855 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003856 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003857 CmdArgs.push_back("-fno-unique-section-names");
3858
Chris Lattner3c77a352010-06-22 00:03:40 +00003859 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3860
Diego Novilloa0545962015-07-10 18:00:07 +00003861 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003862
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003863 // Pass options for controlling the default header search paths.
3864 if (Args.hasArg(options::OPT_nostdinc)) {
3865 CmdArgs.push_back("-nostdsysteminc");
3866 CmdArgs.push_back("-nobuiltininc");
3867 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003868 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003869 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003870 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3871 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3872 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003873
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003874 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003875 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003876 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003877
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003878 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3879
Ted Kremenekf7639e12012-03-06 20:06:33 +00003880 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003881 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003882 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003883 options::OPT_ccc_arcmt_modify,
3884 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003885 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003886 switch (A->getOption().getID()) {
3887 default:
3888 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003889 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003890 CmdArgs.push_back("-arcmt-check");
3891 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003892 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003893 CmdArgs.push_back("-arcmt-modify");
3894 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003895 case options::OPT_ccc_arcmt_migrate:
3896 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003897 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003898 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003899
3900 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3901 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003902 break;
John McCalld70fb982011-06-15 23:25:17 +00003903 }
3904 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003905 } else {
3906 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3907 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3908 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003909 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003910
Ted Kremenekf7639e12012-03-06 20:06:33 +00003911 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3912 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003913 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3914 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003915 }
3916 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003917 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003918
3919 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003920 options::OPT_objcmt_migrate_subscripting,
3921 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003922 // None specified, means enable them all.
3923 CmdArgs.push_back("-objcmt-migrate-literals");
3924 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003925 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003926 } else {
3927 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3928 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003929 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003930 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003931 } else {
3932 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3933 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3934 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3935 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3936 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3937 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003938 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003939 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3940 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3941 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3942 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3943 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3944 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3945 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003946 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003947 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003948 }
3949
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003950 // Add preprocessing options like -I, -D, etc. if we are using the
3951 // preprocessor.
3952 //
3953 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003954 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003955 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003956
Rafael Espindolaa7431922011-07-21 23:40:37 +00003957 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3958 // that "The compiler can only warn and ignore the option if not recognized".
3959 // When building with ccache, it will pass -D options to clang even on
3960 // preprocessed inputs and configure concludes that -fPIC is not supported.
3961 Args.ClaimAllArgs(options::OPT_D);
3962
Alp Toker7874bdc2013-11-15 20:40:58 +00003963 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003964 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3965 if (A->getOption().matches(options::OPT_O4)) {
3966 CmdArgs.push_back("-O3");
3967 D.Diag(diag::warn_O4_is_O3);
3968 } else {
3969 A->render(Args, CmdArgs);
3970 }
3971 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003972
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003973 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003974 for (const Arg *A :
3975 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3976 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00003977 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003978 }
3979
Rafael Espindola577637a2015-01-03 00:06:04 +00003980 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003981
Richard Smith3be1cb22014-08-07 00:24:21 +00003982 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003983 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003984 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3985 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003986 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003987 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003988
3989 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003990 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003991 //
3992 // If a std is supplied, only add -trigraphs if it follows the
3993 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003994 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003995 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3996 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003997 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003998 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003999 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004000 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004001 else
4002 Std->render(Args, CmdArgs);
4003
Nico Weber00721502014-12-23 22:32:37 +00004004 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004005 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004006 options::OPT_ftrigraphs,
4007 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004008 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004009 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004010 } else {
4011 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004012 //
4013 // FIXME: Clang doesn't correctly handle -std= when the input language
4014 // doesn't match. For the time being just ignore this for C++ inputs;
4015 // eventually we want to do all the standard defaulting here instead of
4016 // splitting it between the driver and clang -cc1.
4017 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004018 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4019 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004020 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004021 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004022
Nico Weber00721502014-12-23 22:32:37 +00004023 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4024 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004025 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004026
Richard Smith282b4492013-09-04 22:50:31 +00004027 // GCC's behavior for -Wwrite-strings is a bit strange:
4028 // * In C, this "warning flag" changes the types of string literals from
4029 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4030 // for the discarded qualifier.
4031 // * In C++, this is just a normal warning flag.
4032 //
4033 // Implementing this warning correctly in C is hard, so we follow GCC's
4034 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4035 // a non-const char* in C, rather than using this crude hack.
4036 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004037 // FIXME: This should behave just like a warning flag, and thus should also
4038 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4039 Arg *WriteStrings =
4040 Args.getLastArg(options::OPT_Wwrite_strings,
4041 options::OPT_Wno_write_strings, options::OPT_w);
4042 if (WriteStrings &&
4043 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004044 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004045 }
4046
Chandler Carruth61fbf622011-04-23 09:27:53 +00004047 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004048 // during C++ compilation, which it is by default. GCC keeps this define even
4049 // in the presence of '-w', match this behavior bug-for-bug.
4050 if (types::isCXX(InputType) &&
4051 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4052 true)) {
4053 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004054 }
4055
Chandler Carruthe0391482010-05-22 02:21:53 +00004056 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4057 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4058 if (Asm->getOption().matches(options::OPT_fasm))
4059 CmdArgs.push_back("-fgnu-keywords");
4060 else
4061 CmdArgs.push_back("-fno-gnu-keywords");
4062 }
4063
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004064 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4065 CmdArgs.push_back("-fno-dwarf-directory-asm");
4066
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004067 if (ShouldDisableAutolink(Args, getToolChain()))
4068 CmdArgs.push_back("-fno-autolink");
4069
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004070 // Add in -fdebug-compilation-dir if necessary.
4071 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004072
Richard Smith9a568822011-11-21 19:36:32 +00004073 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4074 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004075 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004076 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004077 }
4078
Richard Smith79c927b2013-11-06 19:31:51 +00004079 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4080 CmdArgs.push_back("-foperator-arrow-depth");
4081 CmdArgs.push_back(A->getValue());
4082 }
4083
Richard Smith9a568822011-11-21 19:36:32 +00004084 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4085 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004086 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004087 }
4088
Richard Smitha3d3bd22013-05-08 02:12:03 +00004089 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4090 CmdArgs.push_back("-fconstexpr-steps");
4091 CmdArgs.push_back(A->getValue());
4092 }
4093
Richard Smithb3a14522013-02-22 01:59:51 +00004094 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4095 CmdArgs.push_back("-fbracket-depth");
4096 CmdArgs.push_back(A->getValue());
4097 }
4098
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004099 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4100 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004101 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004102 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004103 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4104 } else
4105 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004106 }
4107
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004108 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004109 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004110
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004111 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4112 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004113 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004114 }
David Chisnall5778fce2009-08-31 16:41:57 +00004115
Chris Lattnere23003d2010-01-09 21:54:33 +00004116 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4117 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004118 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004119 }
4120
Chris Lattnerb35583d2010-04-07 20:49:23 +00004121 CmdArgs.push_back("-ferror-limit");
4122 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004123 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004124 else
4125 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004126
Chandler Carrutha77a7272010-05-06 04:55:18 +00004127 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4128 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004129 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004130 }
4131
4132 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4133 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004134 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004135 }
4136
Richard Smithf6f003a2011-12-16 19:06:07 +00004137 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4138 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004139 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004140 }
4141
Nick Lewycky24653262014-12-16 21:39:02 +00004142 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4143 CmdArgs.push_back("-fspell-checking-limit");
4144 CmdArgs.push_back(A->getValue());
4145 }
4146
Daniel Dunbar2c978472009-11-04 06:24:47 +00004147 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004148 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004149 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004150 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004151 } else {
4152 // If -fmessage-length=N was not specified, determine whether this is a
4153 // terminal and, if so, implicitly define -fmessage-length appropriately.
4154 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004155 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004156 }
4157
John McCallb4a99d32013-02-19 01:57:35 +00004158 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4159 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4160 options::OPT_fvisibility_ms_compat)) {
4161 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4162 CmdArgs.push_back("-fvisibility");
4163 CmdArgs.push_back(A->getValue());
4164 } else {
4165 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4166 CmdArgs.push_back("-fvisibility");
4167 CmdArgs.push_back("hidden");
4168 CmdArgs.push_back("-ftype-visibility");
4169 CmdArgs.push_back("default");
4170 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004171 }
4172
Douglas Gregor08329632010-06-15 17:05:35 +00004173 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004174
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004175 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4176
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004177 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004178 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4179 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004180 CmdArgs.push_back("-ffreestanding");
4181
Daniel Dunbare357d562009-12-03 18:42:11 +00004182 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004183 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004184 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00004185 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
4186 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00004187 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004188 // Emulated TLS is enabled by default on Android, and can be enabled manually
4189 // with -femulated-tls.
4190 bool EmulatedTLSDefault = Triple.getEnvironment() == llvm::Triple::Android;
4191 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4192 EmulatedTLSDefault))
4193 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004194 // AltiVec-like language extensions aren't relevant for assembling.
4195 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004196 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004197 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4198 }
Richard Trieu91844232012-06-26 18:18:47 +00004199 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4200 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004201
Alexey Bataevdb390212015-05-20 04:24:19 +00004202 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004203 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4204 options::OPT_fno_openmp, false))
4205 switch (getOpenMPRuntime(getToolChain(), Args)) {
4206 case OMPRT_OMP:
4207 case OMPRT_IOMP5:
4208 // Clang can generate useful OpenMP code for these two runtime libraries.
4209 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004210
4211 // If no option regarding the use of TLS in OpenMP codegeneration is
4212 // given, decide a default based on the target. Otherwise rely on the
4213 // options and pass the right information to the frontend.
4214 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004215 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004216 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004217 break;
4218 default:
4219 // By default, if Clang doesn't know how to generate useful OpenMP code
4220 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4221 // down to the actual compilation.
4222 // FIXME: It would be better to have a mode which *only* omits IR
4223 // generation based on the OpenMP support so that we get consistent
4224 // semantic analysis, etc.
4225 break;
4226 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004227
Peter Collingbourne32701642013-11-01 18:16:25 +00004228 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004229 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004230
Eric Christopher459d2712013-02-19 06:16:53 +00004231 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004232 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4233 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4234 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4235 Arch == llvm::Triple::ppc64le))
4236 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4237 << "ppc/ppc64/ppc64le";
4238 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004239
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004240 // -fzvector is incompatible with -faltivec.
4241 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4242 if (Args.hasArg(options::OPT_faltivec))
4243 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4244 << "-faltivec";
4245
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004246 if (getToolChain().SupportsProfiling())
4247 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004248
4249 // -flax-vector-conversions is default.
4250 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4251 options::OPT_fno_lax_vector_conversions))
4252 CmdArgs.push_back("-fno-lax-vector-conversions");
4253
John Brawna7b4ec02015-08-10 11:11:28 +00004254 if (Args.getLastArg(options::OPT_fapple_kext) ||
4255 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004256 CmdArgs.push_back("-fapple-kext");
4257
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004258 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004259 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004260 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004261 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4262 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004263
4264 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4265 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004266 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004267 }
4268
Bob Wilson14adb362012-02-03 06:27:22 +00004269 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004270
Chandler Carruth6e501032011-03-27 00:04:55 +00004271 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4272 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004273 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004274 if (A->getOption().matches(options::OPT_fwrapv))
4275 CmdArgs.push_back("-fwrapv");
4276 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4277 options::OPT_fno_strict_overflow)) {
4278 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4279 CmdArgs.push_back("-fwrapv");
4280 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004281
4282 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4283 options::OPT_fno_reroll_loops))
4284 if (A->getOption().matches(options::OPT_freroll_loops))
4285 CmdArgs.push_back("-freroll-loops");
4286
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004287 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004288 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4289 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004290
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004291 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4292
Daniel Dunbar4930e332009-11-17 08:07:36 +00004293 // -stack-protector=0 is default.
4294 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004295 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4296 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4297 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4298 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4299 Args.ClaimAllArgs(options::OPT_fstack_protector);
4300 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004301 options::OPT_fstack_protector_all,
4302 options::OPT_fstack_protector_strong,
4303 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004304 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004305 StackProtectorLevel = std::max<unsigned>(
4306 LangOptions::SSPOn,
4307 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004308 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004309 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004310 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004311 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004312 } else {
4313 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004314 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004315 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004316 if (StackProtectorLevel) {
4317 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004318 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004319 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004320
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004321 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004322 for (const Arg *A : Args.filtered(options::OPT__param)) {
4323 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004324 if (Str.startswith("ssp-buffer-size=")) {
4325 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004326 CmdArgs.push_back("-stack-protector-buffer-size");
4327 // FIXME: Verify the argument is a valid integer.
4328 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004329 }
Sean Silva14facf32015-06-09 01:57:17 +00004330 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004331 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004332 }
4333
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004334 // Translate -mstackrealign
4335 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004336 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004337 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004338
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004339 if (Args.hasArg(options::OPT_mstack_alignment)) {
4340 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4341 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004342 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004343
Hans Wennborg77dc2362015-01-20 19:45:50 +00004344 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4345 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4346
4347 if (!Size.empty())
4348 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4349 else
4350 CmdArgs.push_back("-mstack-probe-size=0");
4351 }
4352
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004353 switch (getToolChain().getArch()) {
4354 case llvm::Triple::aarch64:
4355 case llvm::Triple::aarch64_be:
4356 case llvm::Triple::arm:
4357 case llvm::Triple::armeb:
4358 case llvm::Triple::thumb:
4359 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004360 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004361 break;
4362
4363 default:
4364 break;
4365 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004366
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004367 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4368 options::OPT_mno_restrict_it)) {
4369 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4370 CmdArgs.push_back("-backend-option");
4371 CmdArgs.push_back("-arm-restrict-it");
4372 } else {
4373 CmdArgs.push_back("-backend-option");
4374 CmdArgs.push_back("-arm-no-restrict-it");
4375 }
James Y Knight2db38f32015-08-15 03:45:25 +00004376 } else if (Triple.isOSWindows() &&
4377 (Triple.getArch() == llvm::Triple::arm ||
4378 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004379 // Windows on ARM expects restricted IT blocks
4380 CmdArgs.push_back("-backend-option");
4381 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004382 }
4383
Daniel Dunbard18049a2009-04-07 21:16:11 +00004384 // Forward -f options with positive and negative forms; we translate
4385 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004386 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4387 StringRef fname = A->getValue();
4388 if (!llvm::sys::fs::exists(fname))
4389 D.Diag(diag::err_drv_no_such_file) << fname;
4390 else
4391 A->render(Args, CmdArgs);
4392 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004393
John Brawna7b4ec02015-08-10 11:11:28 +00004394 // -fbuiltin is default unless -mkernel is used
4395 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4396 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004397 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004398
Nuno Lopes13c88c72009-12-16 16:59:22 +00004399 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4400 options::OPT_fno_assume_sane_operator_new))
4401 CmdArgs.push_back("-fno-assume-sane-operator-new");
4402
Daniel Dunbar4930e332009-11-17 08:07:36 +00004403 // -fblocks=0 is default.
4404 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004405 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004406 (Args.hasArg(options::OPT_fgnu_runtime) &&
4407 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4408 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004409 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004410
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004411 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004412 !getToolChain().hasBlocksRuntime())
4413 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004414 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004415
Richard Smith47972af2015-06-16 00:08:24 +00004416 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004417 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004418 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004419 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004420 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004421 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4422 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004423 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004424 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004425 HaveModules = true;
4426 }
4427 }
4428
Richard Smith47972af2015-06-16 00:08:24 +00004429 // -fmodule-maps enables implicit reading of module map files. By default,
4430 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004431 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4432 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004433 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004434 }
4435
Daniel Jasperac42b752013-10-21 06:34:34 +00004436 // -fmodules-decluse checks that modules used are declared so (off by
4437 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004438 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004439 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004440 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004441 }
4442
Daniel Jasper962b38e2014-04-11 11:47:45 +00004443 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4444 // all #included headers are part of modules.
4445 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004446 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004447 CmdArgs.push_back("-fmodules-strict-decluse");
4448 }
4449
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004450 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4451 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4452 options::OPT_fno_implicit_modules)) {
4453 CmdArgs.push_back("-fno-implicit-modules");
4454 }
4455
Daniel Jasperac42b752013-10-21 06:34:34 +00004456 // -fmodule-name specifies the module that is currently being built (or
4457 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004458 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004459
Richard Smith9887d792014-10-17 01:42:53 +00004460 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004461 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004462 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004463
Richard Smithe842a472014-10-22 02:05:46 +00004464 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004465 if (HaveModules)
4466 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4467 else
4468 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004469
4470 // -fmodule-cache-path specifies where our implicitly-built module files
4471 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004472 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004473 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004474 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004475 if (HaveModules) {
4476 if (C.isForDiagnostics()) {
4477 // When generating crash reports, we want to emit the modules along with
4478 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004479 Path = Output.getFilename();
4480 llvm::sys::path::replace_extension(Path, ".cache");
4481 llvm::sys::path::append(Path, "modules");
4482 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004483 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004484 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004485 llvm::sys::path::append(Path, "org.llvm.clang.");
4486 appendUserToPath(Path);
4487 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004488 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004489 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004490 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4491 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004492 }
4493
4494 // When building modules and generating crashdumps, we need to dump a module
4495 // dependency VFS alongside the output.
4496 if (HaveModules && C.isForDiagnostics()) {
4497 SmallString<128> VFSDir(Output.getFilename());
4498 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004499 // Add the cache directory as a temp so the crash diagnostics pick it up.
4500 C.addTempFile(Args.MakeArgString(VFSDir));
4501
Justin Bognera88f0122014-06-20 22:59:50 +00004502 llvm::sys::path::append(VFSDir, "vfs");
4503 CmdArgs.push_back("-module-dependency-dir");
4504 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004505 }
4506
Richard Smith9887d792014-10-17 01:42:53 +00004507 if (HaveModules)
4508 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004509
Douglas Gregor35b04d62013-02-07 19:01:24 +00004510 // Pass through all -fmodules-ignore-macro arguments.
4511 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004512 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4513 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004514
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004515 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4516
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004517 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4518 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4519 D.Diag(diag::err_drv_argument_not_allowed_with)
4520 << A->getAsString(Args) << "-fbuild-session-timestamp";
4521
4522 llvm::sys::fs::file_status Status;
4523 if (llvm::sys::fs::status(A->getValue(), Status))
4524 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004525 CmdArgs.push_back(Args.MakeArgString(
4526 "-fbuild-session-timestamp=" +
4527 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004528 }
4529
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004530 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004531 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4532 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004533 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4534
4535 Args.AddLastArg(CmdArgs,
4536 options::OPT_fmodules_validate_once_per_build_session);
4537 }
4538
Ben Langmuirdcf73862014-03-12 00:06:17 +00004539 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4540
John McCalldfea9982010-04-09 19:12:06 +00004541 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004542 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004543 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004544 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004545
Anders Carlssond470fef2010-11-21 00:09:52 +00004546 // -felide-constructors is the default.
4547 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004548 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004549 CmdArgs.push_back("-fno-elide-constructors");
4550
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004551 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004552
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004553 if (KernelOrKext || (types::isCXX(InputType) &&
4554 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4555 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004556 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004557
Tony Linthicum76329bf2011-12-12 21:14:55 +00004558 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004559 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4560 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004561 CmdArgs.push_back("-fshort-enums");
4562
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004563 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004564 if (Arg *A = Args.getLastArg(
4565 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4566 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4567 if (A->getOption().matches(options::OPT_funsigned_char) ||
4568 A->getOption().matches(options::OPT_fno_signed_char)) {
4569 CmdArgs.push_back("-fno-signed-char");
4570 }
4571 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004572 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004573 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004574
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004575 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004576 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4577 options::OPT_fno_use_cxa_atexit,
4578 !IsWindowsCygnus && !IsWindowsGNU &&
Rafael Espindolafe71f382015-09-14 23:21:31 +00004579 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4580 getToolChain().getArch() != llvm::Triple::hexagon &&
4581 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004582 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004583 CmdArgs.push_back("-fno-use-cxa-atexit");
4584
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004585 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004586 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004587 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004588 CmdArgs.push_back("-fms-extensions");
4589
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004590 // -fno-use-line-directives is default.
4591 if (Args.hasFlag(options::OPT_fuse_line_directives,
4592 options::OPT_fno_use_line_directives, false))
4593 CmdArgs.push_back("-fuse-line-directives");
4594
Francois Pichet1b4f1632011-09-17 04:32:15 +00004595 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004596 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004597 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004598 (IsWindowsMSVC &&
4599 Args.hasFlag(options::OPT_fms_extensions,
4600 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004601 CmdArgs.push_back("-fms-compatibility");
4602
David Majnemerc371ff02015-03-22 08:39:22 +00004603 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004604 VersionTuple MSVT = visualstudio::getMSVCVersion(
4605 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4606 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004607 CmdArgs.push_back(
4608 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004609
David Majnemer8db91762015-05-18 04:49:30 +00004610 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4611 if (ImplyVCPPCXXVer) {
4612 if (IsMSVC2015Compatible)
4613 CmdArgs.push_back("-std=c++14");
4614 else
4615 CmdArgs.push_back("-std=c++11");
4616 }
4617
Eric Christopher5ecce122013-02-18 00:38:31 +00004618 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004619 if (Args.hasFlag(options::OPT_fborland_extensions,
4620 options::OPT_fno_borland_extensions, false))
4621 CmdArgs.push_back("-fborland-extensions");
4622
David Majnemerc371ff02015-03-22 08:39:22 +00004623 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4624 // than 19.
4625 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4626 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004627 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004628 CmdArgs.push_back("-fno-threadsafe-statics");
4629
Francois Pichet02744872011-09-01 16:38:08 +00004630 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4631 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004632 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004633 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004634 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004635
Chandler Carruthe03aa552010-04-17 20:17:31 +00004636 // -fgnu-keywords default varies depending on language; only pass if
4637 // specified.
4638 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004639 options::OPT_fno_gnu_keywords))
4640 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004641
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004642 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004643 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004644 CmdArgs.push_back("-fgnu89-inline");
4645
Chad Rosier9c76d242012-03-15 22:31:42 +00004646 if (Args.hasArg(options::OPT_fno_inline))
4647 CmdArgs.push_back("-fno-inline");
4648
Chad Rosier64d6be92012-03-06 21:17:19 +00004649 if (Args.hasArg(options::OPT_fno_inline_functions))
4650 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004651
John McCall5fb5df92012-06-20 06:18:46 +00004652 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004653
John McCall5fb5df92012-06-20 06:18:46 +00004654 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004655 // legacy is the default. Except for deployment taget of 10.5,
4656 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4657 // gets ignored silently.
4658 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004659 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4660 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004661 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004662 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004663 if (getToolChain().UseObjCMixedDispatch())
4664 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4665 else
4666 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4667 }
4668 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004669
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004670 // When ObjectiveC legacy runtime is in effect on MacOSX,
4671 // turn on the option to do Array/Dictionary subscripting
4672 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004673 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004674 getToolChain().getTriple().isMacOSX() &&
4675 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4676 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004677 objcRuntime.isNeXTFamily())
4678 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004679
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004680 // -fencode-extended-block-signature=1 is default.
4681 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4682 CmdArgs.push_back("-fencode-extended-block-signature");
4683 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004684
John McCall24fc0de2011-07-06 00:26:06 +00004685 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4686 // NOTE: This logic is duplicated in ToolChains.cpp.
4687 bool ARC = isObjCAutoRefCount(Args);
4688 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004689 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004690
John McCall24fc0de2011-07-06 00:26:06 +00004691 CmdArgs.push_back("-fobjc-arc");
4692
Chandler Carruth491db322011-11-04 07:34:47 +00004693 // FIXME: It seems like this entire block, and several around it should be
4694 // wrapped in isObjC, but for now we just use it here as this is where it
4695 // was being used previously.
4696 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4697 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4698 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4699 else
4700 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4701 }
4702
John McCall24fc0de2011-07-06 00:26:06 +00004703 // Allow the user to enable full exceptions code emission.
4704 // We define off for Objective-CC, on for Objective-C++.
4705 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4706 options::OPT_fno_objc_arc_exceptions,
4707 /*default*/ types::isCXX(InputType)))
4708 CmdArgs.push_back("-fobjc-arc-exceptions");
4709 }
4710
4711 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4712 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004713 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004714 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004715
John McCall24fc0de2011-07-06 00:26:06 +00004716 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4717 // takes precedence.
4718 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4719 if (!GCArg)
4720 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4721 if (GCArg) {
4722 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004723 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004724 } else if (getToolChain().SupportsObjCGC()) {
4725 GCArg->render(Args, CmdArgs);
4726 } else {
4727 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004728 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004729 }
4730 }
4731
Bob Wilsonb111ec92015-03-02 19:01:14 +00004732 if (Args.hasFlag(options::OPT_fapplication_extension,
4733 options::OPT_fno_application_extension, false))
4734 CmdArgs.push_back("-fapplication-extension");
4735
Reid Klecknerc542d372014-06-27 17:02:02 +00004736 // Handle GCC-style exception args.
4737 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004738 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4739 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004740
4741 if (getToolChain().UseSjLjExceptions())
4742 CmdArgs.push_back("-fsjlj-exceptions");
4743
4744 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004745 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4746 options::OPT_fno_assume_sane_operator_new))
4747 CmdArgs.push_back("-fno-assume-sane-operator-new");
4748
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004749 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4750 // most platforms.
4751 if (Args.hasFlag(options::OPT_fsized_deallocation,
4752 options::OPT_fno_sized_deallocation, false))
4753 CmdArgs.push_back("-fsized-deallocation");
4754
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004755 // -fconstant-cfstrings is default, and may be subject to argument translation
4756 // on Darwin.
4757 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4758 options::OPT_fno_constant_cfstrings) ||
4759 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4760 options::OPT_mno_constant_cfstrings))
4761 CmdArgs.push_back("-fno-constant-cfstrings");
4762
John Thompsoned4e2952009-11-05 20:14:16 +00004763 // -fshort-wchar default varies depending on platform; only
4764 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004765 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4766 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004767 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004768
Hans Wennborg28c96312013-07-31 23:39:13 +00004769 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004770 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004771 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004772 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004773
Daniel Dunbar096ed292011-10-05 21:04:55 +00004774 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4775 // -fno-pack-struct doesn't apply to -fpack-struct=.
4776 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004777 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004778 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004779 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004780 } else if (Args.hasFlag(options::OPT_fpack_struct,
4781 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004782 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004783 }
4784
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004785 // Handle -fmax-type-align=N and -fno-type-align
4786 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4787 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4788 if (!SkipMaxTypeAlign) {
4789 std::string MaxTypeAlignStr = "-fmax-type-align=";
4790 MaxTypeAlignStr += A->getValue();
4791 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4792 }
4793 } else if (getToolChain().getTriple().isOSDarwin()) {
4794 if (!SkipMaxTypeAlign) {
4795 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4796 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4797 }
4798 }
4799
John Brawna7b4ec02015-08-10 11:11:28 +00004800 // -fcommon is the default unless compiling kernel code or the target says so
4801 bool NoCommonDefault =
4802 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
4803 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
4804 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004805 CmdArgs.push_back("-fno-common");
4806
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004807 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004808 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004809 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004810 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004811 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004812 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004813
Daniel Dunbar6358d682010-10-15 22:30:42 +00004814 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004815 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004816 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004817 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004818
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004819 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004820 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4821 StringRef value = inputCharset->getValue();
4822 if (value != "UTF-8")
4823 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4824 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004825 }
4826
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004827 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004828 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4829 StringRef value = execCharset->getValue();
4830 if (value != "UTF-8")
4831 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4832 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004833 }
4834
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004835 // -fcaret-diagnostics is default.
4836 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4837 options::OPT_fno_caret_diagnostics, true))
4838 CmdArgs.push_back("-fno-caret-diagnostics");
4839
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004840 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004841 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004842 options::OPT_fno_diagnostics_fixit_info))
4843 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004844
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004845 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004846 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004847 options::OPT_fno_diagnostics_show_option))
4848 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004849
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004850 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004851 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004852 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004853 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004854 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004855
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004856 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004857 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004858 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004859 }
4860
Chandler Carruthb6766f02011-03-27 01:50:55 +00004861 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004862 options::OPT_fdiagnostics_show_note_include_stack,
4863 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004864 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004865 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004866 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4867 else
4868 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4869 }
4870
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004871 // Color diagnostics are the default, unless the terminal doesn't support
4872 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004873 // Support both clang's -f[no-]color-diagnostics and gcc's
4874 // -f[no-]diagnostics-colors[=never|always|auto].
4875 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004876 for (const auto &Arg : Args) {
4877 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004878 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4879 !O.matches(options::OPT_fdiagnostics_color) &&
4880 !O.matches(options::OPT_fno_color_diagnostics) &&
4881 !O.matches(options::OPT_fno_diagnostics_color) &&
4882 !O.matches(options::OPT_fdiagnostics_color_EQ))
4883 continue;
4884
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004885 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004886 if (O.matches(options::OPT_fcolor_diagnostics) ||
4887 O.matches(options::OPT_fdiagnostics_color)) {
4888 ShowColors = Colors_On;
4889 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4890 O.matches(options::OPT_fno_diagnostics_color)) {
4891 ShowColors = Colors_Off;
4892 } else {
4893 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004894 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004895 if (value == "always")
4896 ShowColors = Colors_On;
4897 else if (value == "never")
4898 ShowColors = Colors_Off;
4899 else if (value == "auto")
4900 ShowColors = Colors_Auto;
4901 else
4902 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004903 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004904 }
4905 }
4906 if (ShowColors == Colors_On ||
4907 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004908 CmdArgs.push_back("-fcolor-diagnostics");
4909
Nico Rieck7857d462013-09-11 00:38:02 +00004910 if (Args.hasArg(options::OPT_fansi_escape_codes))
4911 CmdArgs.push_back("-fansi-escape-codes");
4912
Daniel Dunbardb097022009-06-08 21:13:54 +00004913 if (!Args.hasFlag(options::OPT_fshow_source_location,
4914 options::OPT_fno_show_source_location))
4915 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004916
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004917 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004918 true))
4919 CmdArgs.push_back("-fno-show-column");
4920
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004921 if (!Args.hasFlag(options::OPT_fspell_checking,
4922 options::OPT_fno_spell_checking))
4923 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004924
Chad Rosierc8e56e82012-12-05 21:08:21 +00004925 // -fno-asm-blocks is default.
4926 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4927 false))
4928 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004929
Steven Wucb0d13f2015-01-16 23:05:28 +00004930 // -fgnu-inline-asm is default.
4931 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4932 options::OPT_fno_gnu_inline_asm, true))
4933 CmdArgs.push_back("-fno-gnu-inline-asm");
4934
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004935 // Enable vectorization per default according to the optimization level
4936 // selected. For optimization levels that want vectorization we use the alias
4937 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004938 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004939 OptSpecifier VectorizeAliasOption =
4940 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004941 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004942 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004943 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004944
Chad Rosier136d67d2014-04-28 19:30:57 +00004945 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004946 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004947 OptSpecifier SLPVectAliasOption =
4948 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00004949 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004950 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004951 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004952
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004953 // -fno-slp-vectorize-aggressive is default.
4954 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004955 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004956 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004957
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004958 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4959 A->render(Args, CmdArgs);
4960
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004961 // -fdollars-in-identifiers default varies depending on platform and
4962 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004963 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004964 options::OPT_fno_dollars_in_identifiers)) {
4965 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004966 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004967 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004968 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004969 }
4970
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004971 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4972 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004973 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004974 options::OPT_fno_unit_at_a_time)) {
4975 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004976 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004977 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004978
Eli Friedman055c9702011-11-02 01:53:16 +00004979 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4980 options::OPT_fno_apple_pragma_pack, false))
4981 CmdArgs.push_back("-fapple-pragma-pack");
4982
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004983 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004984 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4985 // by default.
4986 if (getToolChain().getArch() == llvm::Triple::le32) {
4987 CmdArgs.push_back("-fno-math-builtin");
4988 }
4989
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004990// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4991//
4992// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004993#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004994 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004995 (getToolChain().getArch() == llvm::Triple::arm ||
4996 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004997 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4998 CmdArgs.push_back("-fno-builtin-strcat");
4999 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5000 CmdArgs.push_back("-fno-builtin-strcpy");
5001 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005002#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005003
Justin Bognera88f0122014-06-20 22:59:50 +00005004 // Enable rewrite includes if the user's asked for it or if we're generating
5005 // diagnostics.
5006 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5007 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005008 if (Args.hasFlag(options::OPT_frewrite_includes,
5009 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005010 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005011 CmdArgs.push_back("-frewrite-includes");
5012
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005013 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005014 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005015 options::OPT_traditional_cpp)) {
5016 if (isa<PreprocessJobAction>(JA))
5017 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005018 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005019 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005020 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005021
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005022 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005023 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005024
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005025 // Handle serialized diagnostics.
5026 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5027 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005028 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005029 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005030
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005031 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5032 CmdArgs.push_back("-fretain-comments-from-system-headers");
5033
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005034 // Forward -fcomment-block-commands to -cc1.
5035 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005036 // Forward -fparse-all-comments to -cc1.
5037 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005038
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005039 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5040 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005041 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005042 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5043 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005044
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005045 // We translate this by hand to the -cc1 argument, since nightly test uses
5046 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005047 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005048 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005049 } else
Sean Silva14facf32015-06-09 01:57:17 +00005050 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005051 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005052
Bob Wilson23a55f12014-12-21 07:00:00 +00005053 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005054 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5055 // by the frontend.
5056 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5057 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005058
Daniel Dunbard67a3222009-03-30 06:36:42 +00005059 if (Output.getType() == types::TY_Dependencies) {
5060 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005061 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005062 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005063 CmdArgs.push_back(Output.getFilename());
5064 } else {
5065 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005066 }
5067
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005068 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005069
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005070 if (Input.isFilename())
5071 CmdArgs.push_back(Input.getFilename());
5072 else
5073 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005074
Chris Lattnere9d7d782009-11-03 19:50:27 +00005075 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5076
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005077 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005078
5079 // Optionally embed the -cc1 level arguments into the debug info, for build
5080 // analysis.
5081 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005082 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005083 for (const auto &Arg : Args)
5084 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005085
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005086 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005087 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005088 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005089 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005090 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005091 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005092 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005093 }
5094 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005095 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005096 }
5097
Eric Christopherd3804002013-02-22 20:12:52 +00005098 // Add the split debug info name to the command lines here so we
5099 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005100 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005101 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5102 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005103 const char *SplitDwarfOut;
5104 if (SplitDwarf) {
5105 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005106 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005107 CmdArgs.push_back(SplitDwarfOut);
5108 }
5109
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005110 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5111 // Include them with -fcuda-include-gpubinary.
5112 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005113 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005114 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005115 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005116 }
5117
Eric Christopherd3804002013-02-22 20:12:52 +00005118 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005119 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005120 Output.getType() == types::TY_Object &&
5121 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005122 auto CLCommand =
5123 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005124 C.addCommand(llvm::make_unique<FallbackCommand>(
5125 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005126 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005127 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005128 }
5129
Eric Christopherf1545832013-02-22 23:50:16 +00005130 // Handle the debug info splitting at object creation time if we're
5131 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005132 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005133 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005134 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005135
Roman Divacky178e01602011-02-10 16:52:03 +00005136 if (Arg *A = Args.getLastArg(options::OPT_pg))
5137 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005138 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5139 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005140
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005141 // Claim some arguments which clang supports automatically.
5142
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005143 // -fpch-preprocess is used with gcc to add a special marker in the output to
5144 // include the PCH file. Clang's PTH solution is completely transparent, so we
5145 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005146 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005147
Daniel Dunbar17731772009-03-23 19:03:36 +00005148 // Claim some arguments which clang doesn't support, but we don't
5149 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005150 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5151 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005152
Rafael Espindolab0092d72013-09-04 19:37:35 +00005153 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005154 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005155}
5156
John McCall5fb5df92012-06-20 06:18:46 +00005157/// Add options related to the Objective-C runtime/ABI.
5158///
5159/// Returns true if the runtime is non-fragile.
5160ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5161 ArgStringList &cmdArgs,
5162 RewriteKind rewriteKind) const {
5163 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005164 Arg *runtimeArg =
5165 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5166 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005167
5168 // Just forward -fobjc-runtime= to the frontend. This supercedes
5169 // options about fragility.
5170 if (runtimeArg &&
5171 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5172 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005173 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005174 if (runtime.tryParse(value)) {
5175 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005176 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005177 }
5178
5179 runtimeArg->render(args, cmdArgs);
5180 return runtime;
5181 }
5182
5183 // Otherwise, we'll need the ABI "version". Version numbers are
5184 // slightly confusing for historical reasons:
5185 // 1 - Traditional "fragile" ABI
5186 // 2 - Non-fragile ABI, version 1
5187 // 3 - Non-fragile ABI, version 2
5188 unsigned objcABIVersion = 1;
5189 // If -fobjc-abi-version= is present, use that to set the version.
5190 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005191 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005192 if (value == "1")
5193 objcABIVersion = 1;
5194 else if (value == "2")
5195 objcABIVersion = 2;
5196 else if (value == "3")
5197 objcABIVersion = 3;
5198 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005199 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005200 } else {
5201 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005202 bool nonFragileABIIsDefault =
5203 (rewriteKind == RK_NonFragile ||
5204 (rewriteKind == RK_None &&
5205 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005206 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5207 options::OPT_fno_objc_nonfragile_abi,
5208 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005209// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005210#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5211 unsigned nonFragileABIVersion = 1;
5212#else
5213 unsigned nonFragileABIVersion = 2;
5214#endif
5215
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005216 if (Arg *abiArg =
5217 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005218 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005219 if (value == "1")
5220 nonFragileABIVersion = 1;
5221 else if (value == "2")
5222 nonFragileABIVersion = 2;
5223 else
5224 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005225 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005226 }
5227
5228 objcABIVersion = 1 + nonFragileABIVersion;
5229 } else {
5230 objcABIVersion = 1;
5231 }
5232 }
5233
5234 // We don't actually care about the ABI version other than whether
5235 // it's non-fragile.
5236 bool isNonFragile = objcABIVersion != 1;
5237
5238 // If we have no runtime argument, ask the toolchain for its default runtime.
5239 // However, the rewriter only really supports the Mac runtime, so assume that.
5240 ObjCRuntime runtime;
5241 if (!runtimeArg) {
5242 switch (rewriteKind) {
5243 case RK_None:
5244 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5245 break;
5246 case RK_Fragile:
5247 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5248 break;
5249 case RK_NonFragile:
5250 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5251 break;
5252 }
5253
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005254 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005255 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5256 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005257 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005258 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5259
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005260 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005261 } else {
5262 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5263 }
5264
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005265 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005266 } else {
5267 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005268 // Legacy behaviour is to target the gnustep runtime if we are i
5269 // non-fragile mode or the GCC runtime in fragile mode.
5270 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005271 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005272 else
5273 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005274 }
5275
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005276 cmdArgs.push_back(
5277 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005278 return runtime;
5279}
5280
Reid Klecknerc542d372014-06-27 17:02:02 +00005281static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5282 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5283 I += HaveDash;
5284 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005285}
Reid Klecknerc542d372014-06-27 17:02:02 +00005286
5287struct EHFlags {
5288 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5289 bool Synch;
5290 bool Asynch;
5291 bool NoExceptC;
5292};
5293
5294/// /EH controls whether to run destructor cleanups when exceptions are
5295/// thrown. There are three modifiers:
5296/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5297/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5298/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5299/// - c: Assume that extern "C" functions are implicitly noexcept. This
5300/// modifier is an optimization, so we ignore it for now.
5301/// The default is /EHs-c-, meaning cleanups are disabled.
5302static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5303 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005304
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005305 std::vector<std::string> EHArgs =
5306 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005307 for (auto EHVal : EHArgs) {
5308 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5309 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005310 case 'a':
5311 EH.Asynch = maybeConsumeDash(EHVal, I);
5312 continue;
5313 case 'c':
5314 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5315 continue;
5316 case 's':
5317 EH.Synch = maybeConsumeDash(EHVal, I);
5318 continue;
5319 default:
5320 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005321 }
5322 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5323 break;
5324 }
5325 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005326
Reid Kleckner5c6efed2015-07-14 18:16:48 +00005327 // FIXME: Disable C++ EH completely, until it becomes more reliable. Users
5328 // can use -Xclang to manually enable C++ EH until then.
5329 EH = EHFlags();
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005330
Reid Klecknerc542d372014-06-27 17:02:02 +00005331 return EH;
5332}
5333
Hans Wennborg75958c42013-08-08 00:17:41 +00005334void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5335 unsigned RTOptionID = options::OPT__SLASH_MT;
5336
Hans Wennborgf1a74252013-09-10 20:18:04 +00005337 if (Args.hasArg(options::OPT__SLASH_LDd))
5338 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5339 // but defining _DEBUG is sticky.
5340 RTOptionID = options::OPT__SLASH_MTd;
5341
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005342 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005343 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005344
David Majnemere2afb472015-07-24 06:49:13 +00005345 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005346 switch (RTOptionID) {
5347 case options::OPT__SLASH_MD:
5348 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005349 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005350 CmdArgs.push_back("-D_MT");
5351 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005352 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005353 break;
5354 case options::OPT__SLASH_MDd:
5355 CmdArgs.push_back("-D_DEBUG");
5356 CmdArgs.push_back("-D_MT");
5357 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005358 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005359 break;
5360 case options::OPT__SLASH_MT:
5361 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005362 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005363 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005364 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005365 break;
5366 case options::OPT__SLASH_MTd:
5367 CmdArgs.push_back("-D_DEBUG");
5368 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005369 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005370 break;
5371 default:
5372 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005373 }
5374
David Majnemere2afb472015-07-24 06:49:13 +00005375 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5376 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5377 } else {
5378 CmdArgs.push_back(FlagForCRT.data());
5379
5380 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5381 // users want. The /Za flag to cl.exe turns this off, but it's not
5382 // implemented in clang.
5383 CmdArgs.push_back("--dependent-lib=oldnames");
5384 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005385
Hans Wennborg8858a032014-07-21 23:42:07 +00005386 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5387 // would produce interleaved output, so ignore /showIncludes in such cases.
5388 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5389 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5390 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005391
David Majnemerf6072342014-07-01 22:24:56 +00005392 // This controls whether or not we emit RTTI data for polymorphic types.
5393 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5394 /*default=*/false))
5395 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005396
Reid Kleckner124955a2015-08-05 18:51:13 +00005397 // Emit CodeView if -Z7 is present.
5398 bool EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
5399 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5400 // If we are emitting CV but not DWARF, don't build information that LLVM
5401 // can't yet process.
5402 if (EmitCodeView && !EmitDwarf)
5403 CmdArgs.push_back("-gline-tables-only");
5404 if (EmitCodeView)
5405 CmdArgs.push_back("-gcodeview");
5406
Reid Klecknerc542d372014-06-27 17:02:02 +00005407 const Driver &D = getToolChain().getDriver();
5408 EHFlags EH = parseClangCLEHFlags(D, Args);
5409 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005410 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005411 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005412 CmdArgs.push_back("-fexceptions");
5413 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005414
Hans Wennborge50cec32014-06-13 20:59:54 +00005415 // /EP should expand to -E -P.
5416 if (Args.hasArg(options::OPT__SLASH_EP)) {
5417 CmdArgs.push_back("-E");
5418 CmdArgs.push_back("-P");
5419 }
5420
David Majnemera5b195a2015-02-14 01:35:12 +00005421 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005422 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5423 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005424 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5425 else
5426 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5427
5428 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5429 VolatileOptionID = A->getOption().getID();
5430
5431 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5432 CmdArgs.push_back("-fms-volatile");
5433
David Majnemer86c318f2014-02-11 21:05:00 +00005434 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5435 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5436 if (MostGeneralArg && BestCaseArg)
5437 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5438 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5439
5440 if (MostGeneralArg) {
5441 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5442 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5443 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5444
5445 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5446 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5447 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5448 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5449 << FirstConflict->getAsString(Args)
5450 << SecondConflict->getAsString(Args);
5451
5452 if (SingleArg)
5453 CmdArgs.push_back("-fms-memptr-rep=single");
5454 else if (MultipleArg)
5455 CmdArgs.push_back("-fms-memptr-rep=multiple");
5456 else
5457 CmdArgs.push_back("-fms-memptr-rep=virtual");
5458 }
5459
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005460 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5461 A->render(Args, CmdArgs);
5462
Hans Wennborg81f74482013-09-10 01:07:07 +00005463 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5464 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005465 if (Args.hasArg(options::OPT__SLASH_fallback))
5466 CmdArgs.push_back("msvc-fallback");
5467 else
5468 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005469 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005470}
5471
Douglas Katzman95354292015-06-23 20:42:09 +00005472visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005473 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005474 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005475 return CLFallback.get();
5476}
5477
Daniel Sanders7f933f42015-01-30 17:35:23 +00005478void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5479 ArgStringList &CmdArgs) const {
5480 StringRef CPUName;
5481 StringRef ABIName;
5482 const llvm::Triple &Triple = getToolChain().getTriple();
5483 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5484
5485 CmdArgs.push_back("-target-abi");
5486 CmdArgs.push_back(ABIName.data());
5487}
5488
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005489void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005490 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005491 const ArgList &Args,
5492 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005493 ArgStringList CmdArgs;
5494
5495 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5496 const InputInfo &Input = Inputs[0];
5497
James Y Knight2db38f32015-08-15 03:45:25 +00005498 std::string TripleStr =
5499 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5500 const llvm::Triple Triple(TripleStr);
5501
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005502 // Don't warn about "clang -w -c foo.s"
5503 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005504 // and "clang -emit-llvm -c foo.s"
5505 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005506
Rafael Espindola577637a2015-01-03 00:06:04 +00005507 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005508
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005509 // Invoke ourselves in -cc1as mode.
5510 //
5511 // FIXME: Implement custom jobs for internal actions.
5512 CmdArgs.push_back("-cc1as");
5513
5514 // Add the "effective" target triple.
5515 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005516 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5517
5518 // Set the output mode, we currently only expect to be used as a real
5519 // assembler.
5520 CmdArgs.push_back("-filetype");
5521 CmdArgs.push_back("obj");
5522
Eric Christopher45f2e712012-12-18 00:31:10 +00005523 // Set the main file name, so that debug info works even with
5524 // -save-temps or preprocessed assembly.
5525 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005526 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005527
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005528 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005529 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005530 if (!CPU.empty()) {
5531 CmdArgs.push_back("-target-cpu");
5532 CmdArgs.push_back(Args.MakeArgString(CPU));
5533 }
5534
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005535 // Add the target features
5536 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005537 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005538
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005539 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005540 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005541
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005542 // Pass along any -I options so we get proper .include search paths.
5543 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5544
Eric Christopherfc3ee562012-01-10 00:38:01 +00005545 // Determine the original source input.
5546 const Action *SourceAction = &JA;
5547 while (SourceAction->getKind() != Action::InputClass) {
5548 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5549 SourceAction = SourceAction->getInputs()[0];
5550 }
5551
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005552 // Forward -g and handle debug info related flags, assuming we are dealing
5553 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005554 if (SourceAction->getType() == types::TY_Asm ||
5555 SourceAction->getType() == types::TY_PP_Asm) {
5556 Args.ClaimAllArgs(options::OPT_g_Group);
5557 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5558 if (!A->getOption().matches(options::OPT_g0))
5559 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005560
Douglas Katzman553927a2015-09-14 20:31:28 +00005561 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
5562 options::OPT_gdwarf_4))
5563 A->render(Args, CmdArgs);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005564
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005565 // Add the -fdebug-compilation-dir flag if needed.
5566 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005567
5568 // Set the AT_producer to the clang version when using the integrated
5569 // assembler on assembly source files.
5570 CmdArgs.push_back("-dwarf-debug-producer");
5571 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005572
5573 // And pass along -I options
5574 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005575 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005576
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005577 // Handle -fPIC et al -- the relocation-model affects the assembler
5578 // for some targets.
5579 llvm::Reloc::Model RelocationModel;
5580 unsigned PICLevel;
5581 bool IsPIE;
5582 std::tie(RelocationModel, PICLevel, IsPIE) =
5583 ParsePICArgs(getToolChain(), Triple, Args);
5584
5585 const char *RMName = RelocationModelName(RelocationModel);
5586 if (RMName) {
5587 CmdArgs.push_back("-mrelocation-model");
5588 CmdArgs.push_back(RMName);
5589 }
5590
Kevin Enderby292dc082011-12-22 19:31:58 +00005591 // Optionally embed the -cc1as level arguments into the debug info, for build
5592 // analysis.
5593 if (getToolChain().UseDwarfDebugFlags()) {
5594 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005595 for (const auto &Arg : Args)
5596 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005597
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005598 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005599 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5600 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005601 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005602 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005603 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005604 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005605 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005606 }
5607 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005608 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005609 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005610
5611 // FIXME: Add -static support, once we have it.
5612
Daniel Sanders7f933f42015-01-30 17:35:23 +00005613 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005614 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005615 default:
5616 break;
5617
5618 case llvm::Triple::mips:
5619 case llvm::Triple::mipsel:
5620 case llvm::Triple::mips64:
5621 case llvm::Triple::mips64el:
5622 AddMIPSTargetArgs(Args, CmdArgs);
5623 break;
5624 }
5625
David Blaikie372d9502014-01-17 03:17:40 +00005626 // Consume all the warning flags. Usually this would be handled more
5627 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5628 // doesn't handle that so rather than warning about unused flags that are
5629 // actually used, we'll lie by omission instead.
5630 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005631 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5632 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005633
David Blaikie9260ed62013-07-25 21:19:01 +00005634 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5635 getToolChain().getDriver());
5636
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005637 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005638
5639 assert(Output.isFilename() && "Unexpected lipo output.");
5640 CmdArgs.push_back("-o");
5641 CmdArgs.push_back(Output.getFilename());
5642
Daniel Dunbarb440f562010-08-02 02:38:21 +00005643 assert(Input.isFilename() && "Invalid input.");
5644 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005645
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005646 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005647 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005648
5649 // Handle the debug info splitting at object creation time if we're
5650 // creating an object.
5651 // TODO: Currently only works on linux with newer objcopy.
5652 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005653 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005654 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005655 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005656}
5657
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005658void GnuTool::anchor() {}
5659
Daniel Dunbara3246a02009-03-18 08:07:30 +00005660void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005661 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005662 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005663 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005664 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005665 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005666
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005667 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005668 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005669 // Don't forward any -g arguments to assembly steps.
5670 if (isa<AssembleJobAction>(JA) &&
5671 A->getOption().matches(options::OPT_g_Group))
5672 continue;
5673
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005674 // Don't forward any -W arguments to assembly and link steps.
5675 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5676 A->getOption().matches(options::OPT_W_Group))
5677 continue;
5678
Daniel Dunbar2da02722009-03-19 07:55:12 +00005679 // It is unfortunate that we have to claim here, as this means
5680 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005681 // platforms using a generic gcc, even if we are just using gcc
5682 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005683 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005684 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005685 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005686 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005687
Daniel Dunbar4e295052010-01-25 22:35:08 +00005688 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005689
5690 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005691 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005692 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005693 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005694 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005695 }
5696
Daniel Dunbar5716d872009-05-02 21:41:52 +00005697 // Try to force gcc to match the tool chain we want, if we recognize
5698 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005699 //
5700 // FIXME: The triple class should directly provide the information we want
5701 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005702 switch (getToolChain().getArch()) {
5703 default:
5704 break;
5705 case llvm::Triple::x86:
5706 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005707 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005708 break;
5709 case llvm::Triple::x86_64:
5710 case llvm::Triple::ppc64:
5711 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005712 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005713 break;
5714 case llvm::Triple::sparcel:
5715 CmdArgs.push_back("-EL");
5716 break;
5717 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005718
Daniel Dunbarb440f562010-08-02 02:38:21 +00005719 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005720 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005721 CmdArgs.push_back(Output.getFilename());
5722 } else {
5723 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005724 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005725 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005726
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005727 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005728
5729 // Only pass -x if gcc will understand it; otherwise hope gcc
5730 // understands the suffix correctly. The main use case this would go
5731 // wrong in is for linker inputs if they happened to have an odd
5732 // suffix; really the only way to get this to happen is a command
5733 // like '-x foobar a.c' which will treat a.c like a linker input.
5734 //
5735 // FIXME: For the linker case specifically, can we safely convert
5736 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005737 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005738 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005739 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5740 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005741 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005742 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005743 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005744 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005745 else if (II.getType() == types::TY_ModuleFile)
5746 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005747 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005748
Daniel Dunbara3246a02009-03-18 08:07:30 +00005749 if (types::canTypeBeUserSpecified(II.getType())) {
5750 CmdArgs.push_back("-x");
5751 CmdArgs.push_back(types::getTypeName(II.getType()));
5752 }
5753
Daniel Dunbarb440f562010-08-02 02:38:21 +00005754 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005755 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005756 else {
5757 const Arg &A = II.getInputArg();
5758
5759 // Reverse translate some rewritten options.
5760 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5761 CmdArgs.push_back("-lstdc++");
5762 continue;
5763 }
5764
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005765 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005766 A.render(Args, CmdArgs);
5767 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005768 }
5769
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005770 const std::string customGCCName = D.getCCCGenericGCCName();
5771 const char *GCCName;
5772 if (!customGCCName.empty())
5773 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005774 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005775 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005776 } else
5777 GCCName = "gcc";
5778
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005779 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005780 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005781}
5782
Douglas Katzman95354292015-06-23 20:42:09 +00005783void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5784 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005785 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005786}
5787
Douglas Katzman95354292015-06-23 20:42:09 +00005788void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5789 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005790 const Driver &D = getToolChain().getDriver();
5791
Eric Christophercc7ff502015-01-29 00:56:17 +00005792 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005793 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005794 case types::TY_LLVM_IR:
5795 case types::TY_LTO_IR:
5796 case types::TY_LLVM_BC:
5797 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005798 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005799 break;
5800 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005801 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005802 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005803 case types::TY_Nothing:
5804 CmdArgs.push_back("-fsyntax-only");
5805 break;
5806 default:
5807 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005808 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005809}
5810
Douglas Katzman95354292015-06-23 20:42:09 +00005811void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5812 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005813 // The types are (hopefully) good enough.
5814}
5815
Tony Linthicum76329bf2011-12-12 21:14:55 +00005816// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005817void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5818 ArgStringList &CmdArgs) const {}
5819void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5820 const InputInfo &Output,
5821 const InputInfoList &Inputs,
5822 const ArgList &Args,
5823 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005824 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005825
5826 const Driver &D = getToolChain().getDriver();
5827 ArgStringList CmdArgs;
5828
5829 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005830 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005831 CmdArgs.push_back(Args.MakeArgString(MarchString));
5832
5833 RenderExtraToolArgs(JA, CmdArgs);
5834
5835 if (Output.isFilename()) {
5836 CmdArgs.push_back("-o");
5837 CmdArgs.push_back(Output.getFilename());
5838 } else {
5839 assert(Output.isNothing() && "Unexpected output");
5840 CmdArgs.push_back("-fsyntax-only");
5841 }
5842
Douglas Katzman54366072015-07-27 16:53:08 +00005843 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005844 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005845
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005846 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005847
Tony Linthicum76329bf2011-12-12 21:14:55 +00005848 // Only pass -x if gcc will understand it; otherwise hope gcc
5849 // understands the suffix correctly. The main use case this would go
5850 // wrong in is for linker inputs if they happened to have an odd
5851 // suffix; really the only way to get this to happen is a command
5852 // like '-x foobar a.c' which will treat a.c like a linker input.
5853 //
5854 // FIXME: For the linker case specifically, can we safely convert
5855 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005856 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005857 // Don't try to pass LLVM or AST inputs to a generic gcc.
5858 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5859 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5860 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005861 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005862 else if (II.getType() == types::TY_AST)
5863 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005864 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005865 else if (II.getType() == types::TY_ModuleFile)
5866 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005867 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005868
5869 if (II.isFilename())
5870 CmdArgs.push_back(II.getFilename());
5871 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005872 // Don't render as input, we need gcc to do the translations.
5873 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005874 II.getInputArg().render(Args, CmdArgs);
5875 }
5876
5877 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005878 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005879 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005880}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005881
Douglas Katzman95354292015-06-23 20:42:09 +00005882void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5883 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005884 // The types are (hopefully) good enough.
5885}
5886
Douglas Katzman54366072015-07-27 16:53:08 +00005887static void
5888constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5889 const toolchains::HexagonToolChain &ToolChain,
5890 const InputInfo &Output, const InputInfoList &Inputs,
5891 const ArgList &Args, ArgStringList &CmdArgs,
5892 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005893
Matthew Curtise689b052012-12-06 15:46:07 +00005894 const Driver &D = ToolChain.getDriver();
5895
Matthew Curtise689b052012-12-06 15:46:07 +00005896 //----------------------------------------------------------------------------
5897 //
5898 //----------------------------------------------------------------------------
5899 bool hasStaticArg = Args.hasArg(options::OPT_static);
5900 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005901 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005902 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5903 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5904 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005905 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005906 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005907
Matthew Curtise689b052012-12-06 15:46:07 +00005908 //----------------------------------------------------------------------------
5909 // Silence warnings for various options
5910 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005911
Matthew Curtise689b052012-12-06 15:46:07 +00005912 Args.ClaimAllArgs(options::OPT_g_Group);
5913 Args.ClaimAllArgs(options::OPT_emit_llvm);
5914 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5915 // handled somewhere else.
5916 Args.ClaimAllArgs(options::OPT_static_libgcc);
5917
5918 //----------------------------------------------------------------------------
5919 //
5920 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005921 for (const auto &Opt : ToolChain.ExtraOpts)
5922 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005923
Douglas Katzman54366072015-07-27 16:53:08 +00005924 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00005925 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005926
Matthew Curtise689b052012-12-06 15:46:07 +00005927 if (buildingLib) {
5928 CmdArgs.push_back("-shared");
5929 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5930 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005931 }
5932
Matthew Curtise689b052012-12-06 15:46:07 +00005933 if (hasStaticArg)
5934 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005935
Matthew Curtise8f80a12012-12-06 17:49:03 +00005936 if (buildPIE && !buildingLib)
5937 CmdArgs.push_back("-pie");
5938
Douglas Katzman54366072015-07-27 16:53:08 +00005939 if (const char *v =
5940 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005941 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00005942 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005943 }
5944
Matthew Curtise689b052012-12-06 15:46:07 +00005945 //----------------------------------------------------------------------------
5946 //
5947 //----------------------------------------------------------------------------
5948 CmdArgs.push_back("-o");
5949 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005950
Matthew Curtise689b052012-12-06 15:46:07 +00005951 const std::string MarchSuffix = "/" + MarchString;
5952 const std::string G0Suffix = "/G0";
5953 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005954 const std::string RootDir =
Douglas Katzman54366072015-07-27 16:53:08 +00005955 toolchains::HexagonToolChain::GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005956 const std::string StartFilesDir =
5957 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005958
5959 //----------------------------------------------------------------------------
5960 // moslib
5961 //----------------------------------------------------------------------------
5962 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005963 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005964
Sean Silva14facf32015-06-09 01:57:17 +00005965 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5966 A->claim();
5967 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005968 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005969 }
Matthew Curtise689b052012-12-06 15:46:07 +00005970 if (oslibs.empty()) {
5971 oslibs.push_back("standalone");
5972 hasStandalone = true;
5973 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005974
Matthew Curtise689b052012-12-06 15:46:07 +00005975 //----------------------------------------------------------------------------
5976 // Start Files
5977 //----------------------------------------------------------------------------
5978 if (incStdLib && incStartFiles) {
5979
5980 if (!buildingLib) {
5981 if (hasStandalone) {
5982 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005983 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00005984 }
5985 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5986 }
5987 std::string initObj = useShared ? "/initS.o" : "/init.o";
5988 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5989 }
5990
5991 //----------------------------------------------------------------------------
5992 // Library Search Paths
5993 //----------------------------------------------------------------------------
5994 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005995 for (const auto &LibPath : LibPaths)
5996 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005997
5998 //----------------------------------------------------------------------------
5999 //
6000 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006001 Args.AddAllArgs(CmdArgs,
6002 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6003 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006004
6005 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6006
6007 //----------------------------------------------------------------------------
6008 // Libraries
6009 //----------------------------------------------------------------------------
6010 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006011 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00006012 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6013 CmdArgs.push_back("-lm");
6014 }
6015
6016 CmdArgs.push_back("--start-group");
6017
6018 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00006019 for (const std::string &Lib : oslibs)
6020 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006021 CmdArgs.push_back("-lc");
6022 }
6023 CmdArgs.push_back("-lgcc");
6024
6025 CmdArgs.push_back("--end-group");
6026 }
6027
6028 //----------------------------------------------------------------------------
6029 // End files
6030 //----------------------------------------------------------------------------
6031 if (incStdLib && incStartFiles) {
6032 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
6033 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
6034 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006035}
6036
Douglas Katzman95354292015-06-23 20:42:09 +00006037void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6038 const InputInfo &Output,
6039 const InputInfoList &Inputs,
6040 const ArgList &Args,
6041 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006042
Douglas Katzman54366072015-07-27 16:53:08 +00006043 const toolchains::HexagonToolChain &ToolChain =
6044 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006045
6046 ArgStringList CmdArgs;
6047 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
6048 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006049
6050 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00006051 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006052 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006053}
6054// Hexagon tools end.
6055
Tom Stellard8fa33092015-07-18 01:49:05 +00006056void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6057 const InputInfo &Output,
6058 const InputInfoList &Inputs,
6059 const ArgList &Args,
6060 const char *LinkingOutput) const {
6061
6062 std::string Linker = getToolChain().GetProgramPath(getShortName());
6063 ArgStringList CmdArgs;
6064 CmdArgs.push_back("-flavor");
6065 CmdArgs.push_back("gnu");
6066 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006067 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006068 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6069 CmdArgs.push_back("-o");
6070 CmdArgs.push_back(Output.getFilename());
6071 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6072 CmdArgs, Inputs));
6073}
6074// AMDGPU tools end.
6075
Renato Golin7c542b42015-07-27 23:44:45 +00006076const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006077 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006078 if (!Arch.empty())
6079 MArch = Arch;
6080 else
Bernard Ogden31561762013-12-12 13:27:11 +00006081 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006082 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00006083
6084 // Handle -march=native.
6085 if (MArch == "native") {
6086 std::string CPU = llvm::sys::getHostCPUName();
6087 if (CPU != "generic") {
6088 // Translate the native cpu into the architecture suffix for that CPU.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006089 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
John Brawn94fd9632015-05-21 12:19:49 +00006090 // If there is no valid architecture suffix for this CPU we don't know how
6091 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006092 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006093 MArch = "";
6094 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006095 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006096 }
6097 }
6098
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006099 return MArch;
6100}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006101
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006102/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006103StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006104 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006105 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6106 // here means an -march=native that we can't handle, so instead return no CPU.
6107 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006108 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006109
John Brawna95c1a82015-05-08 12:52:18 +00006110 // We need to return an empty string here on invalid MArch values as the
6111 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006112 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006113}
6114
6115/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006116std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006117 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006118 // FIXME: Warn on inconsistent use of -mcpu and -march.
6119 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006120 if (!CPU.empty()) {
6121 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006122 // Handle -mcpu=native.
6123 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006124 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006125 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006126 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006127 }
6128
Renato Goline17c5802015-07-27 23:44:42 +00006129 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006130}
6131
6132/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006133/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006134// FIXME: This is redundant with -mcpu, why does LLVM use this.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006135StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00006136 if (CPU == "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006137 return llvm::ARM::getSubArch(
6138 llvm::ARM::parseArch(Arch));
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006139
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006140 unsigned ArchKind = llvm::ARM::parseCPUArch(CPU);
Renato Golin3c007252015-05-28 15:05:53 +00006141 if (ArchKind == llvm::ARM::AK_INVALID)
6142 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006143 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006144}
6145
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006146void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006147 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006148 if (Args.hasArg(options::OPT_r))
6149 return;
6150
John Brawn94fd9632015-05-21 12:19:49 +00006151 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6152 // to generate BE-8 executables.
6153 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6154 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006155}
6156
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006157mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
6158 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6159 .Case("mips1", NanLegacy)
6160 .Case("mips2", NanLegacy)
6161 .Case("mips3", NanLegacy)
6162 .Case("mips4", NanLegacy)
6163 .Case("mips5", NanLegacy)
6164 .Case("mips32", NanLegacy)
6165 .Case("mips32r2", NanLegacy)
6166 .Case("mips32r3", NanLegacy | Nan2008)
6167 .Case("mips32r5", NanLegacy | Nan2008)
6168 .Case("mips32r6", Nan2008)
6169 .Case("mips64", NanLegacy)
6170 .Case("mips64r2", NanLegacy)
6171 .Case("mips64r3", NanLegacy | Nan2008)
6172 .Case("mips64r5", NanLegacy | Nan2008)
6173 .Case("mips64r6", Nan2008)
6174 .Default(NanLegacy);
6175}
6176
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006177bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6178 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6179 return A && (A->getValue() == StringRef(Value));
6180}
6181
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006182bool mips::isUCLibc(const ArgList &Args) {
6183 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006184 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006185}
6186
Daniel Sanders2bf13662014-07-10 14:40:57 +00006187bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006188 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6189 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006190 .Case("2008", true)
6191 .Case("legacy", false)
6192 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006193
6194 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006195 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006196 .Cases("mips32r6", "mips64r6", true)
6197 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006198
6199 return false;
6200}
6201
Daniel Sanders379d44b2014-07-16 11:52:23 +00006202bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Toma Tabacu94ea6862015-06-16 13:54:13 +00006203 StringRef ABIName, StringRef FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006204 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006205 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006206 return false;
6207
6208 if (ABIName != "32")
6209 return false;
6210
Toma Tabacu94ea6862015-06-16 13:54:13 +00006211 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6212 // present.
6213 if (FloatABI == "soft")
6214 return false;
6215
Daniel Sanders379d44b2014-07-16 11:52:23 +00006216 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006217 .Cases("mips2", "mips3", "mips4", "mips5", true)
6218 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6219 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6220 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006221}
6222
Toma Tabacu94ea6862015-06-16 13:54:13 +00006223bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6224 StringRef CPUName, StringRef ABIName,
6225 StringRef FloatABI) {
6226 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6227
6228 // FPXX shouldn't be used if -msingle-float is present.
6229 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6230 options::OPT_mdouble_float))
6231 if (A->getOption().matches(options::OPT_msingle_float))
6232 UseFPXX = false;
6233
6234 return UseFPXX;
6235}
6236
Tim Northover157d9112014-01-16 08:48:16 +00006237llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006238 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6239 // archs which Darwin doesn't use.
6240
6241 // The matching this routine does is fairly pointless, since it is neither the
6242 // complete architecture list, nor a reasonable subset. The problem is that
6243 // historically the driver driver accepts this and also ties its -march=
6244 // handling to the architecture name, so we need to be careful before removing
6245 // support for it.
6246
6247 // This code must be kept in sync with Clang's Darwin specific argument
6248 // translation.
6249
6250 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006251 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6252 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6253 .Case("ppc64", llvm::Triple::ppc64)
6254 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6255 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6256 llvm::Triple::x86)
6257 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6258 // This is derived from the driver driver.
6259 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6260 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6261 .Cases("armv7s", "xscale", llvm::Triple::arm)
6262 .Case("arm64", llvm::Triple::aarch64)
6263 .Case("r600", llvm::Triple::r600)
6264 .Case("amdgcn", llvm::Triple::amdgcn)
6265 .Case("nvptx", llvm::Triple::nvptx)
6266 .Case("nvptx64", llvm::Triple::nvptx64)
6267 .Case("amdil", llvm::Triple::amdil)
6268 .Case("spir", llvm::Triple::spir)
6269 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006270}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006271
Tim Northover157d9112014-01-16 08:48:16 +00006272void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006273 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006274 T.setArch(Arch);
6275
6276 if (Str == "x86_64h")
6277 T.setArchName(Str);
6278 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6279 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006280 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006281 }
6282}
6283
Bob Wilsondecc03e2012-11-23 06:14:39 +00006284const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006285 const InputInfo &Input) {
6286 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006287}
6288
Bob Wilsondecc03e2012-11-23 06:14:39 +00006289const char *Clang::getBaseInputStem(const ArgList &Args,
6290 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006291 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006292
Chris Lattner906bb902011-01-16 08:14:11 +00006293 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006294 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006295
6296 return Str;
6297}
6298
Bob Wilsondecc03e2012-11-23 06:14:39 +00006299const char *Clang::getDependencyFileName(const ArgList &Args,
6300 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006301 // FIXME: Think about this more.
6302 std::string Res;
6303
6304 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006305 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006306 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006307 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006308 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006309 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006310 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006311}
6312
Douglas Katzman95354292015-06-23 20:42:09 +00006313void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6314 const InputInfo &Output,
6315 const InputInfoList &Inputs,
6316 const ArgList &Args,
6317 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006318 const ToolChain &ToolChain = getToolChain();
6319 const Driver &D = ToolChain.getDriver();
6320 ArgStringList CmdArgs;
6321
6322 // Silence warning for "clang -g foo.o -o foo"
6323 Args.ClaimAllArgs(options::OPT_g_Group);
6324 // and "clang -emit-llvm foo.o -o foo"
6325 Args.ClaimAllArgs(options::OPT_emit_llvm);
6326 // and for "clang -w foo.o -o foo". Other warning options are already
6327 // handled somewhere else.
6328 Args.ClaimAllArgs(options::OPT_w);
6329
6330 if (!D.SysRoot.empty())
6331 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6332
6333 // CloudABI only supports static linkage.
6334 CmdArgs.push_back("-Bstatic");
6335 CmdArgs.push_back("--eh-frame-hdr");
6336 CmdArgs.push_back("--gc-sections");
6337
6338 if (Output.isFilename()) {
6339 CmdArgs.push_back("-o");
6340 CmdArgs.push_back(Output.getFilename());
6341 } else {
6342 assert(Output.isNothing() && "Invalid output.");
6343 }
6344
6345 if (!Args.hasArg(options::OPT_nostdlib) &&
6346 !Args.hasArg(options::OPT_nostartfiles)) {
6347 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6348 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6349 }
6350
6351 Args.AddAllArgs(CmdArgs, options::OPT_L);
6352 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6353 for (const auto &Path : Paths)
6354 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006355 Args.AddAllArgs(CmdArgs,
6356 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6357 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006358
Alexey Samsonov907880e2015-06-19 19:57:46 +00006359 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006360 AddGoldPlugin(ToolChain, Args, CmdArgs);
6361
6362 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6363
6364 if (!Args.hasArg(options::OPT_nostdlib) &&
6365 !Args.hasArg(options::OPT_nodefaultlibs)) {
6366 if (D.CCCIsCXX())
6367 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6368 CmdArgs.push_back("-lc");
6369 CmdArgs.push_back("-lcompiler_rt");
6370 }
6371
6372 if (!Args.hasArg(options::OPT_nostdlib) &&
6373 !Args.hasArg(options::OPT_nostartfiles))
6374 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6375
6376 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006377 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006378}
6379
Douglas Katzman95354292015-06-23 20:42:09 +00006380void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6381 const InputInfo &Output,
6382 const InputInfoList &Inputs,
6383 const ArgList &Args,
6384 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006385 ArgStringList CmdArgs;
6386
6387 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6388 const InputInfo &Input = Inputs[0];
6389
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006390 // Determine the original source input.
6391 const Action *SourceAction = &JA;
6392 while (SourceAction->getKind() != Action::InputClass) {
6393 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6394 SourceAction = SourceAction->getInputs()[0];
6395 }
6396
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006397 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006398 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006399 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6400 // FIXME: at run-time detect assembler capabilities or rely on version
6401 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006402 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006403 const llvm::Triple &T(getToolChain().getTriple());
6404 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006405 CmdArgs.push_back("-Q");
6406 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006407
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006408 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006409 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006410 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006411 if (Args.hasArg(options::OPT_gstabs))
6412 CmdArgs.push_back("--gstabs");
6413 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006414 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006415 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006416
Daniel Dunbarbe220842009-03-20 16:06:39 +00006417 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006418 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006419
Daniel Dunbar6d484762010-07-22 01:47:22 +00006420 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006421 if (getToolChain().getArch() == llvm::Triple::x86 ||
6422 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006423 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6424 CmdArgs.push_back("-force_cpusubtype_ALL");
6425
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006426 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006427 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006428 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006429 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006430 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006431 CmdArgs.push_back("-static");
6432
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006433 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006434
6435 assert(Output.isFilename() && "Unexpected lipo output.");
6436 CmdArgs.push_back("-o");
6437 CmdArgs.push_back(Output.getFilename());
6438
Daniel Dunbarb440f562010-08-02 02:38:21 +00006439 assert(Input.isFilename() && "Invalid input.");
6440 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006441
6442 // asm_final spec is empty.
6443
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006444 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006445 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006446}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006447
Tim Northover157d9112014-01-16 08:48:16 +00006448void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006449
Tim Northover157d9112014-01-16 08:48:16 +00006450void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6451 ArgStringList &CmdArgs) const {
6452 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006453
Daniel Dunbarc1964212009-03-26 16:23:12 +00006454 // Derived from darwin_arch spec.
6455 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006456 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006457
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006458 // FIXME: Is this needed anymore?
6459 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006460 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006461}
6462
Douglas Katzman95354292015-06-23 20:42:09 +00006463bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006464 // We only need to generate a temp path for LTO if we aren't compiling object
6465 // files. When compiling source files, we run 'dsymutil' after linking. We
6466 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006467 for (const auto &Input : Inputs)
6468 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006469 return true;
6470
6471 return false;
6472}
6473
Douglas Katzman95354292015-06-23 20:42:09 +00006474void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6475 ArgStringList &CmdArgs,
6476 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006477 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006478 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006479
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006480 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006481 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6482 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006483 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6484 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006485 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006486 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006487 }
6488
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006489 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006490 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006491 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6492 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006493
Bob Wilson3d27dad2013-08-02 22:25:34 +00006494 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6495 CmdArgs.push_back("-export_dynamic");
6496
Bob Wilsonb111ec92015-03-02 19:01:14 +00006497 // If we are using App Extension restrictions, pass a flag to the linker
6498 // telling it that the compiled code has been audited.
6499 if (Args.hasFlag(options::OPT_fapplication_extension,
6500 options::OPT_fno_application_extension, false))
6501 CmdArgs.push_back("-application_extension");
6502
Bill Wendling313b6bf2012-11-16 23:03:00 +00006503 // If we are using LTO, then automatically create a temporary file path for
6504 // the linker to use, so that it's lifetime will extend past a possible
6505 // dsymutil step.
Alexey Samsonov907880e2015-06-19 19:57:46 +00006506 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006507 const char *TmpPath = C.getArgs().MakeArgString(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006508 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Bill Wendling313b6bf2012-11-16 23:03:00 +00006509 C.addTempFile(TmpPath);
6510 CmdArgs.push_back("-object_path_lto");
6511 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006512 }
6513
Daniel Dunbarc1964212009-03-26 16:23:12 +00006514 // Derived from the "link" spec.
6515 Args.AddAllArgs(CmdArgs, options::OPT_static);
6516 if (!Args.hasArg(options::OPT_static))
6517 CmdArgs.push_back("-dynamic");
6518 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6519 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6520 // here. How do we wish to handle such things?
6521 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006522
Daniel Dunbarc1964212009-03-26 16:23:12 +00006523 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006524 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006525 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006526 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006527
6528 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6529 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6530 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6531
6532 Arg *A;
6533 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6534 (A = Args.getLastArg(options::OPT_current__version)) ||
6535 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006536 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6537 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006538
6539 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6540 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6541 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6542 } else {
6543 CmdArgs.push_back("-dylib");
6544
6545 Arg *A;
6546 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6547 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6548 (A = Args.getLastArg(options::OPT_client__name)) ||
6549 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6550 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6551 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006552 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6553 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006554
Daniel Dunbarc1964212009-03-26 16:23:12 +00006555 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6556 "-dylib_compatibility_version");
6557 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6558 "-dylib_current_version");
6559
Tim Northover157d9112014-01-16 08:48:16 +00006560 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006561
6562 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6563 "-dylib_install_name");
6564 }
6565
6566 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6567 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6568 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006569 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006570 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006571 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6572 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6573 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6574 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6575 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6576 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006577 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006578 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6579 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6580 Args.AddAllArgs(CmdArgs, options::OPT_init);
6581
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006582 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006583 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006584
Daniel Dunbarc1964212009-03-26 16:23:12 +00006585 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6586 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6587 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6588 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6589 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006590
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006591 if (const Arg *A =
6592 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6593 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006594 if (A->getOption().matches(options::OPT_fpie) ||
6595 A->getOption().matches(options::OPT_fPIE))
6596 CmdArgs.push_back("-pie");
6597 else
6598 CmdArgs.push_back("-no_pie");
6599 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006600
6601 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6602 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6603 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6604 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6605 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6606 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6607 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6608 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6609 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6610 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6611 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6612 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6613 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6614 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6615 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6616 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006617
Daniel Dunbar84384642011-05-02 21:03:47 +00006618 // Give --sysroot= preference, over the Apple specific behavior to also use
6619 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006620 StringRef sysroot = C.getSysRoot();
6621 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006622 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006623 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006624 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6625 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006626 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006627 }
6628
Daniel Dunbarc1964212009-03-26 16:23:12 +00006629 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6630 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6631 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6632 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6633 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006634 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006635 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6636 Args.AddAllArgs(CmdArgs, options::OPT_y);
6637 Args.AddLastArg(CmdArgs, options::OPT_w);
6638 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6639 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6640 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6641 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6642 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6643 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6644 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6645 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6646 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6647 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6648 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6649 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6650}
6651
Douglas Katzman95354292015-06-23 20:42:09 +00006652void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6653 const InputInfo &Output,
6654 const InputInfoList &Inputs,
6655 const ArgList &Args,
6656 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006657 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006658
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006659 // If the number of arguments surpasses the system limits, we will encode the
6660 // input files in a separate file, shortening the command line. To this end,
6661 // build a list of input file names that can be passed via a file with the
6662 // -filelist linker option.
6663 llvm::opt::ArgStringList InputFileList;
6664
Daniel Dunbarc1964212009-03-26 16:23:12 +00006665 // The logic here is derived from gcc's behavior; most of which
6666 // comes from specs (starting with link_command). Consult gcc for
6667 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006668 ArgStringList CmdArgs;
6669
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006670 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6671 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6672 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006673 for (const auto &Arg : Args)
6674 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006675 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006676 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006677 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006678 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006679 return;
6680 }
6681
Daniel Dunbarc1964212009-03-26 16:23:12 +00006682 // I'm not sure why this particular decomposition exists in gcc, but
6683 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006684 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006685
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006686 // It seems that the 'e' option is completely ignored for dynamic executables
6687 // (the default), and with static executables, the last one wins, as expected.
6688 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6689 options::OPT_Z_Flag, options::OPT_u_Group,
6690 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006691
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006692 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6693 // members of static archive libraries which implement Objective-C classes or
6694 // categories.
6695 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6696 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006697
Daniel Dunbarc1964212009-03-26 16:23:12 +00006698 CmdArgs.push_back("-o");
6699 CmdArgs.push_back(Output.getFilename());
6700
Chad Rosier06fd3c62012-05-16 23:45:12 +00006701 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006702 !Args.hasArg(options::OPT_nostartfiles))
6703 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006704
Peter Collingbournec4122c12015-06-15 21:08:13 +00006705 // SafeStack requires its own runtime libraries
6706 // These libraries should be linked first, to make sure the
6707 // __safestack_init constructor executes before everything else
6708 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6709 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6710 "libclang_rt.safestack_osx.a",
6711 /*AlwaysLink=*/true);
6712 }
6713
Daniel Dunbarc1964212009-03-26 16:23:12 +00006714 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006715
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006716 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6717 options::OPT_fno_openmp, false)) {
6718 switch (getOpenMPRuntime(getToolChain(), Args)) {
6719 case OMPRT_OMP:
6720 CmdArgs.push_back("-lomp");
6721 break;
6722 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006723 CmdArgs.push_back("-lgomp");
6724 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006725 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006726 CmdArgs.push_back("-liomp5");
6727 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006728 case OMPRT_Unknown:
6729 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006730 break;
6731 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006732 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006733
Douglas Gregor9295df02012-05-15 21:00:27 +00006734 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006735 // Build the input file for -filelist (list of linker input files) in case we
6736 // need it later
6737 for (const auto &II : Inputs) {
6738 if (!II.isFilename()) {
6739 // This is a linker input argument.
6740 // We cannot mix input arguments and file names in a -filelist input, thus
6741 // we prematurely stop our list (remaining files shall be passed as
6742 // arguments).
6743 if (InputFileList.size() > 0)
6744 break;
6745
6746 continue;
6747 }
6748
6749 InputFileList.push_back(II.getFilename());
6750 }
6751
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006752 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006753 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006754 // We use arclite library for both ARC and subscripting support.
6755 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6756
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006757 CmdArgs.push_back("-framework");
6758 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006759 // Link libobj.
6760 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006761 }
John McCall31168b02011-06-15 23:02:42 +00006762
Daniel Dunbarc1964212009-03-26 16:23:12 +00006763 if (LinkingOutput) {
6764 CmdArgs.push_back("-arch_multiple");
6765 CmdArgs.push_back("-final_output");
6766 CmdArgs.push_back(LinkingOutput);
6767 }
6768
Daniel Dunbarc1964212009-03-26 16:23:12 +00006769 if (Args.hasArg(options::OPT_fnested_functions))
6770 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006771
Justin Bognerc7701242015-05-12 05:44:36 +00006772 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6773 // paths are different enough from other toolchains that this needs a fair
6774 // amount of refactoring done first.
6775 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6776
Daniel Dunbarc1964212009-03-26 16:23:12 +00006777 if (!Args.hasArg(options::OPT_nostdlib) &&
6778 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006779 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006780 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006781
Daniel Dunbarc1964212009-03-26 16:23:12 +00006782 // link_ssp spec is empty.
6783
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006784 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006785 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006786 }
6787
Chad Rosier06fd3c62012-05-16 23:45:12 +00006788 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006789 !Args.hasArg(options::OPT_nostartfiles)) {
6790 // endfile_spec is empty.
6791 }
6792
6793 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6794 Args.AddAllArgs(CmdArgs, options::OPT_F);
6795
Steven Wu3ffb61b2015-02-06 18:08:29 +00006796 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006797 for (const Arg *A : Args.filtered(options::OPT_iframework))
6798 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006799
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006800 if (!Args.hasArg(options::OPT_nostdlib) &&
6801 !Args.hasArg(options::OPT_nodefaultlibs)) {
6802 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6803 if (A->getValue() == StringRef("Accelerate")) {
6804 CmdArgs.push_back("-framework");
6805 CmdArgs.push_back("Accelerate");
6806 }
6807 }
6808 }
6809
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006810 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006811 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006812 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006813 Cmd->setInputFileList(std::move(InputFileList));
6814 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006815}
6816
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006817void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006818 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006819 const InputInfoList &Inputs,
6820 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006821 const char *LinkingOutput) const {
6822 ArgStringList CmdArgs;
6823
6824 CmdArgs.push_back("-create");
6825 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006826
6827 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006828 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006829
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006830 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006831 assert(II.isFilename() && "Unexpected lipo input.");
6832 CmdArgs.push_back(II.getFilename());
6833 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006834
6835 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006836 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006837}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006838
Daniel Dunbar88299622010-06-04 18:28:36 +00006839void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006840 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006841 const InputInfoList &Inputs,
6842 const ArgList &Args,
6843 const char *LinkingOutput) const {
6844 ArgStringList CmdArgs;
6845
Daniel Dunbareb86b042011-05-09 17:23:16 +00006846 CmdArgs.push_back("-o");
6847 CmdArgs.push_back(Output.getFilename());
6848
Daniel Dunbar88299622010-06-04 18:28:36 +00006849 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6850 const InputInfo &Input = Inputs[0];
6851 assert(Input.isFilename() && "Unexpected dsymutil input.");
6852 CmdArgs.push_back(Input.getFilename());
6853
Daniel Dunbar88299622010-06-04 18:28:36 +00006854 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006855 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006856 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006857}
6858
Eric Christopher551ef452011-08-23 17:56:55 +00006859void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006860 const InputInfo &Output,
6861 const InputInfoList &Inputs,
6862 const ArgList &Args,
6863 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006864 ArgStringList CmdArgs;
6865 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006866 CmdArgs.push_back("--debug-info");
6867 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006868 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006869
6870 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6871 const InputInfo &Input = Inputs[0];
6872 assert(Input.isFilename() && "Unexpected verify input");
6873
6874 // Grabbing the output of the earlier dsymutil run.
6875 CmdArgs.push_back(Input.getFilename());
6876
6877 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006878 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006879 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00006880}
6881
Douglas Katzman95354292015-06-23 20:42:09 +00006882void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006883 const InputInfo &Output,
6884 const InputInfoList &Inputs,
6885 const ArgList &Args,
6886 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006887 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006888 ArgStringList CmdArgs;
6889
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006890 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006891
6892 CmdArgs.push_back("-o");
6893 CmdArgs.push_back(Output.getFilename());
6894
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006895 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006896 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006897
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006898 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006899 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006900}
6901
Douglas Katzman95354292015-06-23 20:42:09 +00006902void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6903 const InputInfo &Output,
6904 const InputInfoList &Inputs,
6905 const ArgList &Args,
6906 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006907 ArgStringList CmdArgs;
6908
David Chisnall272a0712012-02-29 15:06:12 +00006909 // Demangle C++ names in errors
6910 CmdArgs.push_back("-C");
6911
David Chisnallf571cde2012-02-15 13:39:01 +00006912 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6913 (!Args.hasArg(options::OPT_shared))) {
6914 CmdArgs.push_back("-e");
6915 CmdArgs.push_back("_start");
6916 }
6917
6918 if (Args.hasArg(options::OPT_static)) {
6919 CmdArgs.push_back("-Bstatic");
6920 CmdArgs.push_back("-dn");
6921 } else {
6922 CmdArgs.push_back("-Bdynamic");
6923 if (Args.hasArg(options::OPT_shared)) {
6924 CmdArgs.push_back("-shared");
6925 } else {
6926 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006927 CmdArgs.push_back(
6928 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00006929 }
6930 }
6931
6932 if (Output.isFilename()) {
6933 CmdArgs.push_back("-o");
6934 CmdArgs.push_back(Output.getFilename());
6935 } else {
6936 assert(Output.isNothing() && "Invalid output.");
6937 }
6938
6939 if (!Args.hasArg(options::OPT_nostdlib) &&
6940 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006941 if (!Args.hasArg(options::OPT_shared))
6942 CmdArgs.push_back(
6943 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6944
6945 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6946 CmdArgs.push_back(
6947 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
6948 CmdArgs.push_back(
6949 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006950 }
6951
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006952 const ToolChain::path_list &Paths = getToolChain().getFilePaths();
6953 for (const auto &Path : Paths)
6954 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
David Chisnallf571cde2012-02-15 13:39:01 +00006955
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006956 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
6957 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00006958
6959 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6960
6961 if (!Args.hasArg(options::OPT_nostdlib) &&
6962 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006963 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006964 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006965 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00006966 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006967 if (!Args.hasArg(options::OPT_shared)) {
6968 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00006969 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006970 }
David Chisnallf571cde2012-02-15 13:39:01 +00006971 }
6972
6973 if (!Args.hasArg(options::OPT_nostdlib) &&
6974 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006975 CmdArgs.push_back(
6976 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006977 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006978 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006979
Alexey Samsonov7811d192014-02-20 13:57:37 +00006980 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006981
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006982 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006983 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006984}
6985
Douglas Katzman95354292015-06-23 20:42:09 +00006986void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6987 const InputInfo &Output,
6988 const InputInfoList &Inputs,
6989 const ArgList &Args,
6990 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006991 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006992 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006993 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006994
Rafael Espindolacc126272014-02-28 01:55:21 +00006995 switch (getToolChain().getArch()) {
6996 case llvm::Triple::x86:
6997 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6998 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006999 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007000 break;
7001
7002 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007003 CmdArgs.push_back("-mppc");
7004 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007005 break;
7006
7007 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007008 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00007009 CmdArgs.push_back("-32");
7010 NeedsKPIC = true;
7011 break;
7012
7013 case llvm::Triple::sparcv9:
7014 CmdArgs.push_back("-64");
7015 CmdArgs.push_back("-Av9a");
7016 NeedsKPIC = true;
7017 break;
7018
7019 case llvm::Triple::mips64:
7020 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007021 StringRef CPUName;
7022 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007023 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007024
7025 CmdArgs.push_back("-mabi");
7026 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7027
7028 if (getToolChain().getArch() == llvm::Triple::mips64)
7029 CmdArgs.push_back("-EB");
7030 else
7031 CmdArgs.push_back("-EL");
7032
Rafael Espindolacc126272014-02-28 01:55:21 +00007033 NeedsKPIC = true;
7034 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007035 }
7036
Rafael Espindolacc126272014-02-28 01:55:21 +00007037 default:
7038 break;
7039 }
7040
7041 if (NeedsKPIC)
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007042 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007043
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007044 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007045
7046 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007047 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007048
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007049 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007050 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007051
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007052 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007053 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007054}
7055
Douglas Katzman95354292015-06-23 20:42:09 +00007056void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7057 const InputInfo &Output,
7058 const InputInfoList &Inputs,
7059 const ArgList &Args,
7060 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007061 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007062 ArgStringList CmdArgs;
7063
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007064 // Silence warning for "clang -g foo.o -o foo"
7065 Args.ClaimAllArgs(options::OPT_g_Group);
7066 // and "clang -emit-llvm foo.o -o foo"
7067 Args.ClaimAllArgs(options::OPT_emit_llvm);
7068 // and for "clang -w foo.o -o foo". Other warning options are already
7069 // handled somewhere else.
7070 Args.ClaimAllArgs(options::OPT_w);
7071
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007072 if (getToolChain().getArch() == llvm::Triple::mips64)
7073 CmdArgs.push_back("-EB");
7074 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7075 CmdArgs.push_back("-EL");
7076
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007077 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007078 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007079 CmdArgs.push_back("-e");
7080 CmdArgs.push_back("__start");
7081 }
7082
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007083 if (Args.hasArg(options::OPT_static)) {
7084 CmdArgs.push_back("-Bstatic");
7085 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007086 if (Args.hasArg(options::OPT_rdynamic))
7087 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007088 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007089 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007090 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007091 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007092 } else {
7093 CmdArgs.push_back("-dynamic-linker");
7094 CmdArgs.push_back("/usr/libexec/ld.so");
7095 }
7096 }
7097
Rafael Espindola044f7832013-06-05 04:28:55 +00007098 if (Args.hasArg(options::OPT_nopie))
7099 CmdArgs.push_back("-nopie");
7100
Daniel Dunbarb440f562010-08-02 02:38:21 +00007101 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007102 CmdArgs.push_back("-o");
7103 CmdArgs.push_back(Output.getFilename());
7104 } else {
7105 assert(Output.isNothing() && "Invalid output.");
7106 }
7107
7108 if (!Args.hasArg(options::OPT_nostdlib) &&
7109 !Args.hasArg(options::OPT_nostartfiles)) {
7110 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007111 if (Args.hasArg(options::OPT_pg))
7112 CmdArgs.push_back(
7113 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007114 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007115 CmdArgs.push_back(
7116 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7117 CmdArgs.push_back(
7118 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007119 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007120 CmdArgs.push_back(
7121 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007122 }
7123 }
7124
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007125 std::string Triple = getToolChain().getTripleString();
7126 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007127 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007128 CmdArgs.push_back(
7129 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007130
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007131 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7132 options::OPT_e, options::OPT_s, options::OPT_t,
7133 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007134
Daniel Dunbar54423b22010-09-17 00:24:54 +00007135 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007136
7137 if (!Args.hasArg(options::OPT_nostdlib) &&
7138 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007139 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007140 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007141 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007142 CmdArgs.push_back("-lm_p");
7143 else
7144 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007145 }
7146
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007147 // FIXME: For some reason GCC passes -lgcc before adding
7148 // the default system libraries. Just mimic this for now.
7149 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007150
Eric Christopher17674ec2012-09-13 06:32:34 +00007151 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007152 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7153 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007154 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007155 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007156 }
7157
Chandler Carruth45661652011-12-17 22:32:42 +00007158 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007159 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007160 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007161 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007162 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007163 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007164
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007165 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007166 }
7167
7168 if (!Args.hasArg(options::OPT_nostdlib) &&
7169 !Args.hasArg(options::OPT_nostartfiles)) {
7170 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007171 CmdArgs.push_back(
7172 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007173 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007174 CmdArgs.push_back(
7175 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007176 }
7177
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007178 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007179 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007180}
Ed Schoutene33194b2009-04-02 19:13:12 +00007181
Douglas Katzman95354292015-06-23 20:42:09 +00007182void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7183 const InputInfo &Output,
7184 const InputInfoList &Inputs,
7185 const ArgList &Args,
7186 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007187 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007188 ArgStringList CmdArgs;
7189
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007190 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007191
7192 CmdArgs.push_back("-o");
7193 CmdArgs.push_back(Output.getFilename());
7194
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007195 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007196 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007197
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007198 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007199 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007200}
7201
Douglas Katzman95354292015-06-23 20:42:09 +00007202void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7203 const InputInfo &Output,
7204 const InputInfoList &Inputs,
7205 const ArgList &Args,
7206 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007207 const Driver &D = getToolChain().getDriver();
7208 ArgStringList CmdArgs;
7209
7210 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7211 (!Args.hasArg(options::OPT_shared))) {
7212 CmdArgs.push_back("-e");
7213 CmdArgs.push_back("__start");
7214 }
7215
7216 if (Args.hasArg(options::OPT_static)) {
7217 CmdArgs.push_back("-Bstatic");
7218 } else {
7219 if (Args.hasArg(options::OPT_rdynamic))
7220 CmdArgs.push_back("-export-dynamic");
7221 CmdArgs.push_back("--eh-frame-hdr");
7222 CmdArgs.push_back("-Bdynamic");
7223 if (Args.hasArg(options::OPT_shared)) {
7224 CmdArgs.push_back("-shared");
7225 } else {
7226 CmdArgs.push_back("-dynamic-linker");
7227 CmdArgs.push_back("/usr/libexec/ld.so");
7228 }
7229 }
7230
7231 if (Output.isFilename()) {
7232 CmdArgs.push_back("-o");
7233 CmdArgs.push_back(Output.getFilename());
7234 } else {
7235 assert(Output.isNothing() && "Invalid output.");
7236 }
7237
7238 if (!Args.hasArg(options::OPT_nostdlib) &&
7239 !Args.hasArg(options::OPT_nostartfiles)) {
7240 if (!Args.hasArg(options::OPT_shared)) {
7241 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007242 CmdArgs.push_back(
7243 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007244 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007245 CmdArgs.push_back(
7246 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7247 CmdArgs.push_back(
7248 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007249 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007250 CmdArgs.push_back(
7251 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007252 }
7253 }
7254
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007255 Args.AddAllArgs(CmdArgs,
7256 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007257
7258 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7259
7260 if (!Args.hasArg(options::OPT_nostdlib) &&
7261 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007262 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007263 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7264 if (Args.hasArg(options::OPT_pg))
7265 CmdArgs.push_back("-lm_p");
7266 else
7267 CmdArgs.push_back("-lm");
7268 }
7269
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007270 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007271 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007272 CmdArgs.push_back("-lpthread_p");
7273 else
7274 CmdArgs.push_back("-lpthread");
7275 }
7276
Eli Friedman9fa28852012-08-08 23:57:20 +00007277 if (!Args.hasArg(options::OPT_shared)) {
7278 if (Args.hasArg(options::OPT_pg))
7279 CmdArgs.push_back("-lc_p");
7280 else
7281 CmdArgs.push_back("-lc");
7282 }
7283
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007284 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007285 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007286 case llvm::Triple::arm:
7287 MyArch = "arm";
7288 break;
7289 case llvm::Triple::x86:
7290 MyArch = "i386";
7291 break;
7292 case llvm::Triple::x86_64:
7293 MyArch = "amd64";
7294 break;
7295 default:
7296 llvm_unreachable("Unsupported architecture");
7297 }
7298 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007299 }
7300
7301 if (!Args.hasArg(options::OPT_nostdlib) &&
7302 !Args.hasArg(options::OPT_nostartfiles)) {
7303 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007304 CmdArgs.push_back(
7305 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007306 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007307 CmdArgs.push_back(
7308 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007309 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007310
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007311 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007312 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007313}
7314
Douglas Katzman95354292015-06-23 20:42:09 +00007315void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7316 const InputInfo &Output,
7317 const InputInfoList &Inputs,
7318 const ArgList &Args,
7319 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007320 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007321 ArgStringList CmdArgs;
7322
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007323 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7324 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007325 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007326 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007327 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007328 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007329 else if (getToolChain().getArch() == llvm::Triple::mips ||
7330 getToolChain().getArch() == llvm::Triple::mipsel ||
7331 getToolChain().getArch() == llvm::Triple::mips64 ||
7332 getToolChain().getArch() == llvm::Triple::mips64el) {
7333 StringRef CPUName;
7334 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007335 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007336
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007337 CmdArgs.push_back("-march");
7338 CmdArgs.push_back(CPUName.data());
7339
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007340 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007341 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007342
7343 if (getToolChain().getArch() == llvm::Triple::mips ||
7344 getToolChain().getArch() == llvm::Triple::mips64)
7345 CmdArgs.push_back("-EB");
7346 else
7347 CmdArgs.push_back("-EL");
7348
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007349 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007350 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007351 getToolChain().getArch() == llvm::Triple::armeb ||
7352 getToolChain().getArch() == llvm::Triple::thumb ||
7353 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00007354 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007355 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00007356 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
7357
7358 if (FloatABI == "hard") {
7359 CmdArgs.push_back("-mfpu=vfp");
7360 } else {
7361 CmdArgs.push_back("-mfpu=softvfp");
7362 }
7363
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007364 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007365 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007366 case llvm::Triple::GNUEABI:
7367 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007368 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007369 break;
7370
7371 default:
7372 CmdArgs.push_back("-matpcs");
7373 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007374 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007375 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007376 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007377 if (getToolChain().getArch() == llvm::Triple::sparc)
7378 CmdArgs.push_back("-Av8plusa");
7379 else
7380 CmdArgs.push_back("-Av9a");
7381
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007382 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007383 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007384
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007385 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007386
7387 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007388 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007389
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007390 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007391 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007392
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007393 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007394 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007395}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007396
Douglas Katzman95354292015-06-23 20:42:09 +00007397void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7398 const InputInfo &Output,
7399 const InputInfoList &Inputs,
7400 const ArgList &Args,
7401 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007402 const toolchains::FreeBSD &ToolChain =
7403 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007404 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007405 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007406 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007407 !Args.hasArg(options::OPT_shared) &&
7408 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007409 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007410
7411 // Silence warning for "clang -g foo.o -o foo"
7412 Args.ClaimAllArgs(options::OPT_g_Group);
7413 // and "clang -emit-llvm foo.o -o foo"
7414 Args.ClaimAllArgs(options::OPT_emit_llvm);
7415 // and for "clang -w foo.o -o foo". Other warning options are already
7416 // handled somewhere else.
7417 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007418
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007419 if (!D.SysRoot.empty())
7420 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7421
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007422 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007423 CmdArgs.push_back("-pie");
7424
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007425 if (Args.hasArg(options::OPT_static)) {
7426 CmdArgs.push_back("-Bstatic");
7427 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007428 if (Args.hasArg(options::OPT_rdynamic))
7429 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007430 CmdArgs.push_back("--eh-frame-hdr");
7431 if (Args.hasArg(options::OPT_shared)) {
7432 CmdArgs.push_back("-Bshareable");
7433 } else {
7434 CmdArgs.push_back("-dynamic-linker");
7435 CmdArgs.push_back("/libexec/ld-elf.so.1");
7436 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007437 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007438 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7439 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7440 CmdArgs.push_back("--hash-style=both");
7441 }
7442 }
7443 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007444 }
7445
7446 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7447 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007448 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007449 CmdArgs.push_back("-m");
7450 CmdArgs.push_back("elf_i386_fbsd");
7451 }
7452
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007453 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007454 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007455 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007456 }
7457
Daniel Dunbarb440f562010-08-02 02:38:21 +00007458 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007459 CmdArgs.push_back("-o");
7460 CmdArgs.push_back(Output.getFilename());
7461 } else {
7462 assert(Output.isNothing() && "Invalid output.");
7463 }
7464
7465 if (!Args.hasArg(options::OPT_nostdlib) &&
7466 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007467 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007468 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007469 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007470 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007471 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007472 crt1 = "Scrt1.o";
7473 else
7474 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007475 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007476 if (crt1)
7477 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7478
7479 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7480
Craig Topper92fc2df2014-05-17 16:56:41 +00007481 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007482 if (Args.hasArg(options::OPT_static))
7483 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007484 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007485 crtbegin = "crtbeginS.o";
7486 else
7487 crtbegin = "crtbegin.o";
7488
7489 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007490 }
7491
7492 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007493 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007494 for (const auto &Path : Paths)
7495 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007496 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7497 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007498 Args.AddAllArgs(CmdArgs, options::OPT_s);
7499 Args.AddAllArgs(CmdArgs, options::OPT_t);
7500 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7501 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007502
Alexey Samsonov907880e2015-06-19 19:57:46 +00007503 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007504 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007505
Alexey Samsonov52550342014-09-15 19:58:40 +00007506 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007507 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007508
7509 if (!Args.hasArg(options::OPT_nostdlib) &&
7510 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007511 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007512 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007513 if (Args.hasArg(options::OPT_pg))
7514 CmdArgs.push_back("-lm_p");
7515 else
7516 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007517 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007518 if (NeedsSanitizerDeps)
7519 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007520 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7521 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007522 if (Args.hasArg(options::OPT_pg))
7523 CmdArgs.push_back("-lgcc_p");
7524 else
7525 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007526 if (Args.hasArg(options::OPT_static)) {
7527 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007528 } else if (Args.hasArg(options::OPT_pg)) {
7529 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007530 } else {
7531 CmdArgs.push_back("--as-needed");
7532 CmdArgs.push_back("-lgcc_s");
7533 CmdArgs.push_back("--no-as-needed");
7534 }
7535
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007536 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007537 if (Args.hasArg(options::OPT_pg))
7538 CmdArgs.push_back("-lpthread_p");
7539 else
7540 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007541 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007542
Roman Divacky66f22762011-02-10 16:59:40 +00007543 if (Args.hasArg(options::OPT_pg)) {
7544 if (Args.hasArg(options::OPT_shared))
7545 CmdArgs.push_back("-lc");
7546 else
7547 CmdArgs.push_back("-lc_p");
7548 CmdArgs.push_back("-lgcc_p");
7549 } else {
7550 CmdArgs.push_back("-lc");
7551 CmdArgs.push_back("-lgcc");
7552 }
7553
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007554 if (Args.hasArg(options::OPT_static)) {
7555 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007556 } else if (Args.hasArg(options::OPT_pg)) {
7557 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007558 } else {
7559 CmdArgs.push_back("--as-needed");
7560 CmdArgs.push_back("-lgcc_s");
7561 CmdArgs.push_back("--no-as-needed");
7562 }
7563 }
7564
7565 if (!Args.hasArg(options::OPT_nostdlib) &&
7566 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007567 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007568 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007569 else
7570 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007571 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007572 }
7573
Alexey Samsonov7811d192014-02-20 13:57:37 +00007574 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007575
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007576 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007577 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007578}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007579
Douglas Katzman95354292015-06-23 20:42:09 +00007580void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007581 const InputInfo &Output,
7582 const InputInfoList &Inputs,
7583 const ArgList &Args,
7584 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007585 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007586 ArgStringList CmdArgs;
7587
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007588 // GNU as needs different flags for creating the correct output format
7589 // on architectures with different ABIs or optional feature sets.
7590 switch (getToolChain().getArch()) {
7591 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007592 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007593 break;
7594 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007595 case llvm::Triple::armeb:
7596 case llvm::Triple::thumb:
7597 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007598 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007599 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7600 std::string Arch =
7601 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007602 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007603 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007604 }
7605
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007606 case llvm::Triple::mips:
7607 case llvm::Triple::mipsel:
7608 case llvm::Triple::mips64:
7609 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007610 StringRef CPUName;
7611 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007612 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007613
7614 CmdArgs.push_back("-march");
7615 CmdArgs.push_back(CPUName.data());
7616
7617 CmdArgs.push_back("-mabi");
7618 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7619
7620 if (getToolChain().getArch() == llvm::Triple::mips ||
7621 getToolChain().getArch() == llvm::Triple::mips64)
7622 CmdArgs.push_back("-EB");
7623 else
7624 CmdArgs.push_back("-EL");
7625
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007626 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007627 break;
7628 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007629
7630 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007631 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007632 CmdArgs.push_back("-32");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007633 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007634 break;
7635
7636 case llvm::Triple::sparcv9:
7637 CmdArgs.push_back("-64");
7638 CmdArgs.push_back("-Av9");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007639 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007640 break;
7641
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007642 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007643 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007644 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007645
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007646 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007647
7648 CmdArgs.push_back("-o");
7649 CmdArgs.push_back(Output.getFilename());
7650
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007651 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007652 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007653
David Chisnallddbd68f2011-09-27 22:03:18 +00007654 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007655 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007656}
7657
Douglas Katzman95354292015-06-23 20:42:09 +00007658void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7659 const InputInfo &Output,
7660 const InputInfoList &Inputs,
7661 const ArgList &Args,
7662 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007663 const Driver &D = getToolChain().getDriver();
7664 ArgStringList CmdArgs;
7665
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007666 if (!D.SysRoot.empty())
7667 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7668
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007669 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007670 if (Args.hasArg(options::OPT_static)) {
7671 CmdArgs.push_back("-Bstatic");
7672 } else {
7673 if (Args.hasArg(options::OPT_rdynamic))
7674 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007675 if (Args.hasArg(options::OPT_shared)) {
7676 CmdArgs.push_back("-Bshareable");
7677 } else {
7678 CmdArgs.push_back("-dynamic-linker");
7679 CmdArgs.push_back("/libexec/ld.elf_so");
7680 }
7681 }
7682
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007683 // Many NetBSD architectures support more than one ABI.
7684 // Determine the correct emulation for ld.
7685 switch (getToolChain().getArch()) {
7686 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007687 CmdArgs.push_back("-m");
7688 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007689 break;
7690 case llvm::Triple::arm:
7691 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007692 CmdArgs.push_back("-m");
7693 switch (getToolChain().getTriple().getEnvironment()) {
7694 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007695 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007696 CmdArgs.push_back("armelf_nbsd_eabi");
7697 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007698 case llvm::Triple::EABIHF:
7699 case llvm::Triple::GNUEABIHF:
7700 CmdArgs.push_back("armelf_nbsd_eabihf");
7701 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007702 default:
7703 CmdArgs.push_back("armelf_nbsd");
7704 break;
7705 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007706 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007707 case llvm::Triple::armeb:
7708 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007709 arm::appendEBLinkFlags(
7710 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007711 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007712 CmdArgs.push_back("-m");
7713 switch (getToolChain().getTriple().getEnvironment()) {
7714 case llvm::Triple::EABI:
7715 case llvm::Triple::GNUEABI:
7716 CmdArgs.push_back("armelfb_nbsd_eabi");
7717 break;
7718 case llvm::Triple::EABIHF:
7719 case llvm::Triple::GNUEABIHF:
7720 CmdArgs.push_back("armelfb_nbsd_eabihf");
7721 break;
7722 default:
7723 CmdArgs.push_back("armelfb_nbsd");
7724 break;
7725 }
7726 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007727 case llvm::Triple::mips64:
7728 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007729 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007730 CmdArgs.push_back("-m");
7731 if (getToolChain().getArch() == llvm::Triple::mips64)
7732 CmdArgs.push_back("elf32btsmip");
7733 else
7734 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007735 } else if (mips::hasMipsAbiArg(Args, "64")) {
7736 CmdArgs.push_back("-m");
7737 if (getToolChain().getArch() == llvm::Triple::mips64)
7738 CmdArgs.push_back("elf64btsmip");
7739 else
7740 CmdArgs.push_back("elf64ltsmip");
7741 }
7742 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007743 case llvm::Triple::ppc:
7744 CmdArgs.push_back("-m");
7745 CmdArgs.push_back("elf32ppc_nbsd");
7746 break;
7747
7748 case llvm::Triple::ppc64:
7749 case llvm::Triple::ppc64le:
7750 CmdArgs.push_back("-m");
7751 CmdArgs.push_back("elf64ppc");
7752 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007753
7754 case llvm::Triple::sparc:
7755 CmdArgs.push_back("-m");
7756 CmdArgs.push_back("elf32_sparc");
7757 break;
7758
7759 case llvm::Triple::sparcv9:
7760 CmdArgs.push_back("-m");
7761 CmdArgs.push_back("elf64_sparc");
7762 break;
7763
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007764 default:
7765 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007766 }
7767
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007768 if (Output.isFilename()) {
7769 CmdArgs.push_back("-o");
7770 CmdArgs.push_back(Output.getFilename());
7771 } else {
7772 assert(Output.isNothing() && "Invalid output.");
7773 }
7774
7775 if (!Args.hasArg(options::OPT_nostdlib) &&
7776 !Args.hasArg(options::OPT_nostartfiles)) {
7777 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007778 CmdArgs.push_back(
7779 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7780 CmdArgs.push_back(
7781 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7782 CmdArgs.push_back(
7783 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007784 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007785 CmdArgs.push_back(
7786 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7787 CmdArgs.push_back(
7788 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007789 }
7790 }
7791
7792 Args.AddAllArgs(CmdArgs, options::OPT_L);
7793 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7794 Args.AddAllArgs(CmdArgs, options::OPT_e);
7795 Args.AddAllArgs(CmdArgs, options::OPT_s);
7796 Args.AddAllArgs(CmdArgs, options::OPT_t);
7797 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7798 Args.AddAllArgs(CmdArgs, options::OPT_r);
7799
7800 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7801
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007802 unsigned Major, Minor, Micro;
7803 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7804 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007805 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007806 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007807 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007808 case llvm::Triple::arm:
7809 case llvm::Triple::armeb:
7810 case llvm::Triple::thumb:
7811 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007812 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007813 case llvm::Triple::ppc64:
7814 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007815 case llvm::Triple::x86:
7816 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007817 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007818 break;
7819 default:
7820 break;
7821 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007822 }
7823
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007824 if (!Args.hasArg(options::OPT_nostdlib) &&
7825 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007826 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007827 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7828 CmdArgs.push_back("-lm");
7829 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007830 if (Args.hasArg(options::OPT_pthread))
7831 CmdArgs.push_back("-lpthread");
7832 CmdArgs.push_back("-lc");
7833
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007834 if (useLibgcc) {
7835 if (Args.hasArg(options::OPT_static)) {
7836 // libgcc_eh depends on libc, so resolve as much as possible,
7837 // pull in any new requirements from libc and then get the rest
7838 // of libgcc.
7839 CmdArgs.push_back("-lgcc_eh");
7840 CmdArgs.push_back("-lc");
7841 CmdArgs.push_back("-lgcc");
7842 } else {
7843 CmdArgs.push_back("-lgcc");
7844 CmdArgs.push_back("--as-needed");
7845 CmdArgs.push_back("-lgcc_s");
7846 CmdArgs.push_back("--no-as-needed");
7847 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007848 }
7849 }
7850
7851 if (!Args.hasArg(options::OPT_nostdlib) &&
7852 !Args.hasArg(options::OPT_nostartfiles)) {
7853 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007854 CmdArgs.push_back(
7855 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007856 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007857 CmdArgs.push_back(
7858 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7859 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007860 }
7861
Alexey Samsonov7811d192014-02-20 13:57:37 +00007862 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007863
Logan Chieneb9162f2014-06-26 14:23:45 +00007864 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007865 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007866}
7867
Douglas Katzman95354292015-06-23 20:42:09 +00007868void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7869 const InputInfo &Output,
7870 const InputInfoList &Inputs,
7871 const ArgList &Args,
7872 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007873 claimNoWarnArgs(Args);
7874
James Y Knight2db38f32015-08-15 03:45:25 +00007875 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
7876 llvm::Triple Triple = llvm::Triple(TripleStr);
7877
Rafael Espindola92b00932010-08-10 00:25:48 +00007878 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007879 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007880
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007881 llvm::Reloc::Model RelocationModel;
7882 unsigned PICLevel;
7883 bool IsPIE;
7884 std::tie(RelocationModel, PICLevel, IsPIE) =
7885 ParsePICArgs(getToolChain(), Triple, Args);
7886
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007887 switch (getToolChain().getArch()) {
7888 default:
7889 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007890 // Add --32/--64 to make sure we get the format we want.
7891 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007892 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007893 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007894 break;
7895 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007896 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7897 CmdArgs.push_back("--x32");
7898 else
7899 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007900 break;
7901 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007902 CmdArgs.push_back("-a32");
7903 CmdArgs.push_back("-mppc");
7904 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007905 break;
7906 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007907 CmdArgs.push_back("-a64");
7908 CmdArgs.push_back("-mppc64");
7909 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007910 break;
7911 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007912 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007913 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007914 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007915 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007916 break;
7917 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007918 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007919 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007920 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007921 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007922 break;
7923 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007924 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007925 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007926 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007927 break;
7928 case llvm::Triple::arm:
7929 case llvm::Triple::armeb:
7930 case llvm::Triple::thumb:
7931 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00007932 const llvm::Triple &Triple2 = getToolChain().getTriple();
7933 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00007934 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007935 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007936 break;
7937 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007938 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007939 break;
7940 default:
7941 break;
7942 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007943
James Y Knight2db38f32015-08-15 03:45:25 +00007944 StringRef ARMFloatABI =
7945 tools::arm::getARMFloatABI(getToolChain().getDriver(), Args, Triple);
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007946 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007947
7948 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007949
7950 // FIXME: remove krait check when GNU tools support krait cpu
7951 // for now replace it with -march=armv7-a to avoid a lower
7952 // march from being picked in the absence of a cpu flag.
7953 Arg *A;
7954 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007955 StringRef(A->getValue()).lower() == "krait")
7956 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00007957 else
7958 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007959 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007960 break;
7961 }
7962 case llvm::Triple::mips:
7963 case llvm::Triple::mipsel:
7964 case llvm::Triple::mips64:
7965 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007966 StringRef CPUName;
7967 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007968 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007969 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007970
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007971 CmdArgs.push_back("-march");
7972 CmdArgs.push_back(CPUName.data());
7973
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007974 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007975 CmdArgs.push_back(ABIName.data());
7976
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007977 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7978 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007979 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007980 CmdArgs.push_back("-mno-shared");
7981
Daniel Sanders379d44b2014-07-16 11:52:23 +00007982 // LLVM doesn't support -mplt yet and acts as if it is always given.
7983 // However, -mplt has no effect with the N64 ABI.
7984 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007985
7986 if (getToolChain().getArch() == llvm::Triple::mips ||
7987 getToolChain().getArch() == llvm::Triple::mips64)
7988 CmdArgs.push_back("-EB");
7989 else
7990 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007991
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007992 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7993 if (StringRef(A->getValue()) == "2008")
7994 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7995 }
7996
Daniel Sanders379d44b2014-07-16 11:52:23 +00007997 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
Toma Tabacu94ea6862015-06-16 13:54:13 +00007998 StringRef MIPSFloatABI = getMipsFloatABI(getToolChain().getDriver(), Args);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007999 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8000 options::OPT_mfp64)) {
8001 A->claim();
8002 A->render(Args, CmdArgs);
Toma Tabacu94ea6862015-06-16 13:54:13 +00008003 } else if (mips::shouldUseFPXX(Args, getToolChain().getTriple(), CPUName,
8004 ABIName, MIPSFloatABI))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008005 CmdArgs.push_back("-mfpxx");
8006
8007 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8008 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008009 if (Arg *A =
8010 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008011 if (A->getOption().matches(options::OPT_mips16)) {
8012 A->claim();
8013 A->render(Args, CmdArgs);
8014 } else {
8015 A->claim();
8016 CmdArgs.push_back("-no-mips16");
8017 }
8018 }
8019
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008020 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8021 options::OPT_mno_micromips);
8022 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8023 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8024
Simon Atanasyanbd986632013-11-26 11:58:04 +00008025 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8026 // Do not use AddLastArg because not all versions of MIPS assembler
8027 // support -mmsa / -mno-msa options.
8028 if (A->getOption().matches(options::OPT_mmsa))
8029 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8030 }
8031
Daniel Sanders379d44b2014-07-16 11:52:23 +00008032 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8033 options::OPT_msoft_float);
8034
Toma Tabacub36d6102015-06-11 12:13:18 +00008035 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8036 options::OPT_msingle_float);
8037
Daniel Sanders379d44b2014-07-16 11:52:23 +00008038 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8039 options::OPT_mno_odd_spreg);
8040
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008041 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008042 break;
8043 }
8044 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008045 // Always pass an -march option, since our default of z10 is later
8046 // than the GNU assembler's default.
8047 StringRef CPUName = getSystemZTargetCPU(Args);
8048 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008049 break;
8050 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008051 }
8052
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008053 if (NeedsKPIC) {
8054 if (RelocationModel != llvm::Reloc::Static)
8055 CmdArgs.push_back("-KPIC");
8056 }
Rafael Espindola92b00932010-08-10 00:25:48 +00008057
Renato Golina74bbc72015-07-22 15:32:36 +00008058 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008059 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008060
8061 CmdArgs.push_back("-o");
8062 CmdArgs.push_back(Output.getFilename());
8063
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008064 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008065 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008066
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008067 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008068 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008069
8070 // Handle the debug info splitting at object creation time if we're
8071 // creating an object.
8072 // TODO: Currently only works on linux with newer objcopy.
8073 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008074 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008075 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008076 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008077}
8078
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008079static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008080 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00008081 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Reid Kleckner0213a472015-07-22 16:01:38 +00008082 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008083 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8084 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008085 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008086 CmdArgs.push_back("-lgcc");
8087
Logan Chien3d3373c2012-11-19 12:04:11 +00008088 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008089 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008090 CmdArgs.push_back("-lgcc");
8091 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008092 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008093 CmdArgs.push_back("--as-needed");
8094 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008095 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008096 CmdArgs.push_back("--no-as-needed");
8097 }
8098
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008099 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008100 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008101 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008102 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008103
8104 // According to Android ABI, we have to link with libdl if we are
8105 // linking with non-static libgcc.
8106 //
8107 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8108 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8109 if (isAndroid && !StaticLibgcc)
8110 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008111}
8112
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008113static std::string getLinuxDynamicLinker(const ArgList &Args,
8114 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008115 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8116
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008117 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
8118 if (ToolChain.getTriple().isArch64Bit())
8119 return "/system/bin/linker64";
8120 else
8121 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008122 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8123 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008124 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008125 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008126 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008127 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008128 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008129 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008130 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
8131 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008132 return "/lib/ld-linux-armhf.so.3";
8133 else
8134 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008135 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8136 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008137 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
8138 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008139 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008140 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008141 return "/lib/ld-linux.so.3";
8142 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8143 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008144 StringRef CPUName;
8145 StringRef ABIName;
8146 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
8147 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
8148
8149 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
8150 .Case("o32", "/lib")
8151 .Case("n32", "/lib32")
8152 .Case("n64", "/lib64")
8153 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008154 StringRef LibName;
8155 if (mips::isUCLibc(Args))
8156 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
8157 else
8158 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008159
8160 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008161 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008162 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008163 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008164 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8165 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008166 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008167 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008168 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8169 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008170 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008171 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008172 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008173 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008174 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008175 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008176 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8177 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008178 else
8179 return "/lib64/ld-linux-x86-64.so.2";
8180}
8181
Renato Golinc4b49242014-02-13 10:01:16 +00008182static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008183 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008184 // Make use of compiler-rt if --rtlib option is used
8185 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8186
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008187 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008188 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008189 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008190 default:
8191 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008192 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008193 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008194 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008195 break;
8196 }
Renato Golinc4b49242014-02-13 10:01:16 +00008197 break;
8198 case ToolChain::RLT_Libgcc:
8199 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8200 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008201 }
8202}
8203
Rafael Espindola1e085772014-08-15 17:14:35 +00008204static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8205 switch (T.getArch()) {
8206 case llvm::Triple::x86:
8207 return "elf_i386";
8208 case llvm::Triple::aarch64:
8209 return "aarch64linux";
8210 case llvm::Triple::aarch64_be:
8211 return "aarch64_be_linux";
8212 case llvm::Triple::arm:
8213 case llvm::Triple::thumb:
8214 return "armelf_linux_eabi";
8215 case llvm::Triple::armeb:
8216 case llvm::Triple::thumbeb:
8217 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8218 case llvm::Triple::ppc:
8219 return "elf32ppclinux";
8220 case llvm::Triple::ppc64:
8221 return "elf64ppc";
8222 case llvm::Triple::ppc64le:
8223 return "elf64lppc";
8224 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008225 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008226 return "elf32_sparc";
8227 case llvm::Triple::sparcv9:
8228 return "elf64_sparc";
8229 case llvm::Triple::mips:
8230 return "elf32btsmip";
8231 case llvm::Triple::mipsel:
8232 return "elf32ltsmip";
8233 case llvm::Triple::mips64:
8234 if (mips::hasMipsAbiArg(Args, "n32"))
8235 return "elf32btsmipn32";
8236 return "elf64btsmip";
8237 case llvm::Triple::mips64el:
8238 if (mips::hasMipsAbiArg(Args, "n32"))
8239 return "elf32ltsmipn32";
8240 return "elf64ltsmip";
8241 case llvm::Triple::systemz:
8242 return "elf64_s390";
8243 case llvm::Triple::x86_64:
8244 if (T.getEnvironment() == llvm::Triple::GNUX32)
8245 return "elf32_x86_64";
8246 return "elf_x86_64";
8247 default:
8248 llvm_unreachable("Unexpected arch");
8249 }
8250}
8251
Douglas Katzman95354292015-06-23 20:42:09 +00008252void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8253 const InputInfo &Output,
8254 const InputInfoList &Inputs,
8255 const ArgList &Args,
8256 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008257 const toolchains::Linux &ToolChain =
8258 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008259 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008260
8261 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8262 llvm::Triple Triple = llvm::Triple(TripleStr);
8263
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008264 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008265 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008266 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008267 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008268 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8269 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008270
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008271 ArgStringList CmdArgs;
8272
Rafael Espindolad1002f62010-11-15 18:28:16 +00008273 // Silence warning for "clang -g foo.o -o foo"
8274 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008275 // and "clang -emit-llvm foo.o -o foo"
8276 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008277 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008278 // handled somewhere else.
8279 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008280
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008281 if (!D.SysRoot.empty())
8282 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008283
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008284 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008285 CmdArgs.push_back("-pie");
8286
Rafael Espindola1c76c592010-11-07 22:57:16 +00008287 if (Args.hasArg(options::OPT_rdynamic))
8288 CmdArgs.push_back("-export-dynamic");
8289
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008290 if (Args.hasArg(options::OPT_s))
8291 CmdArgs.push_back("-s");
8292
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008293 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008294 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008295
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008296 for (const auto &Opt : ToolChain.ExtraOpts)
8297 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008298
8299 if (!Args.hasArg(options::OPT_static)) {
8300 CmdArgs.push_back("--eh-frame-hdr");
8301 }
8302
8303 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008304 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008305
8306 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008307 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8308 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008309 CmdArgs.push_back("-Bstatic");
8310 else
8311 CmdArgs.push_back("-static");
8312 } else if (Args.hasArg(options::OPT_shared)) {
8313 CmdArgs.push_back("-shared");
8314 }
8315
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008316 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8317 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008318 (!Args.hasArg(options::OPT_static) &&
8319 !Args.hasArg(options::OPT_shared))) {
8320 CmdArgs.push_back("-dynamic-linker");
8321 CmdArgs.push_back(Args.MakeArgString(
8322 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8323 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008324
8325 CmdArgs.push_back("-o");
8326 CmdArgs.push_back(Output.getFilename());
8327
Rafael Espindola81937ec2010-12-01 01:52:43 +00008328 if (!Args.hasArg(options::OPT_nostdlib) &&
8329 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008330 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008331 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008332 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008333 if (Args.hasArg(options::OPT_pg))
8334 crt1 = "gcrt1.o";
8335 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008336 crt1 = "Scrt1.o";
8337 else
8338 crt1 = "crt1.o";
8339 }
8340 if (crt1)
8341 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008342
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008343 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8344 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008345
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008346 const char *crtbegin;
8347 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008348 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008349 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008350 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008351 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008352 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008353 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008354 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008355 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008356
8357 // Add crtfastmath.o if available and fast math is enabled.
8358 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008359 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008360
8361 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008362 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008363
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008364 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008365
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008366 for (const auto &Path : Paths)
8367 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008368
Alexey Samsonov907880e2015-06-19 19:57:46 +00008369 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008370 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008371
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008372 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8373 CmdArgs.push_back("--no-demangle");
8374
Alexey Samsonov52550342014-09-15 19:58:40 +00008375 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008376 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008377 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008378 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008379
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008380 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008381 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008382 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008383 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008384 if (OnlyLibstdcxxStatic)
8385 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008386 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008387 if (OnlyLibstdcxxStatic)
8388 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008389 CmdArgs.push_back("-lm");
8390 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008391 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8392 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008393
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008394 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008395 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8396 if (Args.hasArg(options::OPT_static))
8397 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008398
Alexey Samsonov52550342014-09-15 19:58:40 +00008399 if (NeedsSanitizerDeps)
8400 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8401
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008402 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8403 Args.hasArg(options::OPT_pthreads);
8404
8405 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8406 options::OPT_fno_openmp, false)) {
8407 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8408 // FIXME: Does this really make sense for all GNU toolchains?
8409 WantPthread = true;
8410
8411 // Also link the particular OpenMP runtimes.
8412 switch (getOpenMPRuntime(ToolChain, Args)) {
8413 case OMPRT_OMP:
8414 CmdArgs.push_back("-lomp");
8415 break;
8416 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008417 CmdArgs.push_back("-lgomp");
8418
8419 // FIXME: Exclude this for platforms with libgomp that don't require
8420 // librt. Most modern Linux platforms require it, but some may not.
8421 CmdArgs.push_back("-lrt");
8422 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008423 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008424 CmdArgs.push_back("-liomp5");
8425 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008426 case OMPRT_Unknown:
8427 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008428 break;
8429 }
Chandler Carruth01538002013-01-17 13:19:29 +00008430 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008431
Renato Golinc4b49242014-02-13 10:01:16 +00008432 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008433
Richard Smith31d1de22015-05-20 22:48:44 +00008434 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008435 CmdArgs.push_back("-lpthread");
8436
8437 CmdArgs.push_back("-lc");
8438
8439 if (Args.hasArg(options::OPT_static))
8440 CmdArgs.push_back("--end-group");
8441 else
Renato Golinc4b49242014-02-13 10:01:16 +00008442 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008443 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008444
Rafael Espindola81937ec2010-12-01 01:52:43 +00008445 if (!Args.hasArg(options::OPT_nostartfiles)) {
8446 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008447 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008448 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008449 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008450 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008451 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008452 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008453
Rafael Espindola81937ec2010-12-01 01:52:43 +00008454 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008455 if (!isAndroid)
8456 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008457 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008458 }
8459
Justin Bognerd3371d82015-07-17 03:35:54 +00008460 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8461 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008462}
8463
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008464// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8465// for the various SFI requirements like register masking. The assembly tool
8466// inserts the file containing the macros as an input into all the assembly
8467// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008468void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8469 const InputInfo &Output,
8470 const InputInfoList &Inputs,
8471 const ArgList &Args,
8472 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008473 const toolchains::NaClToolChain &ToolChain =
8474 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008475 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8476 "nacl-arm-macros.s");
8477 InputInfoList NewInputs;
8478 NewInputs.push_back(NaClMacros);
8479 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008480 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8481 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008482}
8483
Douglas Katzman750cfc52015-06-29 18:42:16 +00008484// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008485// we use static by default, do not yet support sanitizers or LTO, and a few
8486// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008487// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008488void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8489 const InputInfo &Output,
8490 const InputInfoList &Inputs,
8491 const ArgList &Args,
8492 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008493
Douglas Katzman54366072015-07-27 16:53:08 +00008494 const toolchains::NaClToolChain &ToolChain =
8495 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008496 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008497 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008498 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008499 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008500
8501 ArgStringList CmdArgs;
8502
8503 // Silence warning for "clang -g foo.o -o foo"
8504 Args.ClaimAllArgs(options::OPT_g_Group);
8505 // and "clang -emit-llvm foo.o -o foo"
8506 Args.ClaimAllArgs(options::OPT_emit_llvm);
8507 // and for "clang -w foo.o -o foo". Other warning options are already
8508 // handled somewhere else.
8509 Args.ClaimAllArgs(options::OPT_w);
8510
8511 if (!D.SysRoot.empty())
8512 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8513
8514 if (Args.hasArg(options::OPT_rdynamic))
8515 CmdArgs.push_back("-export-dynamic");
8516
8517 if (Args.hasArg(options::OPT_s))
8518 CmdArgs.push_back("-s");
8519
Douglas Katzman54366072015-07-27 16:53:08 +00008520 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8521 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008522 CmdArgs.push_back("--build-id");
8523
8524 if (!IsStatic)
8525 CmdArgs.push_back("--eh-frame-hdr");
8526
8527 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008528 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008529 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008530 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008531 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008532 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008533 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008534 else if (Arch == llvm::Triple::mipsel)
8535 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008536 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008537 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8538 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008539
8540 if (IsStatic)
8541 CmdArgs.push_back("-static");
8542 else if (Args.hasArg(options::OPT_shared))
8543 CmdArgs.push_back("-shared");
8544
8545 CmdArgs.push_back("-o");
8546 CmdArgs.push_back(Output.getFilename());
8547 if (!Args.hasArg(options::OPT_nostdlib) &&
8548 !Args.hasArg(options::OPT_nostartfiles)) {
8549 if (!Args.hasArg(options::OPT_shared))
8550 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8551 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8552
8553 const char *crtbegin;
8554 if (IsStatic)
8555 crtbegin = "crtbeginT.o";
8556 else if (Args.hasArg(options::OPT_shared))
8557 crtbegin = "crtbeginS.o";
8558 else
8559 crtbegin = "crtbegin.o";
8560 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8561 }
8562
8563 Args.AddAllArgs(CmdArgs, options::OPT_L);
8564 Args.AddAllArgs(CmdArgs, options::OPT_u);
8565
8566 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8567
8568 for (const auto &Path : Paths)
8569 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8570
8571 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8572 CmdArgs.push_back("--no-demangle");
8573
8574 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8575
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008576 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008577 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008578 bool OnlyLibstdcxxStatic =
8579 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008580 if (OnlyLibstdcxxStatic)
8581 CmdArgs.push_back("-Bstatic");
8582 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8583 if (OnlyLibstdcxxStatic)
8584 CmdArgs.push_back("-Bdynamic");
8585 CmdArgs.push_back("-lm");
8586 }
8587
8588 if (!Args.hasArg(options::OPT_nostdlib)) {
8589 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8590 // Always use groups, since it has no effect on dynamic libraries.
8591 CmdArgs.push_back("--start-group");
8592 CmdArgs.push_back("-lc");
8593 // NaCl's libc++ currently requires libpthread, so just always include it
8594 // in the group for C++.
8595 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008596 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008597 // Gold, used by Mips, handles nested groups differently than ld, and
8598 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8599 // which is not a desired behaviour here.
8600 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8601 if (getToolChain().getArch() == llvm::Triple::mipsel)
8602 CmdArgs.push_back("-lnacl");
8603
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008604 CmdArgs.push_back("-lpthread");
8605 }
8606
8607 CmdArgs.push_back("-lgcc");
8608 CmdArgs.push_back("--as-needed");
8609 if (IsStatic)
8610 CmdArgs.push_back("-lgcc_eh");
8611 else
8612 CmdArgs.push_back("-lgcc_s");
8613 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008614
8615 // Mips needs to create and use pnacl_legacy library that contains
8616 // definitions from bitcode/pnaclmm.c and definitions for
8617 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8618 if (getToolChain().getArch() == llvm::Triple::mipsel)
8619 CmdArgs.push_back("-lpnacl_legacy");
8620
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008621 CmdArgs.push_back("--end-group");
8622 }
8623
8624 if (!Args.hasArg(options::OPT_nostartfiles)) {
8625 const char *crtend;
8626 if (Args.hasArg(options::OPT_shared))
8627 crtend = "crtendS.o";
8628 else
8629 crtend = "crtend.o";
8630
8631 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8632 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8633 }
8634 }
8635
Justin Bognerd3371d82015-07-17 03:35:54 +00008636 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8637 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008638}
8639
Douglas Katzman95354292015-06-23 20:42:09 +00008640void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8641 const InputInfo &Output,
8642 const InputInfoList &Inputs,
8643 const ArgList &Args,
8644 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008645 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008646 ArgStringList CmdArgs;
8647
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008648 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008649
8650 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008651 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008652
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008653 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008654 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008655
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008656 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008657 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008658}
8659
Douglas Katzman95354292015-06-23 20:42:09 +00008660void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8661 const InputInfo &Output,
8662 const InputInfoList &Inputs,
8663 const ArgList &Args,
8664 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008665 const Driver &D = getToolChain().getDriver();
8666 ArgStringList CmdArgs;
8667
Daniel Dunbarb440f562010-08-02 02:38:21 +00008668 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008669 CmdArgs.push_back("-o");
8670 CmdArgs.push_back(Output.getFilename());
8671 } else {
8672 assert(Output.isNothing() && "Invalid output.");
8673 }
8674
8675 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008676 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008677 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8678 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8679 CmdArgs.push_back(
8680 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8681 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008682 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008683
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008684 Args.AddAllArgs(CmdArgs,
8685 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008686
Daniel Dunbar54423b22010-09-17 00:24:54 +00008687 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008688
Alexey Samsonov7811d192014-02-20 13:57:37 +00008689 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008690
Chris Lattner3e2ee142010-07-07 16:01:42 +00008691 if (!Args.hasArg(options::OPT_nostdlib) &&
8692 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008693 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008694 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008695 CmdArgs.push_back("-lm");
8696 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008697 }
8698
8699 if (!Args.hasArg(options::OPT_nostdlib) &&
8700 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008701 if (Args.hasArg(options::OPT_pthread))
8702 CmdArgs.push_back("-lpthread");
8703 CmdArgs.push_back("-lc");
8704 CmdArgs.push_back("-lCompilerRT-Generic");
8705 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8706 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008707 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008708 }
8709
Logan Chieneb9162f2014-06-26 14:23:45 +00008710 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008711 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008712}
8713
Daniel Dunbarcc912342009-05-02 18:28:39 +00008714/// DragonFly Tools
8715
8716// For now, DragonFly Assemble does just about the same as for
8717// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008718void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8719 const InputInfo &Output,
8720 const InputInfoList &Inputs,
8721 const ArgList &Args,
8722 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008723 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008724 ArgStringList CmdArgs;
8725
8726 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8727 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008728 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008729 CmdArgs.push_back("--32");
8730
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008731 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008732
8733 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008734 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008735
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008736 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008737 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008738
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008739 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008740 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008741}
8742
Douglas Katzman95354292015-06-23 20:42:09 +00008743void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8744 const InputInfo &Output,
8745 const InputInfoList &Inputs,
8746 const ArgList &Args,
8747 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008748 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008749 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008750 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008751
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008752 if (!D.SysRoot.empty())
8753 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8754
John McCall65b8da02013-04-11 22:55:55 +00008755 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008756 if (Args.hasArg(options::OPT_static)) {
8757 CmdArgs.push_back("-Bstatic");
8758 } else {
John McCall65b8da02013-04-11 22:55:55 +00008759 if (Args.hasArg(options::OPT_rdynamic))
8760 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008761 if (Args.hasArg(options::OPT_shared))
8762 CmdArgs.push_back("-Bshareable");
8763 else {
8764 CmdArgs.push_back("-dynamic-linker");
8765 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8766 }
John McCall65b8da02013-04-11 22:55:55 +00008767 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008768 }
8769
8770 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8771 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008772 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008773 CmdArgs.push_back("-m");
8774 CmdArgs.push_back("elf_i386");
8775 }
8776
Daniel Dunbarb440f562010-08-02 02:38:21 +00008777 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008778 CmdArgs.push_back("-o");
8779 CmdArgs.push_back(Output.getFilename());
8780 } else {
8781 assert(Output.isNothing() && "Invalid output.");
8782 }
8783
8784 if (!Args.hasArg(options::OPT_nostdlib) &&
8785 !Args.hasArg(options::OPT_nostartfiles)) {
8786 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008787 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008788 CmdArgs.push_back(
8789 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008790 else {
8791 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008792 CmdArgs.push_back(
8793 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008794 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008795 CmdArgs.push_back(
8796 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008797 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008798 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008799 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008800 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008801 CmdArgs.push_back(
8802 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008803 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008804 CmdArgs.push_back(
8805 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008806 }
8807
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008808 Args.AddAllArgs(CmdArgs,
8809 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00008810
Daniel Dunbar54423b22010-09-17 00:24:54 +00008811 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008812
8813 if (!Args.hasArg(options::OPT_nostdlib) &&
8814 !Args.hasArg(options::OPT_nodefaultlibs)) {
8815 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8816 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008817 if (UseGCC47)
8818 CmdArgs.push_back("-L/usr/lib/gcc47");
8819 else
8820 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008821
8822 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008823 if (UseGCC47) {
8824 CmdArgs.push_back("-rpath");
8825 CmdArgs.push_back("/usr/lib/gcc47");
8826 } else {
8827 CmdArgs.push_back("-rpath");
8828 CmdArgs.push_back("/usr/lib/gcc44");
8829 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008830 }
8831
Hans Wennborg70850d82013-07-18 20:29:38 +00008832 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008833 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008834 CmdArgs.push_back("-lm");
8835 }
8836
Daniel Dunbarcc912342009-05-02 18:28:39 +00008837 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008838 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008839
8840 if (!Args.hasArg(options::OPT_nolibc)) {
8841 CmdArgs.push_back("-lc");
8842 }
8843
John McCall65b8da02013-04-11 22:55:55 +00008844 if (UseGCC47) {
8845 if (Args.hasArg(options::OPT_static) ||
8846 Args.hasArg(options::OPT_static_libgcc)) {
8847 CmdArgs.push_back("-lgcc");
8848 CmdArgs.push_back("-lgcc_eh");
8849 } else {
8850 if (Args.hasArg(options::OPT_shared_libgcc)) {
8851 CmdArgs.push_back("-lgcc_pic");
8852 if (!Args.hasArg(options::OPT_shared))
8853 CmdArgs.push_back("-lgcc");
8854 } else {
8855 CmdArgs.push_back("-lgcc");
8856 CmdArgs.push_back("--as-needed");
8857 CmdArgs.push_back("-lgcc_pic");
8858 CmdArgs.push_back("--no-as-needed");
8859 }
8860 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008861 } else {
John McCall65b8da02013-04-11 22:55:55 +00008862 if (Args.hasArg(options::OPT_shared)) {
8863 CmdArgs.push_back("-lgcc_pic");
8864 } else {
8865 CmdArgs.push_back("-lgcc");
8866 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008867 }
8868 }
8869
8870 if (!Args.hasArg(options::OPT_nostdlib) &&
8871 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008872 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008873 CmdArgs.push_back(
8874 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008875 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008876 CmdArgs.push_back(
8877 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8878 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008879 }
8880
Alexey Samsonov7811d192014-02-20 13:57:37 +00008881 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008882
Logan Chieneb9162f2014-06-26 14:23:45 +00008883 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008884 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008885}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008886
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008887// Try to find Exe from a Visual Studio distribution. This first tries to find
8888// an installed copy of Visual Studio and, failing that, looks in the PATH,
8889// making sure that whatever executable that's found is not a same-named exe
8890// from clang itself to prevent clang from falling back to itself.
8891static std::string FindVisualStudioExecutable(const ToolChain &TC,
8892 const char *Exe,
8893 const char *ClangProgramPath) {
8894 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8895 std::string visualStudioBinDir;
8896 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8897 visualStudioBinDir)) {
8898 SmallString<128> FilePath(visualStudioBinDir);
8899 llvm::sys::path::append(FilePath, Exe);
8900 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8901 return FilePath.str();
8902 }
8903
8904 return Exe;
8905}
8906
Douglas Katzman95354292015-06-23 20:42:09 +00008907void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8908 const InputInfo &Output,
8909 const InputInfoList &Inputs,
8910 const ArgList &Args,
8911 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008912 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008913 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008914
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008915 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8916 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008917 CmdArgs.push_back(
8918 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008919
8920 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008921 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008922 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008923
Zachary Turner10d75b22014-10-22 20:40:43 +00008924 if (!llvm::sys::Process::GetEnv("LIB")) {
8925 // If the VC environment hasn't been configured (perhaps because the user
8926 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008927 // the environment variable is set however, assume the user knows what
8928 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008929 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008930 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008931 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8932 SmallString<128> LibDir(VisualStudioDir);
8933 llvm::sys::path::append(LibDir, "VC", "lib");
8934 switch (MSVC.getArch()) {
8935 case llvm::Triple::x86:
8936 // x86 just puts the libraries directly in lib
8937 break;
8938 case llvm::Triple::x86_64:
8939 llvm::sys::path::append(LibDir, "amd64");
8940 break;
8941 case llvm::Triple::arm:
8942 llvm::sys::path::append(LibDir, "arm");
8943 break;
8944 default:
8945 break;
8946 }
8947 CmdArgs.push_back(
8948 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00008949
8950 if (MSVC.useUniversalCRT(VisualStudioDir)) {
8951 std::string UniversalCRTLibPath;
8952 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
8953 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8954 UniversalCRTLibPath.c_str()));
8955 }
Zachary Turner10d75b22014-10-22 20:40:43 +00008956 }
8957
8958 std::string WindowsSdkLibPath;
8959 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8960 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8961 WindowsSdkLibPath.c_str()));
8962 }
8963
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008964 CmdArgs.push_back("-nologo");
8965
Reid Kleckner124955a2015-08-05 18:51:13 +00008966 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008967 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008968
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008969 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00008970 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008971 if (DLL) {
8972 CmdArgs.push_back(Args.MakeArgString("-dll"));
8973
8974 SmallString<128> ImplibName(Output.getFilename());
8975 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008976 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008977 }
8978
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008979 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008980 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008981 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008982 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008983 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008984 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008985 };
8986 for (const auto &Component : CompilerRTComponents)
8987 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008988 // Make sure the dynamic runtime thunk is not optimized out at link time
8989 // to ensure proper SEH handling.
8990 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008991 } else if (DLL) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008992 CmdArgs.push_back(
8993 Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008994 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008995 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008996 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008997 };
8998 for (const auto &Component : CompilerRTComponents)
8999 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009000 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009001 }
9002
Hans Wennborg2e274592013-08-13 23:38:57 +00009003 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009004
Alexey Bataevc7e84352015-08-19 04:49:01 +00009005 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9006 options::OPT_fno_openmp, false)) {
9007 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9008 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9009 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9010 TC.getDriver().Dir + "/../lib"));
9011 switch (getOpenMPRuntime(getToolChain(), Args)) {
9012 case OMPRT_OMP:
9013 CmdArgs.push_back("-defaultlib:libomp.lib");
9014 break;
9015 case OMPRT_IOMP5:
9016 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9017 break;
9018 case OMPRT_GOMP:
9019 break;
9020 case OMPRT_Unknown:
9021 // Already diagnosed.
9022 break;
9023 }
9024 }
9025
Reid Kleckner337188f2014-09-16 19:22:00 +00009026 // Add filenames, libraries, and other linker inputs.
9027 for (const auto &Input : Inputs) {
9028 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009029 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009030 continue;
9031 }
9032
9033 const Arg &A = Input.getInputArg();
9034
9035 // Render -l options differently for the MSVC linker.
9036 if (A.getOption().matches(options::OPT_l)) {
9037 StringRef Lib = A.getValue();
9038 const char *LinkLibArg;
9039 if (Lib.endswith(".lib"))
9040 LinkLibArg = Args.MakeArgString(Lib);
9041 else
9042 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9043 CmdArgs.push_back(LinkLibArg);
9044 continue;
9045 }
9046
9047 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9048 // or -L. Render it, even if MSVC doesn't understand it.
9049 A.renderAsInput(Args, CmdArgs);
9050 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009051
Zachary Turner719f58c2014-12-01 23:06:47 +00009052 // We need to special case some linker paths. In the case of lld, we need to
9053 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9054 // linker, we need to use a special search algorithm.
9055 llvm::SmallString<128> linkPath;
9056 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9057 if (Linker.equals_lower("lld"))
9058 Linker = "lld-link";
9059
9060 if (Linker.equals_lower("link")) {
9061 // If we're using the MSVC linker, it's not sufficient to just use link
9062 // from the program PATH, because other environments like GnuWin32 install
9063 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009064 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009065 C.getDriver().getClangProgramPath());
9066 } else {
9067 linkPath = Linker;
9068 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009069 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009070 }
9071
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009072 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009073 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009074}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009075
Douglas Katzman95354292015-06-23 20:42:09 +00009076void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9077 const InputInfo &Output,
9078 const InputInfoList &Inputs,
9079 const ArgList &Args,
9080 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009081 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9082}
9083
Douglas Katzman95354292015-06-23 20:42:09 +00009084std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009085 Compilation &C, const JobAction &JA, const InputInfo &Output,
9086 const InputInfoList &Inputs, const ArgList &Args,
9087 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009088 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009089 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009090 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009091 CmdArgs.push_back("/W0"); // No warnings.
9092
9093 // The goal is to be able to invoke this tool correctly based on
9094 // any flag accepted by clang-cl.
9095
9096 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009097 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009098
9099 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009100 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9101 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9102 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009103 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9104 if (A->getOption().getID() == options::OPT_O0) {
9105 CmdArgs.push_back("/Od");
9106 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009107 CmdArgs.push_back("/Og");
9108
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009109 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009110 if (OptLevel == "s" || OptLevel == "z")
9111 CmdArgs.push_back("/Os");
9112 else
9113 CmdArgs.push_back("/Ot");
9114
9115 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009116 }
9117 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009118 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9119 options::OPT_fno_omit_frame_pointer))
9120 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9121 ? "/Oy"
9122 : "/Oy-");
9123 if (!Args.hasArg(options::OPT_fwritable_strings))
9124 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009125
Nico Weber3f8dafb2015-03-12 19:37:10 +00009126 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009127 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9128
David Majnemerf6072342014-07-01 22:24:56 +00009129 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9130 /*default=*/false))
9131 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009132 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9133 options::OPT_fno_function_sections))
9134 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9135 ? "/Gy"
9136 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009137 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9138 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009139 CmdArgs.push_back(
9140 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009141 if (Args.hasArg(options::OPT_fsyntax_only))
9142 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009143 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9144 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009145 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009146
Nico Weber3f8dafb2015-03-12 19:37:10 +00009147 std::vector<std::string> Includes =
9148 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009149 for (const auto &Include : Includes)
9150 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009151
Hans Wennborg87cfa712013-09-19 20:32:16 +00009152 // Flags that can simply be passed through.
9153 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9154 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009155 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009156 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009157
9158 // The order of these flags is relevant, so pick the last one.
9159 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9160 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9161 A->render(Args, CmdArgs);
9162
Hans Wennborg87cfa712013-09-19 20:32:16 +00009163 // Input filename.
9164 assert(Inputs.size() == 1);
9165 const InputInfo &II = Inputs[0];
9166 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9167 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9168 if (II.isFilename())
9169 CmdArgs.push_back(II.getFilename());
9170 else
9171 II.getInputArg().renderAsInput(Args, CmdArgs);
9172
9173 // Output filename.
9174 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009175 const char *Fo =
9176 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009177 CmdArgs.push_back(Fo);
9178
Hans Wennborg188382e2013-09-20 18:16:35 +00009179 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009180 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9181 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009182 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009183 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009184}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009185
Yaron Keren1c0070c2015-07-02 04:45:27 +00009186/// MinGW Tools
9187void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9188 const InputInfo &Output,
9189 const InputInfoList &Inputs,
9190 const ArgList &Args,
9191 const char *LinkingOutput) const {
9192 claimNoWarnArgs(Args);
9193 ArgStringList CmdArgs;
9194
9195 if (getToolChain().getArch() == llvm::Triple::x86) {
9196 CmdArgs.push_back("--32");
9197 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9198 CmdArgs.push_back("--64");
9199 }
9200
9201 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9202
9203 CmdArgs.push_back("-o");
9204 CmdArgs.push_back(Output.getFilename());
9205
9206 for (const auto &II : Inputs)
9207 CmdArgs.push_back(II.getFilename());
9208
9209 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009210 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009211
9212 if (Args.hasArg(options::OPT_gsplit_dwarf))
9213 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9214 SplitDebugName(Args, Inputs[0]));
9215}
9216
9217void MinGW::Linker::AddLibGCC(const ArgList &Args,
9218 ArgStringList &CmdArgs) const {
9219 if (Args.hasArg(options::OPT_mthreads))
9220 CmdArgs.push_back("-lmingwthrd");
9221 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009222
Yaron Kerenaa281332015-08-09 00:24:07 +00009223 // Make use of compiler-rt if --rtlib option is used
9224 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9225 if (RLT == ToolChain::RLT_Libgcc) {
9226 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9227 Args.hasArg(options::OPT_static);
9228 bool Shared = Args.hasArg(options::OPT_shared);
9229 bool CXX = getToolChain().getDriver().CCCIsCXX();
9230
9231 if (Static || (!CXX && !Shared)) {
9232 CmdArgs.push_back("-lgcc");
9233 CmdArgs.push_back("-lgcc_eh");
9234 } else {
9235 CmdArgs.push_back("-lgcc_s");
9236 CmdArgs.push_back("-lgcc");
9237 }
9238 } else {
9239 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9240 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009241
Yaron Keren1c0070c2015-07-02 04:45:27 +00009242 CmdArgs.push_back("-lmoldname");
9243 CmdArgs.push_back("-lmingwex");
9244 CmdArgs.push_back("-lmsvcrt");
9245}
9246
9247void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9248 const InputInfo &Output,
9249 const InputInfoList &Inputs,
9250 const ArgList &Args,
9251 const char *LinkingOutput) const {
9252 const ToolChain &TC = getToolChain();
9253 const Driver &D = TC.getDriver();
9254 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9255
9256 ArgStringList CmdArgs;
9257
9258 // Silence warning for "clang -g foo.o -o foo"
9259 Args.ClaimAllArgs(options::OPT_g_Group);
9260 // and "clang -emit-llvm foo.o -o foo"
9261 Args.ClaimAllArgs(options::OPT_emit_llvm);
9262 // and for "clang -w foo.o -o foo". Other warning options are already
9263 // handled somewhere else.
9264 Args.ClaimAllArgs(options::OPT_w);
9265
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009266 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9267 if (LinkerName.equals_lower("lld")) {
9268 CmdArgs.push_back("-flavor");
9269 CmdArgs.push_back("gnu");
9270 }
9271
Yaron Keren1c0070c2015-07-02 04:45:27 +00009272 if (!D.SysRoot.empty())
9273 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9274
9275 if (Args.hasArg(options::OPT_s))
9276 CmdArgs.push_back("-s");
9277
9278 CmdArgs.push_back("-m");
9279 if (TC.getArch() == llvm::Triple::x86)
9280 CmdArgs.push_back("i386pe");
9281 if (TC.getArch() == llvm::Triple::x86_64)
9282 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009283 if (TC.getArch() == llvm::Triple::arm)
9284 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009285
9286 if (Args.hasArg(options::OPT_mwindows)) {
9287 CmdArgs.push_back("--subsystem");
9288 CmdArgs.push_back("windows");
9289 } else if (Args.hasArg(options::OPT_mconsole)) {
9290 CmdArgs.push_back("--subsystem");
9291 CmdArgs.push_back("console");
9292 }
9293
9294 if (Args.hasArg(options::OPT_static))
9295 CmdArgs.push_back("-Bstatic");
9296 else {
9297 if (Args.hasArg(options::OPT_mdll))
9298 CmdArgs.push_back("--dll");
9299 else if (Args.hasArg(options::OPT_shared))
9300 CmdArgs.push_back("--shared");
9301 CmdArgs.push_back("-Bdynamic");
9302 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9303 CmdArgs.push_back("-e");
9304 if (TC.getArch() == llvm::Triple::x86)
9305 CmdArgs.push_back("_DllMainCRTStartup@12");
9306 else
9307 CmdArgs.push_back("DllMainCRTStartup");
9308 CmdArgs.push_back("--enable-auto-image-base");
9309 }
9310 }
9311
9312 CmdArgs.push_back("-o");
9313 CmdArgs.push_back(Output.getFilename());
9314
9315 Args.AddAllArgs(CmdArgs, options::OPT_e);
9316 // FIXME: add -N, -n flags
9317 Args.AddLastArg(CmdArgs, options::OPT_r);
9318 Args.AddLastArg(CmdArgs, options::OPT_s);
9319 Args.AddLastArg(CmdArgs, options::OPT_t);
9320 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9321 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9322
9323 if (!Args.hasArg(options::OPT_nostdlib) &&
9324 !Args.hasArg(options::OPT_nostartfiles)) {
9325 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9326 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9327 } else {
9328 if (Args.hasArg(options::OPT_municode))
9329 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9330 else
9331 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9332 }
9333 if (Args.hasArg(options::OPT_pg))
9334 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9335 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9336 }
9337
9338 Args.AddAllArgs(CmdArgs, options::OPT_L);
9339 const ToolChain::path_list Paths = TC.getFilePaths();
9340 for (const auto &Path : Paths)
9341 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9342
9343 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9344
9345 // TODO: Add ASan stuff here
9346
9347 // TODO: Add profile stuff here
9348
9349 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9350 !Args.hasArg(options::OPT_nodefaultlibs)) {
9351 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9352 !Args.hasArg(options::OPT_static);
9353 if (OnlyLibstdcxxStatic)
9354 CmdArgs.push_back("-Bstatic");
9355 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9356 if (OnlyLibstdcxxStatic)
9357 CmdArgs.push_back("-Bdynamic");
9358 }
9359
9360 if (!Args.hasArg(options::OPT_nostdlib)) {
9361 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9362 if (Args.hasArg(options::OPT_static))
9363 CmdArgs.push_back("--start-group");
9364
9365 if (Args.hasArg(options::OPT_fstack_protector) ||
9366 Args.hasArg(options::OPT_fstack_protector_strong) ||
9367 Args.hasArg(options::OPT_fstack_protector_all)) {
9368 CmdArgs.push_back("-lssp_nonshared");
9369 CmdArgs.push_back("-lssp");
9370 }
9371 if (Args.hasArg(options::OPT_fopenmp))
9372 CmdArgs.push_back("-lgomp");
9373
9374 AddLibGCC(Args, CmdArgs);
9375
9376 if (Args.hasArg(options::OPT_pg))
9377 CmdArgs.push_back("-lgmon");
9378
Yaron Kerenadce68e2015-07-06 18:52:19 +00009379 if (Args.hasArg(options::OPT_pthread))
9380 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009381
9382 // add system libraries
9383 if (Args.hasArg(options::OPT_mwindows)) {
9384 CmdArgs.push_back("-lgdi32");
9385 CmdArgs.push_back("-lcomdlg32");
9386 }
9387 CmdArgs.push_back("-ladvapi32");
9388 CmdArgs.push_back("-lshell32");
9389 CmdArgs.push_back("-luser32");
9390 CmdArgs.push_back("-lkernel32");
9391
9392 if (Args.hasArg(options::OPT_static))
9393 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009394 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009395 AddLibGCC(Args, CmdArgs);
9396 }
9397
9398 if (!Args.hasArg(options::OPT_nostartfiles)) {
9399 // Add crtfastmath.o if available and fast math is enabled.
9400 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9401
9402 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9403 }
9404 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009405 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009406 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009407}
9408
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009409/// XCore Tools
9410// We pass assemble and link construction to the xcc tool.
9411
Douglas Katzman95354292015-06-23 20:42:09 +00009412void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9413 const InputInfo &Output,
9414 const InputInfoList &Inputs,
9415 const ArgList &Args,
9416 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009417 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009418 ArgStringList CmdArgs;
9419
9420 CmdArgs.push_back("-o");
9421 CmdArgs.push_back(Output.getFilename());
9422
9423 CmdArgs.push_back("-c");
9424
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009425 if (Args.hasArg(options::OPT_v))
9426 CmdArgs.push_back("-v");
9427
Robert Lytton894d25c2014-05-02 09:33:25 +00009428 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9429 if (!A->getOption().matches(options::OPT_g0))
9430 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009431
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009432 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9433 false))
9434 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009435
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009436 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009437
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009438 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009439 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009440
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009441 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009442 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009443}
9444
Douglas Katzman95354292015-06-23 20:42:09 +00009445void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9446 const InputInfo &Output,
9447 const InputInfoList &Inputs,
9448 const ArgList &Args,
9449 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009450 ArgStringList CmdArgs;
9451
9452 if (Output.isFilename()) {
9453 CmdArgs.push_back("-o");
9454 CmdArgs.push_back(Output.getFilename());
9455 } else {
9456 assert(Output.isNothing() && "Invalid output.");
9457 }
9458
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009459 if (Args.hasArg(options::OPT_v))
9460 CmdArgs.push_back("-v");
9461
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009462 // Pass -fexceptions through to the linker if it was present.
9463 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9464 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009465 CmdArgs.push_back("-fexceptions");
9466
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009467 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9468
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009469 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009470 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009471}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009472
Douglas Katzman95354292015-06-23 20:42:09 +00009473void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9474 const InputInfo &Output,
9475 const InputInfoList &Inputs,
9476 const ArgList &Args,
9477 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009478 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009479 const auto &TC =
9480 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9481 ArgStringList CmdArgs;
9482 const char *Exec;
9483
9484 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009485 default:
9486 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009487 case llvm::Triple::arm:
9488 case llvm::Triple::thumb:
9489 break;
9490 case llvm::Triple::x86:
9491 CmdArgs.push_back("--32");
9492 break;
9493 case llvm::Triple::x86_64:
9494 CmdArgs.push_back("--64");
9495 break;
9496 }
9497
9498 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9499
9500 CmdArgs.push_back("-o");
9501 CmdArgs.push_back(Output.getFilename());
9502
9503 for (const auto &Input : Inputs)
9504 CmdArgs.push_back(Input.getFilename());
9505
9506 const std::string Assembler = TC.GetProgramPath("as");
9507 Exec = Args.MakeArgString(Assembler);
9508
Justin Bognerd3371d82015-07-17 03:35:54 +00009509 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009510}
9511
Douglas Katzman95354292015-06-23 20:42:09 +00009512void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9513 const InputInfo &Output,
9514 const InputInfoList &Inputs,
9515 const ArgList &Args,
9516 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009517 const auto &TC =
9518 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9519 const llvm::Triple &T = TC.getTriple();
9520 const Driver &D = TC.getDriver();
9521 SmallString<128> EntryPoint;
9522 ArgStringList CmdArgs;
9523 const char *Exec;
9524
9525 // Silence warning for "clang -g foo.o -o foo"
9526 Args.ClaimAllArgs(options::OPT_g_Group);
9527 // and "clang -emit-llvm foo.o -o foo"
9528 Args.ClaimAllArgs(options::OPT_emit_llvm);
9529 // and for "clang -w foo.o -o foo"
9530 Args.ClaimAllArgs(options::OPT_w);
9531 // Other warning options are already handled somewhere else.
9532
9533 if (!D.SysRoot.empty())
9534 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9535
9536 if (Args.hasArg(options::OPT_pie))
9537 CmdArgs.push_back("-pie");
9538 if (Args.hasArg(options::OPT_rdynamic))
9539 CmdArgs.push_back("-export-dynamic");
9540 if (Args.hasArg(options::OPT_s))
9541 CmdArgs.push_back("--strip-all");
9542
9543 CmdArgs.push_back("-m");
9544 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009545 default:
9546 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009547 case llvm::Triple::arm:
9548 case llvm::Triple::thumb:
9549 // FIXME: this is incorrect for WinCE
9550 CmdArgs.push_back("thumb2pe");
9551 break;
9552 case llvm::Triple::x86:
9553 CmdArgs.push_back("i386pe");
9554 EntryPoint.append("_");
9555 break;
9556 case llvm::Triple::x86_64:
9557 CmdArgs.push_back("i386pep");
9558 break;
9559 }
9560
9561 if (Args.hasArg(options::OPT_shared)) {
9562 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009563 default:
9564 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009565 case llvm::Triple::arm:
9566 case llvm::Triple::thumb:
9567 case llvm::Triple::x86_64:
9568 EntryPoint.append("_DllMainCRTStartup");
9569 break;
9570 case llvm::Triple::x86:
9571 EntryPoint.append("_DllMainCRTStartup@12");
9572 break;
9573 }
9574
9575 CmdArgs.push_back("-shared");
9576 CmdArgs.push_back("-Bdynamic");
9577
9578 CmdArgs.push_back("--enable-auto-image-base");
9579
9580 CmdArgs.push_back("--entry");
9581 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9582 } else {
9583 EntryPoint.append("mainCRTStartup");
9584
9585 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9586 : "-Bdynamic");
9587
9588 if (!Args.hasArg(options::OPT_nostdlib) &&
9589 !Args.hasArg(options::OPT_nostartfiles)) {
9590 CmdArgs.push_back("--entry");
9591 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9592 }
9593
9594 // FIXME: handle subsystem
9595 }
9596
9597 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009598 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009599
9600 CmdArgs.push_back("-o");
9601 CmdArgs.push_back(Output.getFilename());
9602
9603 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9604 SmallString<261> ImpLib(Output.getFilename());
9605 llvm::sys::path::replace_extension(ImpLib, ".lib");
9606
9607 CmdArgs.push_back("--out-implib");
9608 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9609 }
9610
9611 if (!Args.hasArg(options::OPT_nostdlib) &&
9612 !Args.hasArg(options::OPT_nostartfiles)) {
9613 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9614 const char *CRTBegin;
9615
9616 CRTBegin =
9617 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9618 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9619 }
9620
9621 Args.AddAllArgs(CmdArgs, options::OPT_L);
9622
9623 const auto &Paths = TC.getFilePaths();
9624 for (const auto &Path : Paths)
9625 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9626
9627 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9628
9629 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9630 !Args.hasArg(options::OPT_nodefaultlibs)) {
9631 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9632 !Args.hasArg(options::OPT_static);
9633 if (StaticCXX)
9634 CmdArgs.push_back("-Bstatic");
9635 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9636 if (StaticCXX)
9637 CmdArgs.push_back("-Bdynamic");
9638 }
9639
9640 if (!Args.hasArg(options::OPT_nostdlib)) {
9641 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9642 // TODO handle /MT[d] /MD[d]
9643 CmdArgs.push_back("-lmsvcrt");
9644 AddRunTimeLibs(TC, D, CmdArgs, Args);
9645 }
9646 }
9647
9648 const std::string Linker = TC.GetProgramPath("ld");
9649 Exec = Args.MakeArgString(Linker);
9650
Justin Bognerd3371d82015-07-17 03:35:54 +00009651 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009652}
Douglas Katzman84a75642015-06-19 14:55:19 +00009653
Douglas Katzman95354292015-06-23 20:42:09 +00009654void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9655 const InputInfo &Output,
9656 const InputInfoList &Inputs,
9657 const ArgList &Args,
9658 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009659
9660 ArgStringList CmdArgs;
9661
9662 assert(Inputs.size() == 1);
9663 const InputInfo &II = Inputs[0];
9664 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9665 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9666
Douglas Katzman84a75642015-06-19 14:55:19 +00009667 CmdArgs.push_back("-DMYRIAD2");
9668 CmdArgs.push_back("-mcpu=myriad2");
9669 CmdArgs.push_back("-S");
9670
Douglas Katzmanf6071112015-08-03 14:34:22 +00009671 // Append all -I, -iquote, -isystem paths, defines/undefines,
9672 // 'f' flags, optimize flags, and warning options.
9673 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +00009674 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
9675 options::OPT_D, options::OPT_U,
9676 options::OPT_f_Group, options::OPT_f_clang_Group,
9677 options::OPT_g_Group, options::OPT_M_Group,
9678 options::OPT_O_Group, options::OPT_W_Group});
9679
9680 // If we're producing a dependency file, and assembly is the final action,
9681 // then the name of the target in the dependency file should be the '.o'
9682 // file, not the '.s' file produced by this step. For example, instead of
9683 // /tmp/mumble.s: mumble.c .../someheader.h
9684 // the filename on the lefthand side should be "mumble.o"
9685 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
9686 C.getActions().size() == 1 &&
9687 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
9688 Arg *A = Args.getLastArg(options::OPT_o);
9689 if (A) {
9690 CmdArgs.push_back("-MT");
9691 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
9692 }
9693 }
9694
Douglas Katzman84a75642015-06-19 14:55:19 +00009695 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9696
9697 CmdArgs.push_back(II.getFilename());
9698 CmdArgs.push_back("-o");
9699 CmdArgs.push_back(Output.getFilename());
9700
9701 std::string Exec =
9702 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009703 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9704 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009705}
9706
Douglas Katzman95354292015-06-23 20:42:09 +00009707void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9708 const InputInfo &Output,
9709 const InputInfoList &Inputs,
9710 const ArgList &Args,
9711 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009712 ArgStringList CmdArgs;
9713
9714 assert(Inputs.size() == 1);
9715 const InputInfo &II = Inputs[0];
9716 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9717 assert(Output.getType() == types::TY_Object);
9718
9719 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009720 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +00009721 CmdArgs.push_back("-noSPrefixing");
9722 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009723 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9724 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
9725 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +00009726 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009727 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +00009728 }
9729 CmdArgs.push_back("-elf"); // Output format.
9730 CmdArgs.push_back(II.getFilename());
9731 CmdArgs.push_back(
9732 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9733
9734 std::string Exec =
9735 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009736 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9737 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009738}