blob: 74a49580b0bfac73d428186b2a7c017365b04834 [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Daniel Dunbar64198ef2009-09-10 01:21:05 +000055/// CheckPreprocessingOptions - Perform some validation of preprocessing
56/// arguments that is shared with gcc.
57static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000058 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
59 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
60 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000061 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000062 << A->getBaseArg().getAsString(Args)
63 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
64 }
65 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000066}
67
Daniel Dunbar4eadb602009-09-10 01:21:12 +000068/// CheckCodeGenerationOptions - Perform some validation of code generation
69/// arguments that is shared with gcc.
70static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
71 // In gcc, only ARM checks this, but it seems reasonable to check universally.
72 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +000073 if (const Arg *A =
74 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
75 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
76 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +000077}
78
Bob Wilsond5aad2a2014-11-04 22:28:48 +000079// Add backslashes to escape spaces and other backslashes.
80// This is used for the space-separated argument list specified with
81// the -dwarf-debug-flags option.
82static void EscapeSpacesAndBackslashes(const char *Arg,
83 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000084 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +000085 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000086 default:
87 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +000088 case ' ':
89 case '\\':
90 Res.push_back('\\');
91 break;
92 }
93 Res.push_back(*Arg);
94 }
95}
96
Chris Lattnerbf2803f2010-03-29 17:55:58 +000097// Quote target names for inclusion in GNU Make dependency files.
98// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +000099static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000100 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
101 switch (Target[i]) {
102 case ' ':
103 case '\t':
104 // Escape the preceding backslashes
105 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
106 Res.push_back('\\');
107
108 // Escape the space/tab
109 Res.push_back('\\');
110 break;
111 case '$':
112 Res.push_back('$');
113 break;
114 case '#':
115 Res.push_back('\\');
116 break;
117 default:
118 break;
119 }
120
121 Res.push_back(Target[i]);
122 }
123}
124
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000125static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
126 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000127 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000128 bool CombinedArg = false;
129
Bill Wendling281ca292012-03-12 21:22:35 +0000130 if (!DirList)
131 return; // Nothing to do.
132
Chad Rosier616e8a52012-10-30 21:42:09 +0000133 StringRef Name(ArgName);
134 if (Name.equals("-I") || Name.equals("-L"))
135 CombinedArg = true;
136
Bill Wendling281ca292012-03-12 21:22:35 +0000137 StringRef Dirs(DirList);
138 if (Dirs.empty()) // Empty string should not add '.'.
139 return;
140
141 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000142 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000143 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000144 if (CombinedArg) {
145 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
146 } else {
147 CmdArgs.push_back(ArgName);
148 CmdArgs.push_back(".");
149 }
Bill Wendling281ca292012-03-12 21:22:35 +0000150 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000151 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000152 CmdArgs.push_back(
153 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000154 } else {
155 CmdArgs.push_back(ArgName);
156 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
157 }
Bill Wendling281ca292012-03-12 21:22:35 +0000158 }
Nico Weber89355782012-03-19 15:00:03 +0000159 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000160 }
161
162 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000163 if (CombinedArg) {
164 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
165 } else {
166 CmdArgs.push_back(ArgName);
167 CmdArgs.push_back(".");
168 }
Bill Wendling281ca292012-03-12 21:22:35 +0000169 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000170 if (CombinedArg) {
171 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
172 } else {
173 CmdArgs.push_back(ArgName);
174 CmdArgs.push_back(Args.MakeArgString(Dirs));
175 }
Bill Wendling281ca292012-03-12 21:22:35 +0000176 }
177}
178
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000179static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
180 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000181 const Driver &D = TC.getDriver();
182
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000183 // Add extra linker input arguments which are not treated as inputs
184 // (constructed via -Xarch_).
185 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
186
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000187 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000188 if (!TC.HasNativeLLVMSupport()) {
189 // Don't try to pass LLVM inputs unless we have native support.
190 if (II.getType() == types::TY_LLVM_IR ||
191 II.getType() == types::TY_LTO_IR ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000192 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
193 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000194 }
195
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000196 // Add filenames immediately.
197 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000198 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000199 continue;
200 }
201
202 // Otherwise, this is a linker input argument.
203 const Arg &A = II.getInputArg();
204
205 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000206 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000207 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000208 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000209 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000210 else if (A.getOption().matches(options::OPT_z)) {
211 // Pass -z prefix for gcc linker compatibility.
212 A.claim();
213 A.render(Args, CmdArgs);
214 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000215 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000216 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000217 }
Bill Wendling281ca292012-03-12 21:22:35 +0000218
219 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000220 // and only supported on native toolchains.
221 if (!TC.isCrossCompiling())
222 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000223}
224
John McCall31168b02011-06-15 23:02:42 +0000225/// \brief Determine whether Objective-C automated reference counting is
226/// enabled.
227static bool isObjCAutoRefCount(const ArgList &Args) {
228 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
229}
230
Ted Kremeneke65b0862012-03-06 20:05:56 +0000231/// \brief Determine whether we are linking the ObjC runtime.
232static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000233 if (isObjCAutoRefCount(Args)) {
234 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000235 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000236 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000237 return Args.hasArg(options::OPT_fobjc_link_runtime);
238}
239
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000240static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000241 // Don't forward inputs from the original command line. They are added from
242 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000243 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000244 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000245}
246
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000247void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
248 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000249 ArgStringList &CmdArgs,
250 const InputInfo &Output,
251 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000252 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000253
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000254 CheckPreprocessingOptions(D, Args);
255
256 Args.AddLastArg(CmdArgs, options::OPT_C);
257 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000258
259 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000260 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000261 (A = Args.getLastArg(options::OPT_MD)) ||
262 (A = Args.getLastArg(options::OPT_MMD))) {
263 // Determine the output location.
264 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000265 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000266 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000267 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000268 } else if (Output.getType() == types::TY_Dependencies) {
269 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000270 } else if (A->getOption().matches(options::OPT_M) ||
271 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000272 DepFile = "-";
273 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000274 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000275 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000276 }
277 CmdArgs.push_back("-dependency-file");
278 CmdArgs.push_back(DepFile);
279
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000280 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000281 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
282 const char *DepTarget;
283
284 // If user provided -o, that is the dependency target, except
285 // when we are only generating a dependency file.
286 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
287 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000288 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000289 } else {
290 // Otherwise derive from the base input.
291 //
292 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000293 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000294 llvm::sys::path::replace_extension(P, "o");
295 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000296 }
297
298 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000299 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000300 QuoteTarget(DepTarget, Quoted);
301 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000302 }
303
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000304 if (A->getOption().matches(options::OPT_M) ||
305 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000307 if ((isa<PrecompileJobAction>(JA) &&
308 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
309 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000310 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000311 }
312
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000313 if (Args.hasArg(options::OPT_MG)) {
314 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000315 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000316 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000317 CmdArgs.push_back("-MG");
318 }
319
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000320 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000321 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000322
323 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000324 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000325 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000326
Daniel Dunbara442fd52010-06-11 22:00:13 +0000327 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000328 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000329 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000330 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000331 CmdArgs.push_back(Args.MakeArgString(Quoted));
332
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000333 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000334 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000335 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000336 }
337 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000338
Douglas Gregor111af7d2009-04-18 00:34:01 +0000339 // Add -i* options, and automatically translate to
340 // -include-pch/-include-pth for transparent PCH support. It's
341 // wonky, but we include looking for .gch so we can support seamless
342 // replacement into a build system already set up to be generating
343 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000344 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000345 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000346 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000347 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
348 RenderedImplicitInclude = true;
349
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000350 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000351 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000352
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000353 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000354 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000355 SmallString<128> P(A->getValue());
356 // We want the files to have a name like foo.h.pch. Add a dummy extension
357 // so that replace_extension does the right thing.
358 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000359 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000360 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000361 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000362 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000363 }
364
Douglas Gregor111af7d2009-04-18 00:34:01 +0000365 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000366 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000367 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000368 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000369 }
370
Douglas Gregor111af7d2009-04-18 00:34:01 +0000371 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000372 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000373 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000374 FoundPCH = UsePCH;
375 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000376 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000377 }
378
379 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000380 if (IsFirstImplicitInclude) {
381 A->claim();
382 if (UsePCH)
383 CmdArgs.push_back("-include-pch");
384 else
385 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000386 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000387 continue;
388 } else {
389 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000390 D.Diag(diag::warn_drv_pch_not_first_include) << P
391 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000392 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000393 }
394 }
395
396 // Not translated, render as usual.
397 A->claim();
398 A->render(Args, CmdArgs);
399 }
400
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000401 Args.AddAllArgs(CmdArgs,
402 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
403 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000404
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000405 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000406
407 // FIXME: There is a very unfortunate problem here, some troubled
408 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
409 // really support that we would have to parse and then translate
410 // those options. :(
411 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
412 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000413
414 // -I- is a deprecated GCC feature, reject it.
415 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000416 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000417
418 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
419 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000420 StringRef sysroot = C.getSysRoot();
421 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000422 if (!Args.hasArg(options::OPT_isysroot)) {
423 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000424 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000425 }
426 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000427
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000428 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000429 // FIXME: We should probably sink the logic for handling these from the
430 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000431 // CPATH - included following the user specified includes (but prior to
432 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000433 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000434 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000435 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000436 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000437 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000438 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000439 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000440 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000441 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000442
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000443 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000444 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000445 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000446
447 // Add system include arguments.
448 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000449}
450
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000451// FIXME: Move to target hook.
452static bool isSignedCharDefault(const llvm::Triple &Triple) {
453 switch (Triple.getArch()) {
454 default:
455 return true;
456
Tim Northover9bb857a2013-01-31 12:13:10 +0000457 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000458 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000459 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000460 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000461 case llvm::Triple::thumb:
462 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000463 if (Triple.isOSDarwin() || Triple.isOSWindows())
464 return true;
465 return false;
466
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000467 case llvm::Triple::ppc:
468 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000469 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000470 return true;
471 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000472
David Majnemerdcecd932015-05-23 19:23:55 +0000473 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000474 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000475 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000476 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000477 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000478 }
479}
480
Robert Lytton0e076492013-08-13 09:43:10 +0000481static bool isNoCommonDefault(const llvm::Triple &Triple) {
482 switch (Triple.getArch()) {
483 default:
484 return false;
485
486 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000487 case llvm::Triple::wasm32:
488 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000489 return true;
490 }
491}
492
Renato Goline17c5802015-07-27 23:44:42 +0000493// ARM tools start.
494
495// Get SubArch (vN).
496static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
497 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000498 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000499}
500
501// True if M-profile.
502static bool isARMMProfile(const llvm::Triple &Triple) {
503 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000504 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000505 return Profile == llvm::ARM::PK_M;
506}
507
508// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000509static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
510 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000511 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
512 CPU = A->getValue();
513 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
514 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000515 if (!FromAs)
516 return;
517
518 for (const Arg *A :
519 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
520 StringRef Value = A->getValue();
521 if (Value.startswith("-mcpu="))
522 CPU = Value.substr(6);
523 if (Value.startswith("-march="))
524 Arch = Value.substr(7);
525 }
Renato Goline17c5802015-07-27 23:44:42 +0000526}
527
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000528// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000529// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000530static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000531 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000532 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000533 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
534 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000535 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
536}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000537
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000538// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000539static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000540 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000541 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000542 unsigned FPUID = llvm::ARM::parseFPU(FPU);
543 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000544 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
545}
546
Renato Golin7c542b42015-07-27 23:44:45 +0000547// Check if -march is valid by checking if it can be canonicalised and parsed.
548// getARMArch is used here instead of just checking the -march value in order
549// to handle -march=native correctly.
550static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000551 llvm::StringRef ArchName,
552 const llvm::Triple &Triple) {
553 std::string MArch = arm::getARMArch(ArchName, Triple);
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000554 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID)
Renato Goline17c5802015-07-27 23:44:42 +0000555 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000556}
557
Renato Golin7c542b42015-07-27 23:44:45 +0000558// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
559static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
560 llvm::StringRef CPUName, llvm::StringRef ArchName,
Renato Goline17c5802015-07-27 23:44:42 +0000561 const llvm::Triple &Triple) {
562 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Vladimir Sukharev64f68242015-09-23 09:29:32 +0000563 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty())
Renato Goline17c5802015-07-27 23:44:42 +0000564 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000565}
566
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000567static bool useAAPCSForMachO(const llvm::Triple &T) {
568 // The backend is hardwired to assume AAPCS for M-class processors, ensure
569 // the frontend matches that.
570 return T.getEnvironment() == llvm::Triple::EABI ||
571 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
572}
573
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000574// Select the float ABI as determined by -msoft-float, -mhard-float, and
575// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000576arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
577 const Driver &D = TC.getDriver();
578 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000579 auto SubArch = getARMSubArchVersionNumber(Triple);
580 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000581 if (Arg *A =
582 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
583 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000584 if (A->getOption().matches(options::OPT_msoft_float)) {
585 ABI = FloatABI::Soft;
586 } else if (A->getOption().matches(options::OPT_mhard_float)) {
587 ABI = FloatABI::Hard;
588 } else {
589 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
590 .Case("soft", FloatABI::Soft)
591 .Case("softfp", FloatABI::SoftFP)
592 .Case("hard", FloatABI::Hard)
593 .Default(FloatABI::Invalid);
594 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000595 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000596 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000597 }
598 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000599
600 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
601 // "apcs-gnu".
602 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000603 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000604 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
605 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000606 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000607 }
608
609 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000610 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000611 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000612 case llvm::Triple::Darwin:
613 case llvm::Triple::MacOSX:
614 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000615 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000616 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000617 break;
618 }
619
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000620 // FIXME: this is invalid for WindowsCE
621 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000622 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000623 break;
624
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000625 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000626 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000627 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000628 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000629 break;
630 default:
631 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000632 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000633 break;
634 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000635 break;
636
Daniel Dunbar78485922009-09-10 23:00:09 +0000637 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000638 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000639 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000640 case llvm::Triple::EABIHF:
641 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000642 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000643 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000644 case llvm::Triple::EABI:
645 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000646 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000647 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000648 case llvm::Triple::Android:
649 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000650 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000651 default:
652 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000653 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000654 if (Triple.getOS() != llvm::Triple::UnknownOS ||
655 !Triple.isOSBinFormatMachO())
656 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000657 break;
658 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000659 }
660 }
661
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000662 assert(ABI != FloatABI::Invalid && "must select an ABI");
663 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000664}
665
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000666static void getARMTargetFeatures(const ToolChain &TC,
667 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000668 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000669 std::vector<const char *> &Features,
670 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000671 const Driver &D = TC.getDriver();
672
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000673 bool KernelOrKext =
674 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000675 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000676 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
677 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
678
Nico Weber6e0ebae2015-04-29 21:16:40 +0000679 if (!ForAS) {
680 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
681 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
682 // stripped out by the ARM target. We should probably pass this a new
683 // -target-option, which is handled by the -cc1/-cc1as invocation.
684 //
685 // FIXME2: For consistency, it would be ideal if we set up the target
686 // machine state the same when using the frontend or the assembler. We don't
687 // currently do that for the assembler, we pass the options directly to the
688 // backend and never even instantiate the frontend TargetInfo. If we did,
689 // and used its handleTargetFeatures hook, then we could ensure the
690 // assembler and the frontend behave the same.
691
692 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000693 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000694 Features.push_back("+soft-float");
695
696 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000697 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000698 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000699 } else {
700 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
701 // to the assembler correctly.
702 for (const Arg *A :
703 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
704 StringRef Value = A->getValue();
705 if (Value.startswith("-mfpu=")) {
706 WaFPU = A;
707 } else if (Value.startswith("-mcpu=")) {
708 WaCPU = A;
709 } else if (Value.startswith("-mhwdiv=")) {
710 WaHDiv = A;
711 } else if (Value.startswith("-march=")) {
712 WaArch = A;
713 }
714 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000715 }
716
Renato Golin7c542b42015-07-27 23:44:45 +0000717 // Check -march. ClangAs gives preference to -Wa,-march=.
718 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000719 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000720 if (WaArch) {
721 if (ArchArg)
722 D.Diag(clang::diag::warn_drv_unused_argument)
723 << ArchArg->getAsString(Args);
724 ArchName = StringRef(WaArch->getValue()).substr(7);
725 checkARMArchName(D, WaArch, Args, ArchName, Triple);
726 // FIXME: Set Arch.
727 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
728 } else if (ArchArg) {
729 ArchName = ArchArg->getValue();
730 checkARMArchName(D, ArchArg, Args, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000731 }
732
Renato Golin7c542b42015-07-27 23:44:45 +0000733 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
734 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000735 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000736 if (WaCPU) {
737 if (CPUArg)
738 D.Diag(clang::diag::warn_drv_unused_argument)
739 << CPUArg->getAsString(Args);
740 CPUName = StringRef(WaCPU->getValue()).substr(6);
741 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Triple);
742 } else if (CPUArg) {
743 CPUName = CPUArg->getValue();
744 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000745 }
John Brawna95c1a82015-05-08 12:52:18 +0000746
Renato Golin23459c62015-07-30 16:40:17 +0000747 // Add CPU features for generic CPUs
748 if (CPUName == "native") {
749 llvm::StringMap<bool> HostFeatures;
750 if (llvm::sys::getHostCPUFeatures(HostFeatures))
751 for (auto &F : HostFeatures)
752 Features.push_back(
753 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
754 }
755
756 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
757 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
758 if (WaFPU) {
759 if (FPUArg)
760 D.Diag(clang::diag::warn_drv_unused_argument)
761 << FPUArg->getAsString(Args);
762 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
763 Features);
764 } else if (FPUArg) {
765 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
766 }
767
768 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
769 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
770 if (WaHDiv) {
771 if (HDivArg)
772 D.Diag(clang::diag::warn_drv_unused_argument)
773 << HDivArg->getAsString(Args);
774 getARMHWDivFeatures(D, WaHDiv, Args,
775 StringRef(WaHDiv->getValue()).substr(8), Features);
776 } else if (HDivArg)
777 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
778
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000779 // Setting -msoft-float effectively disables NEON because of the GCC
780 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000781 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000782 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000783 // Also need to explicitly disable features which imply NEON.
784 Features.push_back("-crypto");
785 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000786
Eric Christopher269c2a22015-04-04 03:34:43 +0000787 // En/disable crc code generation.
788 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000789 if (A->getOption().matches(options::OPT_mcrc))
790 Features.push_back("+crc");
791 else
792 Features.push_back("-crc");
793 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000794
795 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
796 Features.insert(Features.begin(), "+v8.1a");
797 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000798
Akira Hatanakac2694822015-07-07 08:28:42 +0000799 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
800 // neither options are specified, see if we are compiling for kernel/kext and
801 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000802 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
803 options::OPT_mno_long_calls)) {
804 if (A->getOption().matches(options::OPT_mlong_calls))
805 Features.push_back("+long-calls");
806 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6))) {
807 Features.push_back("+long-calls");
808 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000809
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000810 // Kernel code has more strict alignment requirements.
811 if (KernelOrKext)
812 Features.push_back("+strict-align");
813 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
814 options::OPT_munaligned_access)) {
815 if (A->getOption().matches(options::OPT_munaligned_access)) {
816 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
817 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
818 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
819 } else
820 Features.push_back("+strict-align");
821 } else {
822 // Assume pre-ARMv6 doesn't support unaligned accesses.
823 //
824 // ARMv6 may or may not support unaligned accesses depending on the
825 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
826 // Darwin and NetBSD targets support unaligned accesses, and others don't.
827 //
828 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
829 // which raises an alignment fault on unaligned accesses. Linux
830 // defaults this bit to 0 and handles it as a system-wide (not
831 // per-process) setting. It is therefore safe to assume that ARMv7+
832 // Linux targets support unaligned accesses. The same goes for NaCl.
833 //
834 // The above behavior is consistent with GCC.
835 int VersionNum = getARMSubArchVersionNumber(Triple);
836 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000837 if (VersionNum < 6 ||
838 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000839 Features.push_back("+strict-align");
840 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
841 if (VersionNum < 7)
842 Features.push_back("+strict-align");
843 } else
844 Features.push_back("+strict-align");
845 }
846
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000847 // llvm does not support reserving registers in general. There is support
848 // for reserving r9 on ARM though (defined as a platform-specific register
849 // in ARM EABI).
850 if (Args.hasArg(options::OPT_ffixed_r9))
851 Features.push_back("+reserve-r9");
852
Akira Hatanaka580efb22015-07-16 00:43:00 +0000853 // The kext linker doesn't know how to deal with movw/movt.
854 if (KernelOrKext)
855 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000856}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000857
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000858void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
859 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000860 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000861 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000862 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000863 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000864 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000865 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000866 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000867 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000868 ABIName = "aapcs";
869 } else {
870 ABIName = "apcs-gnu";
871 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000872 } else if (Triple.isOSWindows()) {
873 // FIXME: this is invalid for WindowsCE
874 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000875 } else {
876 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000877 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000878 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000879 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000880 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000881 ABIName = "aapcs-linux";
882 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000883 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000884 case llvm::Triple::EABI:
885 ABIName = "aapcs";
886 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000887 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000888 if (Triple.getOS() == llvm::Triple::NetBSD)
889 ABIName = "apcs-gnu";
890 else
891 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000892 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000893 }
894 }
895 CmdArgs.push_back("-target-abi");
896 CmdArgs.push_back(ABIName);
897
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000898 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000899 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000900 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000901 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000902 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000903 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000904 CmdArgs.push_back("-mfloat-abi");
905 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000906 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000907 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000908 CmdArgs.push_back("-mfloat-abi");
909 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000910 } else {
911 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000912 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000913 CmdArgs.push_back("-mfloat-abi");
914 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000915 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000916
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000917 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000918 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
919 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000920 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000921 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000922 CmdArgs.push_back("-arm-global-merge=false");
923 else
924 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000925 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000926
Bob Wilson9c8af452013-04-11 18:53:25 +0000927 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000928 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000929 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000930}
Renato Goline17c5802015-07-27 23:44:42 +0000931// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000932
Tim Northover573cbee2014-05-24 12:52:07 +0000933/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
934/// targeting.
935static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000936 Arg *A;
937 std::string CPU;
938 // If we have -mtune or -mcpu, use that.
939 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +0000940 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +0000941 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000942 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +0000943 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +0000944 }
945
Kevin Qin110db6f2014-07-18 07:03:22 +0000946 // Handle CPU name is 'native'.
947 if (CPU == "native")
948 return llvm::sys::getHostCPUName();
949 else if (CPU.size())
950 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000951
James Molloy9b1586b2014-04-17 12:51:17 +0000952 // Make sure we pick "cyclone" if -arch is used.
953 // FIXME: Should this be picked by checking the target triple instead?
954 if (Args.getLastArg(options::OPT_arch))
955 return "cyclone";
956
957 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000958}
959
Tim Northover573cbee2014-05-24 12:52:07 +0000960void Clang::AddAArch64TargetArgs(const ArgList &Args,
961 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000962 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
963 llvm::Triple Triple(TripleStr);
964
965 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
966 Args.hasArg(options::OPT_mkernel) ||
967 Args.hasArg(options::OPT_fapple_kext))
968 CmdArgs.push_back("-disable-red-zone");
969
970 if (!Args.hasFlag(options::OPT_mimplicit_float,
971 options::OPT_mno_implicit_float, true))
972 CmdArgs.push_back("-no-implicit-float");
973
Craig Topper92fc2df2014-05-17 16:56:41 +0000974 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000975 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
976 ABIName = A->getValue();
977 else if (Triple.isOSDarwin())
978 ABIName = "darwinpcs";
979 else
980 ABIName = "aapcs";
981
982 CmdArgs.push_back("-target-abi");
983 CmdArgs.push_back(ABIName);
984
Bradley Smith9ff64332014-10-13 10:16:06 +0000985 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
986 options::OPT_mno_fix_cortex_a53_835769)) {
987 CmdArgs.push_back("-backend-option");
988 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
989 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
990 else
991 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000992 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000993 // Enabled A53 errata (835769) workaround by default on android
994 CmdArgs.push_back("-backend-option");
995 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000996 }
997
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000998 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000999 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1000 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001001 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001002 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001003 CmdArgs.push_back("-aarch64-global-merge=false");
1004 else
1005 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001006 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001007}
1008
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001009// Get CPU and ABI names. They are not independent
1010// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001011void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1012 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001013 const char *DefMips32CPU = "mips32r2";
1014 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001015
Daniel Sanders2bf13662014-07-10 14:40:57 +00001016 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1017 // default for mips64(el)?-img-linux-gnu.
1018 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1019 Triple.getEnvironment() == llvm::Triple::GNU) {
1020 DefMips32CPU = "mips32r6";
1021 DefMips64CPU = "mips64r6";
1022 }
Renato Golin7c542b42015-07-27 23:44:45 +00001023
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001024 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001025 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001026 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001027
Brad Smithba26f582015-01-06 02:53:17 +00001028 // MIPS3 is the default for mips64*-unknown-openbsd.
1029 if (Triple.getOS() == llvm::Triple::OpenBSD)
1030 DefMips64CPU = "mips3";
1031
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001032 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001033 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001034
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001035 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001036 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001037 // Convert a GNU style Mips ABI name to the name
1038 // accepted by LLVM Mips backend.
1039 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001040 .Case("32", "o32")
1041 .Case("64", "n64")
1042 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001043 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001044
1045 // Setup default CPU and ABI names.
1046 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001047 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001048 default:
1049 llvm_unreachable("Unexpected triple arch name");
1050 case llvm::Triple::mips:
1051 case llvm::Triple::mipsel:
1052 CPUName = DefMips32CPU;
1053 break;
1054 case llvm::Triple::mips64:
1055 case llvm::Triple::mips64el:
1056 CPUName = DefMips64CPU;
1057 break;
1058 }
1059 }
1060
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001061 if (ABIName.empty()) {
1062 // Deduce ABI name from the target triple.
1063 if (Triple.getArch() == llvm::Triple::mips ||
1064 Triple.getArch() == llvm::Triple::mipsel)
1065 ABIName = "o32";
1066 else
1067 ABIName = "n64";
1068 }
1069
1070 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001071 // Deduce CPU name from ABI name.
1072 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001073 .Cases("o32", "eabi", DefMips32CPU)
1074 .Cases("n32", "n64", DefMips64CPU)
1075 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001076 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001077
1078 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001079}
1080
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001081// Convert ABI name to the GNU tools acceptable variant.
1082static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1083 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001084 .Case("o32", "32")
1085 .Case("n64", "64")
1086 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001087}
1088
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001089// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1090// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001091static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1092 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001093 if (Arg *A =
1094 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1095 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001096 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001097 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001098 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001099 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001100 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001101 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1102 .Case("soft", mips::FloatABI::Soft)
1103 .Case("hard", mips::FloatABI::Hard)
1104 .Default(mips::FloatABI::Invalid);
1105 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001106 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001107 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001108 }
1109 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001110 }
1111
1112 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001113 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001114 // Assume "hard", because it's a default value used by gcc.
1115 // When we start to recognize specific target MIPS processors,
1116 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001117 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001118 }
1119
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001120 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1121 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001122}
1123
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001124static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001125 std::vector<const char *> &Features,
1126 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001127 StringRef FeatureName) {
1128 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001129 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001130 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001131 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001132 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001133 }
1134}
1135
Daniel Sanders379d44b2014-07-16 11:52:23 +00001136static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1137 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001138 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001139 StringRef CPUName;
1140 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001141 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001142 ABIName = getGnuCompatibleMipsABIName(ABIName);
1143
Daniel Sandersfeb61302014-08-08 15:47:17 +00001144 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1145 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001146
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001147 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1148 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001149 // FIXME: Note, this is a hack. We need to pass the selected float
1150 // mode to the MipsTargetInfoBase to define appropriate macros there.
1151 // Now it is the only method.
1152 Features.push_back("+soft-float");
1153 }
1154
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001155 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001156 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001157 if (Val == "2008") {
1158 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1159 Features.push_back("+nan2008");
1160 else {
1161 Features.push_back("-nan2008");
1162 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1163 }
1164 } else if (Val == "legacy") {
1165 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1166 Features.push_back("-nan2008");
1167 else {
1168 Features.push_back("+nan2008");
1169 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1170 }
1171 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001172 D.Diag(diag::err_drv_unsupported_option_argument)
1173 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001174 }
1175
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001176 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1177 options::OPT_mdouble_float, "single-float");
1178 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1179 "mips16");
1180 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1181 options::OPT_mno_micromips, "micromips");
1182 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1183 "dsp");
1184 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1185 "dspr2");
1186 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1187 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001188
1189 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1190 // pass -mfpxx
1191 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1192 options::OPT_mfp64)) {
1193 if (A->getOption().matches(options::OPT_mfp32))
1194 Features.push_back(Args.MakeArgString("-fp64"));
1195 else if (A->getOption().matches(options::OPT_mfpxx)) {
1196 Features.push_back(Args.MakeArgString("+fpxx"));
1197 Features.push_back(Args.MakeArgString("+nooddspreg"));
1198 } else
1199 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001200 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001201 Features.push_back(Args.MakeArgString("+fpxx"));
1202 Features.push_back(Args.MakeArgString("+nooddspreg"));
1203 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001204
Daniel Sanders28e5d392014-07-10 10:39:51 +00001205 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1206 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001207}
1208
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001209void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001210 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001211 const Driver &D = getToolChain().getDriver();
1212 StringRef CPUName;
1213 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001214 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001215 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001216
1217 CmdArgs.push_back("-target-abi");
1218 CmdArgs.push_back(ABIName.data());
1219
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001220 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1221 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001222 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001223 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001224 CmdArgs.push_back("-mfloat-abi");
1225 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001226 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001227 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001228 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001229 CmdArgs.push_back("-mfloat-abi");
1230 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001231 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001232
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001233 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1234 if (A->getOption().matches(options::OPT_mxgot)) {
1235 CmdArgs.push_back("-mllvm");
1236 CmdArgs.push_back("-mxgot");
1237 }
1238 }
1239
Simon Atanasyanc580b322013-05-11 06:33:44 +00001240 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1241 options::OPT_mno_ldc1_sdc1)) {
1242 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1243 CmdArgs.push_back("-mllvm");
1244 CmdArgs.push_back("-mno-ldc1-sdc1");
1245 }
1246 }
1247
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001248 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1249 options::OPT_mno_check_zero_division)) {
1250 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1251 CmdArgs.push_back("-mllvm");
1252 CmdArgs.push_back("-mno-check-zero-division");
1253 }
1254 }
1255
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001256 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001257 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001258 CmdArgs.push_back("-mllvm");
1259 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1260 A->claim();
1261 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001262}
1263
Hal Finkel8eb59282012-06-11 22:35:19 +00001264/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1265static std::string getPPCTargetCPU(const ArgList &Args) {
1266 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001267 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001268
1269 if (CPUName == "native") {
1270 std::string CPU = llvm::sys::getHostCPUName();
1271 if (!CPU.empty() && CPU != "generic")
1272 return CPU;
1273 else
1274 return "";
1275 }
1276
1277 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001278 .Case("common", "generic")
1279 .Case("440", "440")
1280 .Case("440fp", "440")
1281 .Case("450", "450")
1282 .Case("601", "601")
1283 .Case("602", "602")
1284 .Case("603", "603")
1285 .Case("603e", "603e")
1286 .Case("603ev", "603ev")
1287 .Case("604", "604")
1288 .Case("604e", "604e")
1289 .Case("620", "620")
1290 .Case("630", "pwr3")
1291 .Case("G3", "g3")
1292 .Case("7400", "7400")
1293 .Case("G4", "g4")
1294 .Case("7450", "7450")
1295 .Case("G4+", "g4+")
1296 .Case("750", "750")
1297 .Case("970", "970")
1298 .Case("G5", "g5")
1299 .Case("a2", "a2")
1300 .Case("a2q", "a2q")
1301 .Case("e500mc", "e500mc")
1302 .Case("e5500", "e5500")
1303 .Case("power3", "pwr3")
1304 .Case("power4", "pwr4")
1305 .Case("power5", "pwr5")
1306 .Case("power5x", "pwr5x")
1307 .Case("power6", "pwr6")
1308 .Case("power6x", "pwr6x")
1309 .Case("power7", "pwr7")
1310 .Case("power8", "pwr8")
1311 .Case("pwr3", "pwr3")
1312 .Case("pwr4", "pwr4")
1313 .Case("pwr5", "pwr5")
1314 .Case("pwr5x", "pwr5x")
1315 .Case("pwr6", "pwr6")
1316 .Case("pwr6x", "pwr6x")
1317 .Case("pwr7", "pwr7")
1318 .Case("pwr8", "pwr8")
1319 .Case("powerpc", "ppc")
1320 .Case("powerpc64", "ppc64")
1321 .Case("powerpc64le", "ppc64le")
1322 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001323 }
1324
1325 return "";
1326}
1327
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001328static void getPPCTargetFeatures(const ArgList &Args,
1329 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001330 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1331 StringRef Name = A->getOption().getName();
1332 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001333
1334 // Skip over "-m".
1335 assert(Name.startswith("m") && "Invalid feature name.");
1336 Name = Name.substr(1);
1337
1338 bool IsNegative = Name.startswith("no-");
1339 if (IsNegative)
1340 Name = Name.substr(3);
1341
1342 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1343 // pass the correct option to the backend while calling the frontend
1344 // option the same.
1345 // TODO: Change the LLVM backend option maybe?
1346 if (Name == "mfcrf")
1347 Name = "mfocrf";
1348
1349 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1350 }
1351
1352 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001353 AddTargetFeature(Args, Features, options::OPT_faltivec,
1354 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001355}
1356
Ulrich Weigand8afad612014-07-28 13:17:52 +00001357void Clang::AddPPCTargetArgs(const ArgList &Args,
1358 ArgStringList &CmdArgs) const {
1359 // Select the ABI to use.
1360 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001361 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001362 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001363 case llvm::Triple::ppc64: {
1364 // When targeting a processor that supports QPX, or if QPX is
1365 // specifically enabled, default to using the ABI that supports QPX (so
1366 // long as it is not specifically disabled).
1367 bool HasQPX = false;
1368 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1369 HasQPX = A->getValue() == StringRef("a2q");
1370 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1371 if (HasQPX) {
1372 ABIName = "elfv1-qpx";
1373 break;
1374 }
1375
Ulrich Weigand8afad612014-07-28 13:17:52 +00001376 ABIName = "elfv1";
1377 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001378 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001379 case llvm::Triple::ppc64le:
1380 ABIName = "elfv2";
1381 break;
1382 default:
1383 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001384 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001385
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001386 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1387 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1388 // the option if given as we don't have backend support for any targets
1389 // that don't use the altivec abi.
1390 if (StringRef(A->getValue()) != "altivec")
1391 ABIName = A->getValue();
1392
Ulrich Weigand8afad612014-07-28 13:17:52 +00001393 if (ABIName) {
1394 CmdArgs.push_back("-target-abi");
1395 CmdArgs.push_back(ABIName);
1396 }
1397}
1398
1399bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1400 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1401 return A && (A->getValue() == StringRef(Value));
1402}
1403
Tom Stellard6674c702013-04-01 20:56:53 +00001404/// Get the (LLVM) name of the R600 gpu we are targeting.
1405static std::string getR600TargetGPU(const ArgList &Args) {
1406 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001407 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001408 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001409 .Cases("rv630", "rv635", "r600")
1410 .Cases("rv610", "rv620", "rs780", "rs880")
1411 .Case("rv740", "rv770")
1412 .Case("palm", "cedar")
1413 .Cases("sumo", "sumo2", "sumo")
1414 .Case("hemlock", "cypress")
1415 .Case("aruba", "cayman")
1416 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001417 }
1418 return "";
1419}
1420
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001421void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001422 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001423 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001424 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001425
James Y Knightb2406522015-06-15 20:51:24 +00001426 bool SoftFloatABI = false;
1427 if (Arg *A =
1428 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001429 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001430 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001431 }
1432
James Y Knightb2406522015-06-15 20:51:24 +00001433 // Only the hard-float ABI on Sparc is standardized, and it is the
1434 // default. GCC also supports a nonstandard soft-float ABI mode, and
1435 // perhaps LLVM should implement that, too. However, since llvm
1436 // currently does not support Sparc soft-float, at all, display an
1437 // error if it's requested.
1438 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001439 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1440 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001441 }
1442}
1443
Richard Sandiford4652d892013-07-19 16:51:51 +00001444static const char *getSystemZTargetCPU(const ArgList &Args) {
1445 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1446 return A->getValue();
1447 return "z10";
1448}
1449
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001450static void getSystemZTargetFeatures(const ArgList &Args,
1451 std::vector<const char *> &Features) {
1452 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001453 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001454 if (A->getOption().matches(options::OPT_mhtm))
1455 Features.push_back("+transactional-execution");
1456 else
1457 Features.push_back("-transactional-execution");
1458 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001459 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001460 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001461 if (A->getOption().matches(options::OPT_mvx))
1462 Features.push_back("+vector");
1463 else
1464 Features.push_back("-vector");
1465 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001466}
1467
Chandler Carruth953fb082013-01-13 11:46:33 +00001468static const char *getX86TargetCPU(const ArgList &Args,
1469 const llvm::Triple &Triple) {
1470 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001471 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001472 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001473 return "core-avx2";
1474
Chandler Carruth953fb082013-01-13 11:46:33 +00001475 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001476 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001477
1478 // FIXME: Reject attempts to use -march=native unless the target matches
1479 // the host.
1480 //
1481 // FIXME: We should also incorporate the detected target features for use
1482 // with -native.
1483 std::string CPU = llvm::sys::getHostCPUName();
1484 if (!CPU.empty() && CPU != "generic")
1485 return Args.MakeArgString(CPU);
1486 }
1487
Reid Kleckner3123eff2015-06-30 16:32:04 +00001488 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1489 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1490 StringRef Arch = A->getValue();
1491 const char *CPU;
1492 if (Triple.getArch() == llvm::Triple::x86) {
1493 CPU = llvm::StringSwitch<const char *>(Arch)
1494 .Case("IA32", "i386")
1495 .Case("SSE", "pentium3")
1496 .Case("SSE2", "pentium4")
1497 .Case("AVX", "sandybridge")
1498 .Case("AVX2", "haswell")
1499 .Default(nullptr);
1500 } else {
1501 CPU = llvm::StringSwitch<const char *>(Arch)
1502 .Case("AVX", "sandybridge")
1503 .Case("AVX2", "haswell")
1504 .Default(nullptr);
1505 }
1506 if (CPU)
1507 return CPU;
1508 }
1509
Chandler Carruth953fb082013-01-13 11:46:33 +00001510 // Select the default CPU if none was given (or detection failed).
1511
1512 if (Triple.getArch() != llvm::Triple::x86_64 &&
1513 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001514 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001515
1516 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1517
1518 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001519 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001520 if (Triple.getArchName() == "x86_64h")
1521 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001522 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001523 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001524
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001525 // Set up default CPU name for PS4 compilers.
1526 if (Triple.isPS4CPU())
1527 return "btver2";
1528
Alexey Bataev286d1b92014-01-31 04:07:13 +00001529 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001530 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001531 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001532
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001533 // Everything else goes to x86-64 in 64-bit mode.
1534 if (Is64Bit)
1535 return "x86-64";
1536
1537 switch (Triple.getOS()) {
1538 case llvm::Triple::FreeBSD:
1539 case llvm::Triple::NetBSD:
1540 case llvm::Triple::OpenBSD:
1541 return "i486";
1542 case llvm::Triple::Haiku:
1543 return "i586";
1544 case llvm::Triple::Bitrig:
1545 return "i686";
1546 default:
1547 // Fallback to p4.
1548 return "pentium4";
1549 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001550}
1551
Dan Gohmanc2853072015-09-03 22:51:53 +00001552/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1553static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1554 // If we have -mcpu=, use that.
1555 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1556 StringRef CPU = A->getValue();
1557
1558#ifdef __wasm__
1559 // Handle "native" by examining the host. "native" isn't meaningful when
1560 // cross compiling, so only support this when the host is also WebAssembly.
1561 if (CPU == "native")
1562 return llvm::sys::getHostCPUName();
1563#endif
1564
1565 return CPU;
1566 }
1567
1568 return "generic";
1569}
1570
Renato Golin7c542b42015-07-27 23:44:45 +00001571static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1572 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001573 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001574 default:
1575 return "";
1576
Amara Emerson703da2e2013-10-31 09:32:33 +00001577 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001578 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001579 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001580
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001581 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001582 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001583 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001584 case llvm::Triple::thumbeb: {
1585 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001586 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001587 return arm::getARMTargetCPU(MCPU, MArch, T);
1588 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001589 case llvm::Triple::mips:
1590 case llvm::Triple::mipsel:
1591 case llvm::Triple::mips64:
1592 case llvm::Triple::mips64el: {
1593 StringRef CPUName;
1594 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001595 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001596 return CPUName;
1597 }
1598
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001599 case llvm::Triple::nvptx:
1600 case llvm::Triple::nvptx64:
1601 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1602 return A->getValue();
1603 return "";
1604
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001605 case llvm::Triple::ppc:
1606 case llvm::Triple::ppc64:
1607 case llvm::Triple::ppc64le: {
1608 std::string TargetCPUName = getPPCTargetCPU(Args);
1609 // LLVM may default to generating code for the native CPU,
1610 // but, like gcc, we default to a more generic option for
1611 // each architecture. (except on Darwin)
1612 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1613 if (T.getArch() == llvm::Triple::ppc64)
1614 TargetCPUName = "ppc64";
1615 else if (T.getArch() == llvm::Triple::ppc64le)
1616 TargetCPUName = "ppc64le";
1617 else
1618 TargetCPUName = "ppc";
1619 }
1620 return TargetCPUName;
1621 }
1622
1623 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001624 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001625 case llvm::Triple::sparcv9:
1626 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001627 return A->getValue();
1628 return "";
1629
1630 case llvm::Triple::x86:
1631 case llvm::Triple::x86_64:
1632 return getX86TargetCPU(Args, T);
1633
1634 case llvm::Triple::hexagon:
Douglas Katzman54366072015-07-27 16:53:08 +00001635 return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001636
1637 case llvm::Triple::systemz:
1638 return getSystemZTargetCPU(Args);
1639
1640 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001641 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001642 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001643
1644 case llvm::Triple::wasm32:
1645 case llvm::Triple::wasm64:
1646 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001647 }
1648}
1649
Alp Tokerce365ca2013-12-02 12:43:03 +00001650static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001651 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001652 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1653 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1654 // forward.
1655 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001656 std::string Plugin =
1657 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001658 CmdArgs.push_back(Args.MakeArgString(Plugin));
1659
1660 // Try to pass driver level flags relevant to LTO code generation down to
1661 // the plugin.
1662
1663 // Handle flags for selecting CPU variants.
1664 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1665 if (!CPU.empty())
1666 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001667
1668 if (IsThinLTO) CmdArgs.push_back("-plugin-opt=thinlto");
Alp Tokerce365ca2013-12-02 12:43:03 +00001669}
1670
Sanjay Patel2987c292015-06-11 14:53:41 +00001671/// This is a helper function for validating the optional refinement step
1672/// parameter in reciprocal argument strings. Return false if there is an error
1673/// parsing the refinement step. Otherwise, return true and set the Position
1674/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001675static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001676 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001677 const char RefinementStepToken = ':';
1678 Position = In.find(RefinementStepToken);
1679 if (Position != StringRef::npos) {
1680 StringRef Option = A.getOption().getName();
1681 StringRef RefStep = In.substr(Position + 1);
1682 // Allow exactly one numeric character for the additional refinement
1683 // step parameter. This is reasonable for all currently-supported
1684 // operations and architectures because we would expect that a larger value
1685 // of refinement steps would cause the estimate "optimization" to
1686 // under-perform the native operation. Also, if the estimate does not
1687 // converge quickly, it probably will not ever converge, so further
1688 // refinement steps will not produce a better answer.
1689 if (RefStep.size() != 1) {
1690 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1691 return false;
1692 }
1693 char RefStepChar = RefStep[0];
1694 if (RefStepChar < '0' || RefStepChar > '9') {
1695 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1696 return false;
1697 }
1698 }
1699 return true;
1700}
1701
1702/// The -mrecip flag requires processing of many optional parameters.
1703static void ParseMRecip(const Driver &D, const ArgList &Args,
1704 ArgStringList &OutStrings) {
1705 StringRef DisabledPrefixIn = "!";
1706 StringRef DisabledPrefixOut = "!";
1707 StringRef EnabledPrefixOut = "";
1708 StringRef Out = "-mrecip=";
1709
1710 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1711 if (!A)
1712 return;
1713
1714 unsigned NumOptions = A->getNumValues();
1715 if (NumOptions == 0) {
1716 // No option is the same as "all".
1717 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1718 return;
1719 }
1720
1721 // Pass through "all", "none", or "default" with an optional refinement step.
1722 if (NumOptions == 1) {
1723 StringRef Val = A->getValue(0);
1724 size_t RefStepLoc;
1725 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1726 return;
1727 StringRef ValBase = Val.slice(0, RefStepLoc);
1728 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1729 OutStrings.push_back(Args.MakeArgString(Out + Val));
1730 return;
1731 }
1732 }
1733
1734 // Each reciprocal type may be enabled or disabled individually.
1735 // Check each input value for validity, concatenate them all back together,
1736 // and pass through.
1737
1738 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001739 OptionStrings.insert(std::make_pair("divd", false));
1740 OptionStrings.insert(std::make_pair("divf", false));
1741 OptionStrings.insert(std::make_pair("vec-divd", false));
1742 OptionStrings.insert(std::make_pair("vec-divf", false));
1743 OptionStrings.insert(std::make_pair("sqrtd", false));
1744 OptionStrings.insert(std::make_pair("sqrtf", false));
1745 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1746 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001747
1748 for (unsigned i = 0; i != NumOptions; ++i) {
1749 StringRef Val = A->getValue(i);
1750
1751 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1752 // Ignore the disablement token for string matching.
1753 if (IsDisabled)
1754 Val = Val.substr(1);
1755
1756 size_t RefStep;
1757 if (!getRefinementStep(Val, D, *A, RefStep))
1758 return;
1759
1760 StringRef ValBase = Val.slice(0, RefStep);
1761 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1762 if (OptionIter == OptionStrings.end()) {
1763 // Try again specifying float suffix.
1764 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1765 if (OptionIter == OptionStrings.end()) {
1766 // The input name did not match any known option string.
1767 D.Diag(diag::err_drv_unknown_argument) << Val;
1768 return;
1769 }
1770 // The option was specified without a float or double suffix.
1771 // Make sure that the double entry was not already specified.
1772 // The float entry will be checked below.
1773 if (OptionStrings[ValBase.str() + 'd']) {
1774 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1775 return;
1776 }
1777 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001778
Sanjay Patel2987c292015-06-11 14:53:41 +00001779 if (OptionIter->second == true) {
1780 // Duplicate option specified.
1781 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1782 return;
1783 }
1784
1785 // Mark the matched option as found. Do not allow duplicate specifiers.
1786 OptionIter->second = true;
1787
1788 // If the precision was not specified, also mark the double entry as found.
1789 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1790 OptionStrings[ValBase.str() + 'd'] = true;
1791
1792 // Build the output string.
1793 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1794 Out = Args.MakeArgString(Out + Prefix + Val);
1795 if (i != NumOptions - 1)
1796 Out = Args.MakeArgString(Out + ",");
1797 }
1798
1799 OutStrings.push_back(Args.MakeArgString(Out));
1800}
1801
Eric Christopherc54920a2015-03-23 19:26:05 +00001802static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001803 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001804 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001805 // If -march=native, autodetect the feature list.
1806 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1807 if (StringRef(A->getValue()) == "native") {
1808 llvm::StringMap<bool> HostFeatures;
1809 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1810 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001811 Features.push_back(
1812 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001813 }
1814 }
1815
Jim Grosbach82eee262013-11-16 00:53:35 +00001816 if (Triple.getArchName() == "x86_64h") {
1817 // x86_64h implies quite a few of the more modern subtarget features
1818 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1819 Features.push_back("-rdrnd");
1820 Features.push_back("-aes");
1821 Features.push_back("-pclmul");
1822 Features.push_back("-rtm");
1823 Features.push_back("-hle");
1824 Features.push_back("-fsgsbase");
1825 }
1826
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001827 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001828 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001829 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001830 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001831 Features.push_back("+sse4.2");
1832 Features.push_back("+popcnt");
1833 } else
1834 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001835 }
1836
Eric Christopherc54920a2015-03-23 19:26:05 +00001837 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001838 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1839 StringRef Arch = A->getValue();
1840 bool ArchUsed = false;
1841 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001842 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001843 if (Arch == "AVX" || Arch == "AVX2") {
1844 ArchUsed = true;
1845 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1846 }
1847 }
1848 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001849 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001850 if (Arch == "IA32") {
1851 ArchUsed = true;
1852 } else if (Arch == "SSE" || Arch == "SSE2") {
1853 ArchUsed = true;
1854 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1855 }
1856 }
1857 if (!ArchUsed)
1858 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1859 }
1860
Jim Grosbach82eee262013-11-16 00:53:35 +00001861 // Now add any that the user explicitly requested on the command line,
1862 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001863 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1864 StringRef Name = A->getOption().getName();
1865 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001866
1867 // Skip over "-m".
1868 assert(Name.startswith("m") && "Invalid feature name.");
1869 Name = Name.substr(1);
1870
1871 bool IsNegative = Name.startswith("no-");
1872 if (IsNegative)
1873 Name = Name.substr(3);
1874
1875 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1876 }
1877}
1878
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001879void Clang::AddX86TargetArgs(const ArgList &Args,
1880 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001881 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001882 Args.hasArg(options::OPT_mkernel) ||
1883 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001884 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001885
Bob Wilson2616e2e2013-02-10 16:01:41 +00001886 // Default to avoid implicit floating-point for kernel/kext code, but allow
1887 // that to be overridden with -mno-soft-float.
1888 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1889 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001890 if (Arg *A = Args.getLastArg(
1891 options::OPT_msoft_float, options::OPT_mno_soft_float,
1892 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001893 const Option &O = A->getOption();
1894 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1895 O.matches(options::OPT_msoft_float));
1896 }
1897 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001898 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001899
1900 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1901 StringRef Value = A->getValue();
1902 if (Value == "intel" || Value == "att") {
1903 CmdArgs.push_back("-mllvm");
1904 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1905 } else {
1906 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1907 << A->getOption().getName() << Value;
1908 }
1909 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001910}
1911
Tony Linthicum76329bf2011-12-12 21:14:55 +00001912void Clang::AddHexagonTargetArgs(const ArgList &Args,
1913 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001914 CmdArgs.push_back("-mqdsp6-compat");
1915 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001916
Douglas Katzman54366072015-07-27 16:53:08 +00001917 if (const char *v =
1918 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001919 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001920 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001921 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001922 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001923 }
1924
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001925 if (!Args.hasArg(options::OPT_fno_short_enums))
1926 CmdArgs.push_back("-fshort-enums");
1927 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001928 CmdArgs.push_back("-mllvm");
1929 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001930 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001931 CmdArgs.push_back("-mllvm");
1932 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001933}
1934
Kevin Qin110db6f2014-07-18 07:03:22 +00001935// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001936static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001937 std::vector<const char *> &Features) {
1938 SmallVector<StringRef, 8> Split;
1939 text.split(Split, StringRef("+"), -1, false);
1940
Benjamin Kramer72e64312015-09-24 14:48:49 +00001941 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00001942 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00001943 .Case("fp", "+fp-armv8")
1944 .Case("simd", "+neon")
1945 .Case("crc", "+crc")
1946 .Case("crypto", "+crypto")
1947 .Case("nofp", "-fp-armv8")
1948 .Case("nosimd", "-neon")
1949 .Case("nocrc", "-crc")
1950 .Case("nocrypto", "-crypto")
1951 .Default(nullptr);
1952 if (result)
1953 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00001954 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00001955 D.Diag(diag::err_drv_no_neon_modifier);
1956 else
1957 return false;
1958 }
1959 return true;
1960}
1961
1962// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1963// decode CPU and feature.
1964static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1965 std::vector<const char *> &Features) {
1966 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1967 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001968 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
1969 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001970 Features.push_back("+neon");
1971 Features.push_back("+crc");
1972 Features.push_back("+crypto");
1973 } else if (CPU == "generic") {
1974 Features.push_back("+neon");
1975 } else {
1976 return false;
1977 }
1978
1979 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1980 return false;
1981
1982 return true;
1983}
1984
1985static bool
1986getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1987 const ArgList &Args,
1988 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00001989 std::string MarchLowerCase = March.lower();
1990 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001991
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001992 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001993 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001994 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001995 Features.push_back("+v8.1a");
1996 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001997 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001998 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001999
2000 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2001 return false;
2002
2003 return true;
2004}
2005
2006static bool
2007getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2008 const ArgList &Args,
2009 std::vector<const char *> &Features) {
2010 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002011 std::string McpuLowerCase = Mcpu.lower();
2012 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002013 return false;
2014
2015 return true;
2016}
2017
2018static bool
2019getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2020 const ArgList &Args,
2021 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002022 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002023 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002024 if (MtuneLowerCase == "native")
2025 MtuneLowerCase = llvm::sys::getHostCPUName();
2026 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002027 Features.push_back("+zcm");
2028 Features.push_back("+zcz");
2029 }
2030 return true;
2031}
2032
2033static bool
2034getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2035 const ArgList &Args,
2036 std::vector<const char *> &Features) {
2037 StringRef CPU;
2038 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002039 std::string McpuLowerCase = Mcpu.lower();
2040 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002041 return false;
2042
2043 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2044}
2045
Akira Hatanaka92500472015-07-27 19:29:04 +00002046static void getAArch64TargetFeatures(const Driver &D,
2047 const llvm::Triple &Triple,
2048 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002049 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002050 Arg *A;
2051 bool success = true;
2052 // Enable NEON by default.
2053 Features.push_back("+neon");
2054 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2055 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2056 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2057 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002058 else if (Args.hasArg(options::OPT_arch))
2059 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2060 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002061
2062 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2063 success =
2064 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2065 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2066 success =
2067 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002068 else if (Args.hasArg(options::OPT_arch))
2069 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2070 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002071
2072 if (!success)
2073 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002074
2075 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2076 Features.push_back("-fp-armv8");
2077 Features.push_back("-crypto");
2078 Features.push_back("-neon");
2079 }
Bradley Smith418c5932014-05-02 15:17:51 +00002080
2081 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002082 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002083 if (A->getOption().matches(options::OPT_mcrc))
2084 Features.push_back("+crc");
2085 else
2086 Features.push_back("-crc");
2087 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002088
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002089 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2090 options::OPT_munaligned_access))
2091 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2092 Features.push_back("+strict-align");
2093
Akira Hatanaka92500472015-07-27 19:29:04 +00002094 if (Args.hasArg(options::OPT_ffixed_x18) || Triple.isOSDarwin())
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002095 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002096}
2097
Dan Gohmanc2853072015-09-03 22:51:53 +00002098static void getWebAssemblyTargetFeatures(const ArgList &Args,
2099 std::vector<const char *> &Features) {
2100 for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) {
2101 StringRef Name = A->getOption().getName();
2102 A->claim();
2103
2104 // Skip over "-m".
2105 assert(Name.startswith("m") && "Invalid feature name.");
2106 Name = Name.substr(1);
2107
2108 bool IsNegative = Name.startswith("no-");
2109 if (IsNegative)
2110 Name = Name.substr(3);
2111
2112 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2113 }
2114}
2115
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002116static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002117 const ArgList &Args, ArgStringList &CmdArgs,
2118 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002119 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002120 std::vector<const char *> Features;
2121 switch (Triple.getArch()) {
2122 default:
2123 break;
2124 case llvm::Triple::mips:
2125 case llvm::Triple::mipsel:
2126 case llvm::Triple::mips64:
2127 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002128 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002129 break;
2130
2131 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002132 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002133 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002134 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002135 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002136 break;
2137
2138 case llvm::Triple::ppc:
2139 case llvm::Triple::ppc64:
2140 case llvm::Triple::ppc64le:
2141 getPPCTargetFeatures(Args, Features);
2142 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002143 case llvm::Triple::systemz:
2144 getSystemZTargetFeatures(Args, Features);
2145 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002146 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002147 case llvm::Triple::aarch64_be:
Akira Hatanaka92500472015-07-27 19:29:04 +00002148 getAArch64TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002149 break;
2150 case llvm::Triple::x86:
2151 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002152 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002153 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002154 case llvm::Triple::wasm32:
2155 case llvm::Triple::wasm64:
2156 getWebAssemblyTargetFeatures(Args, Features);
2157 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002158 }
Rafael Espindola43964802013-08-21 17:34:32 +00002159
2160 // Find the last of each feature.
2161 llvm::StringMap<unsigned> LastOpt;
2162 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2163 const char *Name = Features[I];
2164 assert(Name[0] == '-' || Name[0] == '+');
2165 LastOpt[Name + 1] = I;
2166 }
2167
2168 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2169 // If this feature was overridden, ignore it.
2170 const char *Name = Features[I];
2171 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2172 assert(LastI != LastOpt.end());
2173 unsigned Last = LastI->second;
2174 if (Last != I)
2175 continue;
2176
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002177 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002178 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002179 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002180}
2181
David Majnemerae394812014-12-09 00:12:30 +00002182static bool
2183shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2184 const llvm::Triple &Triple) {
2185 // We use the zero-cost exception tables for Objective-C if the non-fragile
2186 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2187 // later.
2188 if (runtime.isNonFragile())
2189 return true;
2190
2191 if (!Triple.isMacOSX())
2192 return false;
2193
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002194 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002195 (Triple.getArch() == llvm::Triple::x86_64 ||
2196 Triple.getArch() == llvm::Triple::arm));
2197}
2198
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002199/// Adds exception related arguments to the driver command arguments. There's a
2200/// master flag, -fexceptions and also language specific flags to enable/disable
2201/// C++ and Objective-C exceptions. This makes it possible to for example
2202/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002203static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002204 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002205 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002206 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002207 const Driver &D = TC.getDriver();
2208 const llvm::Triple &Triple = TC.getTriple();
2209
Chad Rosier4fab82c2012-03-26 22:04:46 +00002210 if (KernelOrKext) {
2211 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2212 // arguments now to avoid warnings about unused arguments.
2213 Args.ClaimAllArgs(options::OPT_fexceptions);
2214 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2215 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2216 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2217 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2218 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002219 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002220 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002221
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002222 // See if the user explicitly enabled exceptions.
2223 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2224 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002225
David Majnemerae394812014-12-09 00:12:30 +00002226 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2227 // is not necessarily sensible, but follows GCC.
2228 if (types::isObjC(InputType) &&
2229 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002230 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002231 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002232
David Majnemerae394812014-12-09 00:12:30 +00002233 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002234 }
2235
2236 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002237 // Disable C++ EH by default on XCore, PS4, and MSVC.
2238 // FIXME: Remove MSVC from this list once things work.
2239 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2240 !Triple.isPS4CPU() &&
2241 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002242 Arg *ExceptionArg = Args.getLastArg(
2243 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2244 options::OPT_fexceptions, options::OPT_fno_exceptions);
2245 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002246 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002247 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2248 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002249
2250 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002251 if (Triple.isPS4CPU()) {
2252 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2253 assert(ExceptionArg &&
2254 "On the PS4 exceptions should only be enabled if passing "
2255 "an argument");
2256 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2257 const Arg *RTTIArg = TC.getRTTIArg();
2258 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2259 D.Diag(diag::err_drv_argument_not_allowed_with)
2260 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2261 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2262 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2263 } else
2264 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2265
Anders Carlssone96ab552011-02-28 02:27:16 +00002266 CmdArgs.push_back("-fcxx-exceptions");
2267
David Majnemer8de68642014-12-05 08:11:58 +00002268 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002269 }
2270 }
2271
David Majnemer8de68642014-12-05 08:11:58 +00002272 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002273 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002274}
2275
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002276static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002277 bool Default = true;
2278 if (TC.getTriple().isOSDarwin()) {
2279 // The native darwin assembler doesn't support the linker_option directives,
2280 // so we disable them if we think the .s file will be passed to it.
2281 Default = TC.useIntegratedAs();
2282 }
2283 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2284 Default);
2285}
2286
Ted Kremenek62093662013-03-12 17:02:12 +00002287static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2288 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002289 bool UseDwarfDirectory =
2290 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2291 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002292 return !UseDwarfDirectory;
2293}
2294
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002295/// \brief Check whether the given input tree contains any compilation actions.
2296static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002297 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002298 return true;
2299
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002300 for (const auto &Act : *A)
2301 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002302 return true;
2303
2304 return false;
2305}
2306
2307/// \brief Check if -relax-all should be passed to the internal assembler.
2308/// This is done by default when compiling non-assembler source with -O0.
2309static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2310 bool RelaxDefault = true;
2311
2312 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2313 RelaxDefault = A->getOption().matches(options::OPT_O0);
2314
2315 if (RelaxDefault) {
2316 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002317 for (const auto &Act : C.getActions()) {
2318 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002319 RelaxDefault = true;
2320 break;
2321 }
2322 }
2323 }
2324
2325 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002326 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002327}
2328
Douglas Katzman3459ce22015-10-08 04:24:12 +00002329// Extract the integer N from a string spelled "-dwarf-N", returning 0
2330// on mismatch. The StringRef input (rather than an Arg) allows
2331// for use by the "-Xassembler" option parser.
2332static unsigned DwarfVersionNum(StringRef ArgValue) {
2333 return llvm::StringSwitch<unsigned>(ArgValue)
2334 .Case("-gdwarf-2", 2)
2335 .Case("-gdwarf-3", 3)
2336 .Case("-gdwarf-4", 4)
2337 .Default(0);
2338}
2339
2340static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2341 CodeGenOptions::DebugInfoKind DebugInfoKind,
2342 unsigned DwarfVersion) {
2343 switch (DebugInfoKind) {
2344 case CodeGenOptions::DebugLineTablesOnly:
2345 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2346 break;
2347 case CodeGenOptions::LimitedDebugInfo:
2348 CmdArgs.push_back("-debug-info-kind=limited");
2349 break;
2350 case CodeGenOptions::FullDebugInfo:
2351 CmdArgs.push_back("-debug-info-kind=standalone");
2352 break;
2353 default:
2354 break;
2355 }
2356 if (DwarfVersion > 0)
2357 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002358 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Douglas Katzman3459ce22015-10-08 04:24:12 +00002359}
2360
David Blaikie9260ed62013-07-25 21:19:01 +00002361static void CollectArgsForIntegratedAssembler(Compilation &C,
2362 const ArgList &Args,
2363 ArgStringList &CmdArgs,
2364 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002365 if (UseRelaxAll(C, Args))
2366 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002367
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002368 // When passing -I arguments to the assembler we sometimes need to
2369 // unconditionally take the next argument. For example, when parsing
2370 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2371 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2372 // arg after parsing the '-I' arg.
2373 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002374
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002375 // When using an integrated assembler, translate -Wa, and -Xassembler
2376 // options.
2377 bool CompressDebugSections = false;
2378 for (const Arg *A :
2379 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2380 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002381
Benjamin Kramer72e64312015-09-24 14:48:49 +00002382 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002383 if (TakeNextArg) {
2384 CmdArgs.push_back(Value.data());
2385 TakeNextArg = false;
2386 continue;
2387 }
David Blaikie9260ed62013-07-25 21:19:01 +00002388
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002389 if (Value == "-force_cpusubtype_ALL") {
2390 // Do nothing, this is the default and we don't support anything else.
2391 } else if (Value == "-L") {
2392 CmdArgs.push_back("-msave-temp-labels");
2393 } else if (Value == "--fatal-warnings") {
2394 CmdArgs.push_back("-massembler-fatal-warnings");
2395 } else if (Value == "--noexecstack") {
2396 CmdArgs.push_back("-mnoexecstack");
2397 } else if (Value == "-compress-debug-sections" ||
2398 Value == "--compress-debug-sections") {
2399 CompressDebugSections = true;
2400 } else if (Value == "-nocompress-debug-sections" ||
2401 Value == "--nocompress-debug-sections") {
2402 CompressDebugSections = false;
2403 } else if (Value.startswith("-I")) {
2404 CmdArgs.push_back(Value.data());
2405 // We need to consume the next argument if the current arg is a plain
2406 // -I. The next arg will be the include directory.
2407 if (Value == "-I")
2408 TakeNextArg = true;
2409 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002410 // "-gdwarf-N" options are not cc1as options.
2411 unsigned DwarfVersion = DwarfVersionNum(Value);
2412 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2413 CmdArgs.push_back(Value.data());
2414 } else {
2415 RenderDebugEnablingArgs(
2416 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion);
2417 }
Renato Golin7c542b42015-07-27 23:44:45 +00002418 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2419 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2420 // Do nothing, we'll validate it later.
Daniel Sanders4f7cd232015-09-03 12:58:39 +00002421 } else if (Value == "--trap") {
2422 CmdArgs.push_back("-target-feature");
2423 CmdArgs.push_back("+use-tcc-in-div");
2424 } else if (Value == "--break") {
2425 CmdArgs.push_back("-target-feature");
2426 CmdArgs.push_back("-use-tcc-in-div");
Daniel Sanders63f28262015-09-22 13:52:32 +00002427 } else if (Value.startswith("-msoft-float")) {
2428 CmdArgs.push_back("-target-feature");
2429 CmdArgs.push_back("+soft-float");
2430 } else if (Value.startswith("-mhard-float")) {
2431 CmdArgs.push_back("-target-feature");
2432 CmdArgs.push_back("-soft-float");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002433 } else {
2434 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002435 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002436 }
2437 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002438 }
2439 if (CompressDebugSections) {
2440 if (llvm::zlib::isAvailable())
2441 CmdArgs.push_back("-compress-debug-sections");
2442 else
2443 D.Diag(diag::warn_debug_compression_unavailable);
2444 }
David Blaikie9260ed62013-07-25 21:19:01 +00002445}
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) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002452 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002453}
2454
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002455namespace {
2456enum OpenMPRuntimeKind {
2457 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2458 /// without knowing what runtime to target.
2459 OMPRT_Unknown,
2460
2461 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2462 /// the default for Clang.
2463 OMPRT_OMP,
2464
2465 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2466 /// this runtime but can swallow the pragmas, and find and link against the
2467 /// runtime library itself.
2468 OMPRT_GOMP,
2469
Chandler Carruthc6625c62015-05-28 21:10:31 +00002470 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002471 /// OpenMP runtime. We support this mode for users with existing dependencies
2472 /// on this runtime library name.
2473 OMPRT_IOMP5
2474};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002475}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002476
2477/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002478static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2479 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002480 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2481
2482 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2483 if (A)
2484 RuntimeName = A->getValue();
2485
2486 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002487 .Case("libomp", OMPRT_OMP)
2488 .Case("libgomp", OMPRT_GOMP)
2489 .Case("libiomp5", OMPRT_IOMP5)
2490 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002491
2492 if (RT == OMPRT_Unknown) {
2493 if (A)
2494 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002495 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002496 else
2497 // FIXME: We could use a nicer diagnostic here.
2498 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2499 }
2500
2501 return RT;
2502}
2503
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002504static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2505 const ArgList &Args) {
2506 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2507 options::OPT_fno_openmp, false))
2508 return;
2509
2510 switch (getOpenMPRuntime(TC, Args)) {
2511 case OMPRT_OMP:
2512 CmdArgs.push_back("-lomp");
2513 break;
2514 case OMPRT_GOMP:
2515 CmdArgs.push_back("-lgomp");
2516 break;
2517 case OMPRT_IOMP5:
2518 CmdArgs.push_back("-liomp5");
2519 break;
2520 case OMPRT_Unknown:
2521 // Already diagnosed.
2522 break;
2523 }
2524}
2525
Alexey Samsonov52550342014-09-15 19:58:40 +00002526static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2527 ArgStringList &CmdArgs, StringRef Sanitizer,
2528 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002529 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002530 // whole-archive.
Xinliang David Li69306c02015-10-22 06:15:31 +00002531 if (!IsShared) CmdArgs.push_back("-whole-archive");
2532 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
2533 if (!IsShared) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002534}
2535
Alexey Samsonov52550342014-09-15 19:58:40 +00002536// Tries to use a file with the list of dynamic symbols that need to be exported
2537// from the runtime library. Returns true if the file was found.
2538static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2539 ArgStringList &CmdArgs,
2540 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002541 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002542 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2543 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002544 return true;
2545 }
2546 return false;
2547}
2548
2549static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2550 ArgStringList &CmdArgs) {
2551 // Force linking against the system libraries sanitizers depends on
2552 // (see PR15823 why this is necessary).
2553 CmdArgs.push_back("--no-as-needed");
2554 CmdArgs.push_back("-lpthread");
2555 CmdArgs.push_back("-lrt");
2556 CmdArgs.push_back("-lm");
2557 // There's no libdl on FreeBSD.
2558 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2559 CmdArgs.push_back("-ldl");
2560}
2561
2562static void
2563collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2564 SmallVectorImpl<StringRef> &SharedRuntimes,
2565 SmallVectorImpl<StringRef> &StaticRuntimes,
2566 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2567 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2568 // Collect shared runtimes.
2569 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2570 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002571 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002572
Alexey Samsonov52550342014-09-15 19:58:40 +00002573 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002574 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002575 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002576 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002577 }
2578 if (SanArgs.needsAsanRt()) {
2579 if (SanArgs.needsSharedAsanRt()) {
2580 HelperStaticRuntimes.push_back("asan-preinit");
2581 } else {
2582 StaticRuntimes.push_back("asan");
2583 if (SanArgs.linkCXXRuntimes())
2584 StaticRuntimes.push_back("asan_cxx");
2585 }
2586 }
2587 if (SanArgs.needsDfsanRt())
2588 StaticRuntimes.push_back("dfsan");
2589 if (SanArgs.needsLsanRt())
2590 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002591 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002592 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002593 if (SanArgs.linkCXXRuntimes())
2594 StaticRuntimes.push_back("msan_cxx");
2595 }
2596 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002597 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002598 if (SanArgs.linkCXXRuntimes())
2599 StaticRuntimes.push_back("tsan_cxx");
2600 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002601 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002602 StaticRuntimes.push_back("ubsan_standalone");
2603 if (SanArgs.linkCXXRuntimes())
2604 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002605 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002606 if (SanArgs.needsSafeStackRt())
2607 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002608}
2609
Alexey Samsonov52550342014-09-15 19:58:40 +00002610// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2611// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2612static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002613 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002614 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2615 HelperStaticRuntimes;
2616 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2617 HelperStaticRuntimes);
2618 for (auto RT : SharedRuntimes)
2619 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2620 for (auto RT : HelperStaticRuntimes)
2621 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2622 bool AddExportDynamic = false;
2623 for (auto RT : StaticRuntimes) {
2624 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2625 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2626 }
2627 // If there is a static runtime with no dynamic list, force all the symbols
2628 // to be dynamic to be sure we export sanitizer interface functions.
2629 if (AddExportDynamic)
2630 CmdArgs.push_back("-export-dynamic");
2631 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002632}
2633
Reid Kleckner86ea7702015-02-04 23:45:07 +00002634static bool areOptimizationsEnabled(const ArgList &Args) {
2635 // Find the last -O arg and see if it is non-zero.
2636 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2637 return !A->getOption().matches(options::OPT_O0);
2638 // Defaults to -O0.
2639 return false;
2640}
2641
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002642static bool shouldUseFramePointerForTarget(const ArgList &Args,
2643 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002644 switch (Triple.getArch()) {
2645 case llvm::Triple::xcore:
2646 case llvm::Triple::wasm32:
2647 case llvm::Triple::wasm64:
2648 // XCore never wants frame pointers, regardless of OS.
2649 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002650 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002651 default:
2652 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002653 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002654
2655 if (Triple.isOSLinux()) {
2656 switch (Triple.getArch()) {
2657 // Don't use a frame pointer on linux if optimizing for certain targets.
2658 case llvm::Triple::mips64:
2659 case llvm::Triple::mips64el:
2660 case llvm::Triple::mips:
2661 case llvm::Triple::mipsel:
2662 case llvm::Triple::systemz:
2663 case llvm::Triple::x86:
2664 case llvm::Triple::x86_64:
2665 return !areOptimizationsEnabled(Args);
2666 default:
2667 return true;
2668 }
2669 }
2670
2671 if (Triple.isOSWindows()) {
2672 switch (Triple.getArch()) {
2673 case llvm::Triple::x86:
2674 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002675 case llvm::Triple::arm:
2676 case llvm::Triple::thumb:
2677 // Windows on ARM builds with FPO disabled to aid fast stack walking
2678 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002679 default:
2680 // All other supported Windows ISAs use xdata unwind information, so frame
2681 // pointers are not generally useful.
2682 return false;
2683 }
2684 }
2685
2686 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002687}
2688
Rafael Espindola224dd632011-12-14 21:02:23 +00002689static bool shouldUseFramePointer(const ArgList &Args,
2690 const llvm::Triple &Triple) {
2691 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2692 options::OPT_fomit_frame_pointer))
2693 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2694
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002695 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002696}
2697
Eric Christopherb7d97e92013-04-03 01:58:53 +00002698static bool shouldUseLeafFramePointer(const ArgList &Args,
2699 const llvm::Triple &Triple) {
2700 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2701 options::OPT_momit_leaf_frame_pointer))
2702 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2703
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002704 if (Triple.isPS4CPU())
2705 return false;
2706
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002707 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002708}
2709
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002710/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002711static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002712 SmallString<128> cwd;
2713 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002714 CmdArgs.push_back("-fdebug-compilation-dir");
2715 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002716 }
2717}
2718
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002719static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002720 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2721 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2722 SmallString<128> T(FinalOutput->getValue());
2723 llvm::sys::path::replace_extension(T, "dwo");
2724 return Args.MakeArgString(T);
2725 } else {
2726 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002727 SmallString<128> T(
2728 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002729 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002730 llvm::sys::path::replace_extension(F, "dwo");
2731 T += F;
2732 return Args.MakeArgString(F);
2733 }
2734}
2735
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002736static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2737 const JobAction &JA, const ArgList &Args,
2738 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002739 ArgStringList ExtractArgs;
2740 ExtractArgs.push_back("--extract-dwo");
2741
2742 ArgStringList StripArgs;
2743 StripArgs.push_back("--strip-dwo");
2744
2745 // Grabbing the output of the earlier compile step.
2746 StripArgs.push_back(Output.getFilename());
2747 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002748 ExtractArgs.push_back(OutFile);
2749
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002750 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002751 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002752
2753 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002754 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002755
2756 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002757 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002758}
2759
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002760/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002761/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2762static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002763 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002764 if (A->getOption().matches(options::OPT_O4) ||
2765 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002766 return true;
2767
2768 if (A->getOption().matches(options::OPT_O0))
2769 return false;
2770
2771 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2772
Rafael Espindola91780de2013-08-26 14:05:41 +00002773 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002774 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002775 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002776 return true;
2777
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002778 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002779 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002780 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002781
2782 unsigned OptLevel = 0;
2783 if (S.getAsInteger(10, OptLevel))
2784 return false;
2785
2786 return OptLevel > 1;
2787 }
2788
2789 return false;
2790}
2791
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002792/// Add -x lang to \p CmdArgs for \p Input.
2793static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2794 ArgStringList &CmdArgs) {
2795 // When using -verify-pch, we don't want to provide the type
2796 // 'precompiled-header' if it was inferred from the file extension
2797 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2798 return;
2799
2800 CmdArgs.push_back("-x");
2801 if (Args.hasArg(options::OPT_rewrite_objc))
2802 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2803 else
2804 CmdArgs.push_back(types::getTypeName(Input.getType()));
2805}
2806
David Majnemerc371ff02015-03-22 08:39:22 +00002807static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002808 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002809 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002810
2811 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002812 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002813
2814 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002815 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002816 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002817 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002818}
2819
Rafael Espindola577637a2015-01-03 00:06:04 +00002820// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002821// options that build systems might add but are unused when assembling or only
2822// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002823static void claimNoWarnArgs(const ArgList &Args) {
2824 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002825 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00002826 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00002827 Args.ClaimAllArgs(options::OPT_flto);
2828 Args.ClaimAllArgs(options::OPT_fno_lto);
2829}
2830
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002831static void appendUserToPath(SmallVectorImpl<char> &Result) {
2832#ifdef LLVM_ON_UNIX
2833 const char *Username = getenv("LOGNAME");
2834#else
2835 const char *Username = getenv("USERNAME");
2836#endif
2837 if (Username) {
2838 // Validate that LoginName can be used in a path, and get its length.
2839 size_t Len = 0;
2840 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002841 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002842 Username = nullptr;
2843 break;
2844 }
2845 }
2846
2847 if (Username && Len > 0) {
2848 Result.append(Username, Username + Len);
2849 return;
2850 }
2851 }
2852
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002853// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002854#ifdef LLVM_ON_UNIX
2855 std::string UID = llvm::utostr(getuid());
2856#else
2857 // FIXME: Windows seems to have an 'SID' that might work.
2858 std::string UID = "9999";
2859#endif
2860 Result.append(UID.begin(), UID.end());
2861}
2862
David Majnemere11d3732015-06-08 00:22:46 +00002863VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2864 const llvm::Triple &Triple,
2865 const llvm::opt::ArgList &Args,
2866 bool IsWindowsMSVC) {
2867 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2868 IsWindowsMSVC) ||
2869 Args.hasArg(options::OPT_fmsc_version) ||
2870 Args.hasArg(options::OPT_fms_compatibility_version)) {
2871 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2872 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002873 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002874
2875 if (MSCVersion && MSCompatibilityVersion) {
2876 if (D)
2877 D->Diag(diag::err_drv_argument_not_allowed_with)
2878 << MSCVersion->getAsString(Args)
2879 << MSCompatibilityVersion->getAsString(Args);
2880 return VersionTuple();
2881 }
2882
2883 if (MSCompatibilityVersion) {
2884 VersionTuple MSVT;
2885 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2886 D->Diag(diag::err_drv_invalid_value)
2887 << MSCompatibilityVersion->getAsString(Args)
2888 << MSCompatibilityVersion->getValue();
2889 return MSVT;
2890 }
2891
2892 if (MSCVersion) {
2893 unsigned Version = 0;
2894 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2895 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2896 << MSCVersion->getValue();
2897 return getMSCompatibilityVersion(Version);
2898 }
2899
2900 unsigned Major, Minor, Micro;
2901 Triple.getEnvironmentVersion(Major, Minor, Micro);
2902 if (Major || Minor || Micro)
2903 return VersionTuple(Major, Minor, Micro);
2904
2905 return VersionTuple(18);
2906 }
2907 return VersionTuple();
2908}
2909
Diego Novilloa0545962015-07-10 18:00:07 +00002910static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2911 const InputInfo &Output, const ArgList &Args,
2912 ArgStringList &CmdArgs) {
2913 auto *ProfileGenerateArg = Args.getLastArg(
2914 options::OPT_fprofile_instr_generate,
2915 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00002916 options::OPT_fprofile_generate_EQ,
2917 options::OPT_fno_profile_instr_generate);
2918 if (ProfileGenerateArg &&
2919 ProfileGenerateArg->getOption().matches(
2920 options::OPT_fno_profile_instr_generate))
2921 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002922
2923 auto *ProfileUseArg = Args.getLastArg(
2924 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00002925 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2926 options::OPT_fno_profile_instr_use);
2927 if (ProfileUseArg &&
2928 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2929 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002930
2931 if (ProfileGenerateArg && ProfileUseArg)
2932 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00002933 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00002934
Diego Novillo758f3f52015-08-05 21:49:51 +00002935 if (ProfileGenerateArg) {
2936 if (ProfileGenerateArg->getOption().matches(
2937 options::OPT_fprofile_instr_generate_EQ))
2938 ProfileGenerateArg->render(Args, CmdArgs);
2939 else if (ProfileGenerateArg->getOption().matches(
2940 options::OPT_fprofile_generate_EQ)) {
2941 SmallString<128> Path(ProfileGenerateArg->getValue());
2942 llvm::sys::path::append(Path, "default.profraw");
2943 CmdArgs.push_back(
2944 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
2945 } else
2946 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2947 }
Diego Novilloa0545962015-07-10 18:00:07 +00002948
Diego Novillo758f3f52015-08-05 21:49:51 +00002949 if (ProfileUseArg) {
2950 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
2951 ProfileUseArg->render(Args, CmdArgs);
2952 else if ((ProfileUseArg->getOption().matches(
2953 options::OPT_fprofile_use_EQ) ||
2954 ProfileUseArg->getOption().matches(
2955 options::OPT_fprofile_instr_use))) {
2956 SmallString<128> Path(
2957 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
2958 if (Path.empty() || llvm::sys::fs::is_directory(Path))
2959 llvm::sys::path::append(Path, "default.profdata");
2960 CmdArgs.push_back(
2961 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
2962 }
Diego Novilloa0545962015-07-10 18:00:07 +00002963 }
2964
2965 if (Args.hasArg(options::OPT_ftest_coverage) ||
2966 Args.hasArg(options::OPT_coverage))
2967 CmdArgs.push_back("-femit-coverage-notes");
2968 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2969 false) ||
2970 Args.hasArg(options::OPT_coverage))
2971 CmdArgs.push_back("-femit-coverage-data");
2972
Diego Novilloc4b94da2015-08-05 23:27:40 +00002973 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2974 options::OPT_fno_coverage_mapping, false) &&
2975 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00002976 D.Diag(diag::err_drv_argument_only_allowed_with)
2977 << "-fcoverage-mapping"
2978 << "-fprofile-instr-generate";
2979
Diego Novilloc4b94da2015-08-05 23:27:40 +00002980 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2981 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00002982 CmdArgs.push_back("-fcoverage-mapping");
2983
2984 if (C.getArgs().hasArg(options::OPT_c) ||
2985 C.getArgs().hasArg(options::OPT_S)) {
2986 if (Output.isFilename()) {
2987 CmdArgs.push_back("-coverage-file");
2988 SmallString<128> CoverageFilename;
2989 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
2990 CoverageFilename = FinalOutput->getValue();
2991 } else {
2992 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
2993 }
2994 if (llvm::sys::path::is_relative(CoverageFilename)) {
2995 SmallString<128> Pwd;
2996 if (!llvm::sys::fs::current_path(Pwd)) {
2997 llvm::sys::path::append(Pwd, CoverageFilename);
2998 CoverageFilename.swap(Pwd);
2999 }
3000 }
3001 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3002 }
3003 }
3004}
3005
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003006/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3007/// smooshes them together with platform defaults, to decide whether
3008/// this compile should be using PIC mode or not. Returns a tuple of
3009/// (RelocationModel, PICLevel, IsPIE).
3010static std::tuple<llvm::Reloc::Model, unsigned, bool>
3011ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3012 const ArgList &Args) {
3013 // FIXME: why does this code...and so much everywhere else, use both
3014 // ToolChain.getTriple() and Triple?
3015 bool PIE = ToolChain.isPIEDefault();
3016 bool PIC = PIE || ToolChain.isPICDefault();
3017 bool IsPICLevelTwo = PIC;
3018
3019 bool KernelOrKext =
3020 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3021
3022 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003023 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003024 switch (ToolChain.getArch()) {
3025 case llvm::Triple::arm:
3026 case llvm::Triple::armeb:
3027 case llvm::Triple::thumb:
3028 case llvm::Triple::thumbeb:
3029 case llvm::Triple::aarch64:
3030 case llvm::Triple::mips:
3031 case llvm::Triple::mipsel:
3032 case llvm::Triple::mips64:
3033 case llvm::Triple::mips64el:
3034 PIC = true; // "-fpic"
3035 break;
3036
3037 case llvm::Triple::x86:
3038 case llvm::Triple::x86_64:
3039 PIC = true; // "-fPIC"
3040 IsPICLevelTwo = true;
3041 break;
3042
3043 default:
3044 break;
3045 }
3046 }
3047
3048 // OpenBSD-specific defaults for PIE
3049 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3050 switch (ToolChain.getArch()) {
3051 case llvm::Triple::mips64:
3052 case llvm::Triple::mips64el:
3053 case llvm::Triple::sparcel:
3054 case llvm::Triple::x86:
3055 case llvm::Triple::x86_64:
3056 IsPICLevelTwo = false; // "-fpie"
3057 break;
3058
3059 case llvm::Triple::ppc:
3060 case llvm::Triple::sparc:
3061 case llvm::Triple::sparcv9:
3062 IsPICLevelTwo = true; // "-fPIE"
3063 break;
3064
3065 default:
3066 break;
3067 }
3068 }
3069
3070 // The last argument relating to either PIC or PIE wins, and no
3071 // other argument is used. If the last argument is any flavor of the
3072 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3073 // option implicitly enables PIC at the same level.
3074 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3075 options::OPT_fpic, options::OPT_fno_pic,
3076 options::OPT_fPIE, options::OPT_fno_PIE,
3077 options::OPT_fpie, options::OPT_fno_pie);
3078 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3079 // is forced, then neither PIC nor PIE flags will have no effect.
3080 if (!ToolChain.isPICDefaultForced()) {
3081 if (LastPICArg) {
3082 Option O = LastPICArg->getOption();
3083 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3084 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3085 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3086 PIC =
3087 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3088 IsPICLevelTwo =
3089 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3090 } else {
3091 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003092 if (Triple.isPS4CPU()) {
3093 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3094 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3095 if (Model != "kernel") {
3096 PIC = true;
3097 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3098 << LastPICArg->getSpelling();
3099 }
3100 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003101 }
3102 }
3103 }
3104
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003105 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3106 // PIC level would've been set to level 1, force it back to level 2 PIC
3107 // instead.
3108 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003109 IsPICLevelTwo |= ToolChain.isPICDefault();
3110
James Y Knightc4015d32015-08-21 04:14:55 +00003111 // This kernel flags are a trump-card: they will disable PIC/PIE
3112 // generation, independent of the argument order.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003113 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
3114 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003115
3116 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3117 // This is a very special mode. It trumps the other modes, almost no one
3118 // uses it, and it isn't even valid on any OS but Darwin.
3119 if (!ToolChain.getTriple().isOSDarwin())
3120 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3121 << A->getSpelling() << ToolChain.getTriple().str();
3122
3123 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3124
3125 // Only a forced PIC mode can cause the actual compile to have PIC defines
3126 // etc., no flags are sufficient. This behavior was selected to closely
3127 // match that of llvm-gcc and Apple GCC before that.
3128 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3129
3130 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3131 }
3132
3133 if (PIC)
3134 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3135
3136 return std::make_tuple(llvm::Reloc::Static, 0, false);
3137}
3138
3139static const char *RelocationModelName(llvm::Reloc::Model Model) {
3140 switch (Model) {
3141 case llvm::Reloc::Default:
3142 return nullptr;
3143 case llvm::Reloc::Static:
3144 return "static";
3145 case llvm::Reloc::PIC_:
3146 return "pic";
3147 case llvm::Reloc::DynamicNoPIC:
3148 return "dynamic-no-pic";
3149 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003150 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003151}
3152
3153static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3154 ArgStringList &CmdArgs) {
3155 llvm::Reloc::Model RelocationModel;
3156 unsigned PICLevel;
3157 bool IsPIE;
3158 std::tie(RelocationModel, PICLevel, IsPIE) =
3159 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3160
3161 if (RelocationModel != llvm::Reloc::Static)
3162 CmdArgs.push_back("-KPIC");
3163}
3164
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003165void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003166 const InputInfo &Output, const InputInfoList &Inputs,
3167 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003168 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3169 const llvm::Triple Triple(TripleStr);
3170
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003171 bool KernelOrKext =
3172 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003173 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003174 ArgStringList CmdArgs;
3175
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003176 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003177 bool IsWindowsCygnus =
3178 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003179 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003180 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003181
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003182 // Check number of inputs for sanity. We need at least one input.
3183 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003184 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003185 // CUDA compilation may have multiple inputs (source file + results of
3186 // device-side compilations). All other jobs are expected to have exactly one
3187 // input.
3188 bool IsCuda = types::isCuda(Input.getType());
3189 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003190
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003191 // Invoke ourselves in -cc1 mode.
3192 //
3193 // FIXME: Implement custom jobs for internal actions.
3194 CmdArgs.push_back("-cc1");
3195
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003196 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003197 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003198 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003199
James Y Knight2db38f32015-08-15 03:45:25 +00003200 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3201 Triple.getArch() == llvm::Triple::thumb)) {
3202 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003203 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003204 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003205 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003206 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003207 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003208 }
3209
Tim Northover336f1892014-03-29 13:16:12 +00003210 // Push all default warning arguments that are specific to
3211 // the given target. These come before user provided warning options
3212 // are provided.
3213 getToolChain().addClangWarningOptions(CmdArgs);
3214
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003215 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003216 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003217
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003218 if (isa<AnalyzeJobAction>(JA)) {
3219 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3220 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003221 } else if (isa<MigrateJobAction>(JA)) {
3222 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003223 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003224 if (Output.getType() == types::TY_Dependencies)
3225 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003226 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003227 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003228 if (Args.hasArg(options::OPT_rewrite_objc) &&
3229 !Args.hasArg(options::OPT_g_Group))
3230 CmdArgs.push_back("-P");
3231 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003232 } else if (isa<AssembleJobAction>(JA)) {
3233 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003234
David Blaikie9260ed62013-07-25 21:19:01 +00003235 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003236
3237 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003238 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003239 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003240 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003241 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003242
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003243 if (JA.getType() == types::TY_Nothing)
3244 CmdArgs.push_back("-fsyntax-only");
3245 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003246 CmdArgs.push_back("-emit-pch");
3247 else
3248 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003249 } else if (isa<VerifyPCHJobAction>(JA)) {
3250 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003251 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003252 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3253 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003254 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003255 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003256 } else if (JA.getType() == types::TY_LLVM_IR ||
3257 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003258 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003259 } else if (JA.getType() == types::TY_LLVM_BC ||
3260 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003261 CmdArgs.push_back("-emit-llvm-bc");
3262 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003263 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003264 } else if (JA.getType() == types::TY_AST) {
3265 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003266 } else if (JA.getType() == types::TY_ModuleFile) {
3267 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003268 } else if (JA.getType() == types::TY_RewrittenObjC) {
3269 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003270 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003271 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3272 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003273 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003274 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003275 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003276 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003277
3278 // Preserve use-list order by default when emitting bitcode, so that
3279 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3280 // same result as running passes here. For LTO, we don't need to preserve
3281 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003282 if (JA.getType() == types::TY_LLVM_BC)
3283 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003284
3285 if (D.isUsingLTO())
3286 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003287 }
3288
Justin Bognera88f0122014-06-20 22:59:50 +00003289 // We normally speed up the clang process a bit by skipping destructors at
3290 // exit, but when we're generating diagnostics we can rely on some of the
3291 // cleanup.
3292 if (!C.isForDiagnostics())
3293 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003294
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003295// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003296#ifdef NDEBUG
3297 CmdArgs.push_back("-disable-llvm-verifier");
3298#endif
3299
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003300 // Set the main file name, so that debug info works even with
3301 // -save-temps.
3302 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003303 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003304
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003305 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003306 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003307 if (Args.hasArg(options::OPT_static))
3308 CmdArgs.push_back("-static-define");
3309
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003310 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003311 // Enable region store model by default.
3312 CmdArgs.push_back("-analyzer-store=region");
3313
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003314 // Treat blocks as analysis entry points.
3315 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3316
Ted Kremenek49c79792011-03-24 00:28:47 +00003317 CmdArgs.push_back("-analyzer-eagerly-assume");
3318
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003319 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003320 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003321 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003322
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003323 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003324 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003325
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003326 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003327 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003328
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003329 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003330
Artem Belevichba558952015-05-06 18:20:23 +00003331 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003332 CmdArgs.push_back("-analyzer-checker=cplusplus");
3333
Nico Webere8e53112014-05-11 01:04:02 +00003334 // Enable the following experimental checkers for testing.
3335 CmdArgs.push_back(
3336 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003337 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3338 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003339 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003340 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3341 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003342
3343 // Default nullability checks.
3344 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3345 CmdArgs.push_back(
3346 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003347 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003348
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003349 // Set the output format. The default is plist, for (lame) historical
3350 // reasons.
3351 CmdArgs.push_back("-analyzer-output");
3352 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003353 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003354 else
3355 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003356
Ted Kremenekfe449a22010-03-22 22:32:05 +00003357 // Disable the presentation of standard compiler warnings when
3358 // using --analyze. We only want to show static analyzer diagnostics
3359 // or frontend errors.
3360 CmdArgs.push_back("-w");
3361
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003362 // Add -Xanalyzer arguments when running as analyzer.
3363 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003364 }
3365
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003366 CheckCodeGenerationOptions(D, Args);
3367
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003368 llvm::Reloc::Model RelocationModel;
3369 unsigned PICLevel;
3370 bool IsPIE;
3371 std::tie(RelocationModel, PICLevel, IsPIE) =
3372 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003373
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003374 const char *RMName = RelocationModelName(RelocationModel);
3375 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003376 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003377 CmdArgs.push_back(RMName);
3378 }
3379 if (PICLevel > 0) {
3380 CmdArgs.push_back("-pic-level");
3381 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3382 if (IsPIE) {
3383 CmdArgs.push_back("-pie-level");
3384 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003385 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003386 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003387
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003388 CmdArgs.push_back("-mthread-model");
3389 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3390 CmdArgs.push_back(A->getValue());
3391 else
3392 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3393
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003394 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3395
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003396 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3397 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003398 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003399
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003400 // LLVM Code Generator Options.
3401
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003402 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3403 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003404 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3405 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003406 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003407 CmdArgs.push_back(A->getValue());
3408 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003409 }
3410 }
3411
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003412 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3413 StringRef v = A->getValue();
3414 CmdArgs.push_back("-mllvm");
3415 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3416 A->claim();
3417 }
3418
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003419 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3420 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003421 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003422 }
3423
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003424 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3425 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003426 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003427 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003428 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003429 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3430 CmdArgs.push_back("-fpcc-struct-return");
3431 } else {
3432 assert(A->getOption().matches(options::OPT_freg_struct_return));
3433 CmdArgs.push_back("-freg-struct-return");
3434 }
3435 }
3436
Roman Divacky65b88cd2011-03-01 17:40:53 +00003437 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3438 CmdArgs.push_back("-mrtd");
3439
Rafael Espindola224dd632011-12-14 21:02:23 +00003440 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003441 CmdArgs.push_back("-mdisable-fp-elim");
3442 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3443 options::OPT_fno_zero_initialized_in_bss))
3444 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003445
3446 bool OFastEnabled = isOptimizationLevelFast(Args);
3447 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3448 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003449 OptSpecifier StrictAliasingAliasOption =
3450 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003451 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3452 // doesn't do any TBAA.
3453 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003454 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003455 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003456 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003457 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3458 options::OPT_fno_struct_path_tbaa))
3459 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003460 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3461 false))
3462 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003463 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3464 options::OPT_fno_strict_vtable_pointers,
3465 false))
3466 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003467 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3468 options::OPT_fno_optimize_sibling_calls))
3469 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003470
Eric Christopher006208c2013-04-04 06:29:47 +00003471 // Handle segmented stacks.
3472 if (Args.hasArg(options::OPT_fsplit_stack))
3473 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003474
3475 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3476 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003477 OptSpecifier FastMathAliasOption =
3478 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3479
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003480 // Handle various floating point optimization flags, mapping them to the
3481 // appropriate LLVM code generation flags. The pattern for all of these is to
3482 // default off the codegen optimizations, and if any flag enables them and no
3483 // flag disables them after the flag enabling them, enable the codegen
3484 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003485 if (Arg *A = Args.getLastArg(
3486 options::OPT_ffast_math, FastMathAliasOption,
3487 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3488 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3489 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003490 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3491 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003492 A->getOption().getID() != options::OPT_fhonor_infinities)
3493 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003494 if (Arg *A = Args.getLastArg(
3495 options::OPT_ffast_math, FastMathAliasOption,
3496 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3497 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3498 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003499 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3500 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003501 A->getOption().getID() != options::OPT_fhonor_nans)
3502 CmdArgs.push_back("-menable-no-nans");
3503
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003504 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3505 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003506 if (Arg *A =
3507 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3508 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3509 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003510 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3511 // However, turning *off* -ffast_math merely restores the toolchain default
3512 // (which may be false).
3513 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3514 A->getOption().getID() == options::OPT_ffast_math ||
3515 A->getOption().getID() == options::OPT_Ofast)
3516 MathErrno = false;
3517 else if (A->getOption().getID() == options::OPT_fmath_errno)
3518 MathErrno = true;
3519 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003520 if (MathErrno)
3521 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003522
3523 // There are several flags which require disabling very specific
3524 // optimizations. Any of these being disabled forces us to turn off the
3525 // entire set of LLVM optimizations, so collect them through all the flag
3526 // madness.
3527 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003528 if (Arg *A = Args.getLastArg(
3529 options::OPT_ffast_math, FastMathAliasOption,
3530 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3531 options::OPT_fno_unsafe_math_optimizations,
3532 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003533 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3534 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003535 A->getOption().getID() != options::OPT_fno_associative_math)
3536 AssociativeMath = true;
3537 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003538 if (Arg *A = Args.getLastArg(
3539 options::OPT_ffast_math, FastMathAliasOption,
3540 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3541 options::OPT_fno_unsafe_math_optimizations,
3542 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003543 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3544 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003545 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3546 ReciprocalMath = true;
3547 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003548 if (Arg *A = Args.getLastArg(
3549 options::OPT_ffast_math, FastMathAliasOption,
3550 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3551 options::OPT_fno_unsafe_math_optimizations,
3552 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003553 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3554 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003555 A->getOption().getID() != options::OPT_fsigned_zeros)
3556 SignedZeros = false;
3557 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003558 if (Arg *A = Args.getLastArg(
3559 options::OPT_ffast_math, FastMathAliasOption,
3560 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3561 options::OPT_fno_unsafe_math_optimizations,
3562 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003563 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3564 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003565 A->getOption().getID() != options::OPT_ftrapping_math)
3566 TrappingMath = false;
3567 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3568 !TrappingMath)
3569 CmdArgs.push_back("-menable-unsafe-fp-math");
3570
Sanjay Patel76c9e092015-01-23 16:40:50 +00003571 if (!SignedZeros)
3572 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003573
Sanjay Patel359b1052015-04-09 15:03:23 +00003574 if (ReciprocalMath)
3575 CmdArgs.push_back("-freciprocal-math");
3576
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003577 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003578 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003579 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003580 options::OPT_ffp_contract)) {
3581 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003582 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003583 if (Val == "fast" || Val == "on" || Val == "off") {
3584 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3585 } else {
3586 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003587 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003588 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003589 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3590 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003591 // If fast-math is set then set the fp-contract mode to fast.
3592 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3593 }
3594 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003595
Sanjay Patel2987c292015-06-11 14:53:41 +00003596 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003597
Bob Wilson6a039162012-07-19 03:52:53 +00003598 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3599 // and if we find them, tell the frontend to provide the appropriate
3600 // preprocessor macros. This is distinct from enabling any optimizations as
3601 // these options induce language changes which must survive serialization
3602 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003603 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3604 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003605 if (!A->getOption().matches(options::OPT_fno_fast_math))
3606 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003607 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3608 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003609 if (A->getOption().matches(options::OPT_ffinite_math_only))
3610 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003611
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003612 // Decide whether to use verbose asm. Verbose assembly is the default on
3613 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003614 bool IsIntegratedAssemblerDefault =
3615 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003616 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003617 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003618 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003619 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003620
Rafael Espindolab8a12932015-05-22 20:44:03 +00003621 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3622 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003623 CmdArgs.push_back("-no-integrated-as");
3624
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003625 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3626 CmdArgs.push_back("-mdebug-pass");
3627 CmdArgs.push_back("Structure");
3628 }
3629 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3630 CmdArgs.push_back("-mdebug-pass");
3631 CmdArgs.push_back("Arguments");
3632 }
3633
John McCall8517abc2010-02-19 02:45:38 +00003634 // Enable -mconstructor-aliases except on darwin, where we have to
3635 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003636 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003637 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003638
John McCall7ef5cb32011-03-18 02:56:14 +00003639 // Darwin's kernel doesn't support guard variables; just die if we
3640 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003641 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003642 CmdArgs.push_back("-fforbid-guard-variables");
3643
Douglas Gregordbe39272011-02-01 15:15:22 +00003644 if (Args.hasArg(options::OPT_mms_bitfields)) {
3645 CmdArgs.push_back("-mms-bitfields");
3646 }
John McCall8517abc2010-02-19 02:45:38 +00003647
Daniel Dunbar306945d2009-09-16 06:17:29 +00003648 // This is a coarse approximation of what llvm-gcc actually does, both
3649 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3650 // complicated ways.
3651 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003652 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3653 options::OPT_fno_asynchronous_unwind_tables,
3654 (getToolChain().IsUnwindTablesDefault() ||
3655 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3656 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003657 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3658 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003659 CmdArgs.push_back("-munwind-tables");
3660
Chandler Carruth05fb5852012-11-21 23:40:23 +00003661 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003662
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003663 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3664 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003665 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003666 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003667
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003668 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003669 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003670
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003671 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003672 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003673 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003674 }
3675
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003676 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003677 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003678 if (!CPU.empty()) {
3679 CmdArgs.push_back("-target-cpu");
3680 CmdArgs.push_back(Args.MakeArgString(CPU));
3681 }
3682
Rafael Espindolaeb265472013-08-21 21:59:03 +00003683 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3684 CmdArgs.push_back("-mfpmath");
3685 CmdArgs.push_back(A->getValue());
3686 }
3687
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003688 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003689 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003690
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003691 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003692 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003693 default:
3694 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003695
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003696 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003697 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003698 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003699 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003700 // Use the effective triple, which takes into account the deployment target.
3701 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003702 break;
3703
Tim Northover573cbee2014-05-24 12:52:07 +00003704 case llvm::Triple::aarch64:
3705 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003706 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003707 break;
3708
Eric Christopher0b26a612010-03-02 02:41:08 +00003709 case llvm::Triple::mips:
3710 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003711 case llvm::Triple::mips64:
3712 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003713 AddMIPSTargetArgs(Args, CmdArgs);
3714 break;
3715
Ulrich Weigand8afad612014-07-28 13:17:52 +00003716 case llvm::Triple::ppc:
3717 case llvm::Triple::ppc64:
3718 case llvm::Triple::ppc64le:
3719 AddPPCTargetArgs(Args, CmdArgs);
3720 break;
3721
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003722 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003723 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003724 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003725 AddSparcTargetArgs(Args, CmdArgs);
3726 break;
3727
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003728 case llvm::Triple::x86:
3729 case llvm::Triple::x86_64:
3730 AddX86TargetArgs(Args, CmdArgs);
3731 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003732
3733 case llvm::Triple::hexagon:
3734 AddHexagonTargetArgs(Args, CmdArgs);
3735 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003736 }
3737
Douglas Katzman3459ce22015-10-08 04:24:12 +00003738 // The 'g' groups options involve a somewhat intricate sequence of decisions
3739 // about what to pass from the driver to the frontend, but by the time they
3740 // reach cc1 they've been factored into two well-defined orthogonal choices:
3741 // * what level of debug info to generate
3742 // * what dwarf version to write
3743 // This avoids having to monkey around further in cc1 other than to disable
3744 // codeview if not running in a Windows environment. Perhaps even that
3745 // decision should be made in the driver as well though.
3746 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
3747 CodeGenOptions::NoDebugInfo;
3748 // These two are potentially updated by AddClangCLArgs.
3749 unsigned DwarfVersion = 0;
3750 bool EmitCodeView = false;
3751
Hans Wennborg75958c42013-08-08 00:17:41 +00003752 // Add clang-cl arguments.
3753 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00003754 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00003755
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003756 // Pass the linker version in use.
3757 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3758 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003759 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003760 }
3761
Eric Christopherb7d97e92013-04-03 01:58:53 +00003762 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003763 CmdArgs.push_back("-momit-leaf-frame-pointer");
3764
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003765 // Explicitly error on some things we know we don't support and can't just
3766 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003767 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003768 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3769 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003770 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003771 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003772 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3773 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003774 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003775 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003776 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003777 }
3778
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003779 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003780 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003781 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003782 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003783 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3784 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003785 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003786 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003787 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003788
Chad Rosierbe10f982011-08-02 17:58:04 +00003789 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003790 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003791 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3792 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003793 }
3794
Rafael Espindola08a692a2010-03-07 04:46:18 +00003795 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003796 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003797 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003798 // If you say "-gline-tables-only -gsplit-dwarf", split-dwarf wins,
3799 // which mandates turning on "-g". But -split-dwarf is not a g_group option,
3800 // hence it takes a nontrivial test to decide about line-tables-only.
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003801 if (A->getOption().matches(options::OPT_gline_tables_only) &&
David Blaikiece3e7a62015-07-30 21:42:22 +00003802 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003803 DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
David Blaikiece3e7a62015-07-30 21:42:22 +00003804 SplitDwarfArg = nullptr;
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003805 } else if (!A->getOption().matches(options::OPT_g0)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003806 // Some 'g' group option other than one expressly disabling debug info
3807 // must have been the final (winning) one. They're all equivalent.
3808 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl549c5142014-02-17 17:40:52 +00003809 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003810 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003811
Douglas Katzman3459ce22015-10-08 04:24:12 +00003812 // If a -gdwarf argument appeared, use it, unless DebugInfoKind is None
3813 // (because that would mean that "-g0" was the rightmost 'g' group option).
3814 // FIXME: specifying "-gdwarf-<N>" "-g1" in that order works,
3815 // but "-g1" "-gdwarf-<N>" does not. A deceptively simple (but wrong) "fix"
3816 // exists of removing the gdwarf options from the g_group.
3817 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
3818 options::OPT_gdwarf_4))
3819 DwarfVersion = DwarfVersionNum(A->getSpelling());
3820
Reid Kleckner124955a2015-08-05 18:51:13 +00003821 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00003822 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
3823 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
3824 // DwarfVersion remains at 0 if no explicit choice was made.
3825 CmdArgs.push_back("-gcodeview");
3826 } else if (DwarfVersion == 0 &&
3827 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
3828 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
3829 }
Reid Kleckner124955a2015-08-05 18:51:13 +00003830
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003831 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3832 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003833
3834 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00003835 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003836 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003837 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003838
Eric Christopher138c32b2013-09-13 22:37:55 +00003839 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003840 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003841 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003842 CmdArgs.push_back("-dwarf-ext-refs");
3843 CmdArgs.push_back("-fmodule-format=obj");
3844 }
3845
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003846 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3847 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003848 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003849 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003850 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003851 CmdArgs.push_back("-backend-option");
3852 CmdArgs.push_back("-split-dwarf=Enable");
3853 }
3854
Douglas Katzman3459ce22015-10-08 04:24:12 +00003855 // After we've dealt with all combinations of things that could
3856 // make DebugInfoKind be other than None or DebugLineTablesOnly,
3857 // figure out if we need to "upgrade" it to standalone debug info.
3858 // We parse these two '-f' options whether or not they will be used,
3859 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
3860 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
3861 options::OPT_fno_standalone_debug,
3862 getToolChain().GetDefaultStandaloneDebug());
3863 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
3864 DebugInfoKind = CodeGenOptions::FullDebugInfo;
3865 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion);
3866
Eric Christopher138c32b2013-09-13 22:37:55 +00003867 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3868 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3869 CmdArgs.push_back("-backend-option");
3870 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3871 }
Eric Christophereec89c22013-06-18 00:03:50 +00003872
Eric Christopher0d403d22014-02-14 01:27:03 +00003873 // -gdwarf-aranges turns on the emission of the aranges section in the
3874 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003875 // Always enabled on the PS4.
3876 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00003877 CmdArgs.push_back("-backend-option");
3878 CmdArgs.push_back("-generate-arange-section");
3879 }
3880
David Blaikief36d9ba2014-01-27 18:52:43 +00003881 if (Args.hasFlag(options::OPT_fdebug_types_section,
3882 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003883 CmdArgs.push_back("-backend-option");
3884 CmdArgs.push_back("-generate-type-units");
3885 }
Eric Christophereec89c22013-06-18 00:03:50 +00003886
Ed Schouten6e576152015-03-26 17:50:28 +00003887 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3888 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3889
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003890 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003891 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003892 CmdArgs.push_back("-ffunction-sections");
3893 }
3894
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003895 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3896 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003897 CmdArgs.push_back("-fdata-sections");
3898 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003899
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003900 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003901 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003902 CmdArgs.push_back("-fno-unique-section-names");
3903
Chris Lattner3c77a352010-06-22 00:03:40 +00003904 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3905
Diego Novilloa0545962015-07-10 18:00:07 +00003906 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003907
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003908 // Pass options for controlling the default header search paths.
3909 if (Args.hasArg(options::OPT_nostdinc)) {
3910 CmdArgs.push_back("-nostdsysteminc");
3911 CmdArgs.push_back("-nobuiltininc");
3912 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003913 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003914 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003915 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3916 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3917 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003918
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003919 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003920 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003921 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003922
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003923 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3924
Ted Kremenekf7639e12012-03-06 20:06:33 +00003925 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003926 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003927 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003928 options::OPT_ccc_arcmt_modify,
3929 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003930 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003931 switch (A->getOption().getID()) {
3932 default:
3933 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003934 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003935 CmdArgs.push_back("-arcmt-check");
3936 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003937 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003938 CmdArgs.push_back("-arcmt-modify");
3939 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003940 case options::OPT_ccc_arcmt_migrate:
3941 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003942 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003943 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003944
3945 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3946 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003947 break;
John McCalld70fb982011-06-15 23:25:17 +00003948 }
3949 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003950 } else {
3951 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3952 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3953 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003954 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003955
Ted Kremenekf7639e12012-03-06 20:06:33 +00003956 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3957 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003958 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3959 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003960 }
3961 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003962 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003963
3964 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003965 options::OPT_objcmt_migrate_subscripting,
3966 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003967 // None specified, means enable them all.
3968 CmdArgs.push_back("-objcmt-migrate-literals");
3969 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003970 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003971 } else {
3972 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3973 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003974 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003975 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003976 } else {
3977 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3978 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3979 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3980 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3981 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3982 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003983 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003984 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3985 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3986 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3987 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3988 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3989 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3990 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003991 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003992 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003993 }
3994
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003995 // Add preprocessing options like -I, -D, etc. if we are using the
3996 // preprocessor.
3997 //
3998 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003999 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00004000 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004001
Rafael Espindolaa7431922011-07-21 23:40:37 +00004002 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4003 // that "The compiler can only warn and ignore the option if not recognized".
4004 // When building with ccache, it will pass -D options to clang even on
4005 // preprocessed inputs and configure concludes that -fPIC is not supported.
4006 Args.ClaimAllArgs(options::OPT_D);
4007
Alp Toker7874bdc2013-11-15 20:40:58 +00004008 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004009 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4010 if (A->getOption().matches(options::OPT_O4)) {
4011 CmdArgs.push_back("-O3");
4012 D.Diag(diag::warn_O4_is_O3);
4013 } else {
4014 A->render(Args, CmdArgs);
4015 }
4016 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004017
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004018 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004019 for (const Arg *A :
4020 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4021 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004022 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004023 }
4024
Rafael Espindola577637a2015-01-03 00:06:04 +00004025 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004026
Richard Smith3be1cb22014-08-07 00:24:21 +00004027 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004028 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004029 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4030 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004031 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004032 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004033
4034 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004035 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004036 //
4037 // If a std is supplied, only add -trigraphs if it follows the
4038 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004039 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004040 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4041 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004042 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004043 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004044 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004045 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004046 else
4047 Std->render(Args, CmdArgs);
4048
Nico Weber00721502014-12-23 22:32:37 +00004049 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004050 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004051 options::OPT_ftrigraphs,
4052 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004053 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004054 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004055 } else {
4056 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004057 //
4058 // FIXME: Clang doesn't correctly handle -std= when the input language
4059 // doesn't match. For the time being just ignore this for C++ inputs;
4060 // eventually we want to do all the standard defaulting here instead of
4061 // splitting it between the driver and clang -cc1.
4062 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004063 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4064 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004065 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004066 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004067
Nico Weber00721502014-12-23 22:32:37 +00004068 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4069 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004070 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004071
Richard Smith282b4492013-09-04 22:50:31 +00004072 // GCC's behavior for -Wwrite-strings is a bit strange:
4073 // * In C, this "warning flag" changes the types of string literals from
4074 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4075 // for the discarded qualifier.
4076 // * In C++, this is just a normal warning flag.
4077 //
4078 // Implementing this warning correctly in C is hard, so we follow GCC's
4079 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4080 // a non-const char* in C, rather than using this crude hack.
4081 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004082 // FIXME: This should behave just like a warning flag, and thus should also
4083 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4084 Arg *WriteStrings =
4085 Args.getLastArg(options::OPT_Wwrite_strings,
4086 options::OPT_Wno_write_strings, options::OPT_w);
4087 if (WriteStrings &&
4088 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004089 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004090 }
4091
Chandler Carruth61fbf622011-04-23 09:27:53 +00004092 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004093 // during C++ compilation, which it is by default. GCC keeps this define even
4094 // in the presence of '-w', match this behavior bug-for-bug.
4095 if (types::isCXX(InputType) &&
4096 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4097 true)) {
4098 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004099 }
4100
Chandler Carruthe0391482010-05-22 02:21:53 +00004101 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4102 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4103 if (Asm->getOption().matches(options::OPT_fasm))
4104 CmdArgs.push_back("-fgnu-keywords");
4105 else
4106 CmdArgs.push_back("-fno-gnu-keywords");
4107 }
4108
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004109 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4110 CmdArgs.push_back("-fno-dwarf-directory-asm");
4111
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004112 if (ShouldDisableAutolink(Args, getToolChain()))
4113 CmdArgs.push_back("-fno-autolink");
4114
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004115 // Add in -fdebug-compilation-dir if necessary.
4116 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004117
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004118 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4119 StringRef Map = A->getValue();
4120 if (Map.find('=') == StringRef::npos)
4121 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4122 else
4123 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4124 A->claim();
4125 }
4126
Richard Smith9a568822011-11-21 19:36:32 +00004127 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4128 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004129 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004130 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004131 }
4132
Richard Smith79c927b2013-11-06 19:31:51 +00004133 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4134 CmdArgs.push_back("-foperator-arrow-depth");
4135 CmdArgs.push_back(A->getValue());
4136 }
4137
Richard Smith9a568822011-11-21 19:36:32 +00004138 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4139 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004140 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004141 }
4142
Richard Smitha3d3bd22013-05-08 02:12:03 +00004143 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4144 CmdArgs.push_back("-fconstexpr-steps");
4145 CmdArgs.push_back(A->getValue());
4146 }
4147
Richard Smithb3a14522013-02-22 01:59:51 +00004148 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4149 CmdArgs.push_back("-fbracket-depth");
4150 CmdArgs.push_back(A->getValue());
4151 }
4152
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004153 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4154 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004155 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004156 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004157 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4158 } else
4159 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004160 }
4161
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004162 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004163 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004164
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004165 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4166 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004167 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004168 }
David Chisnall5778fce2009-08-31 16:41:57 +00004169
Chris Lattnere23003d2010-01-09 21:54:33 +00004170 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4171 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004172 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004173 }
4174
Chris Lattnerb35583d2010-04-07 20:49:23 +00004175 CmdArgs.push_back("-ferror-limit");
4176 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004177 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004178 else
4179 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004180
Chandler Carrutha77a7272010-05-06 04:55:18 +00004181 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4182 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004183 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004184 }
4185
4186 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4187 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004188 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004189 }
4190
Richard Smithf6f003a2011-12-16 19:06:07 +00004191 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4192 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004193 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004194 }
4195
Nick Lewycky24653262014-12-16 21:39:02 +00004196 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4197 CmdArgs.push_back("-fspell-checking-limit");
4198 CmdArgs.push_back(A->getValue());
4199 }
4200
Daniel Dunbar2c978472009-11-04 06:24:47 +00004201 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004202 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004203 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004204 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004205 } else {
4206 // If -fmessage-length=N was not specified, determine whether this is a
4207 // terminal and, if so, implicitly define -fmessage-length appropriately.
4208 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004209 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004210 }
4211
John McCallb4a99d32013-02-19 01:57:35 +00004212 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4213 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4214 options::OPT_fvisibility_ms_compat)) {
4215 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4216 CmdArgs.push_back("-fvisibility");
4217 CmdArgs.push_back(A->getValue());
4218 } else {
4219 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4220 CmdArgs.push_back("-fvisibility");
4221 CmdArgs.push_back("hidden");
4222 CmdArgs.push_back("-ftype-visibility");
4223 CmdArgs.push_back("default");
4224 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004225 }
4226
Douglas Gregor08329632010-06-15 17:05:35 +00004227 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004228
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004229 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4230
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004231 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004232 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4233 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004234 CmdArgs.push_back("-ffreestanding");
4235
Daniel Dunbare357d562009-12-03 18:42:11 +00004236 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004237 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004238 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004239 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004240 // Emulated TLS is enabled by default on Android, and can be enabled manually
4241 // with -femulated-tls.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004242 bool EmulatedTLSDefault = Triple.isAndroid();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004243 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4244 EmulatedTLSDefault))
4245 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004246 // AltiVec-like language extensions aren't relevant for assembling.
4247 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004248 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004249 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4250 }
Richard Trieu91844232012-06-26 18:18:47 +00004251 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4252 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004253
Alexey Bataevdb390212015-05-20 04:24:19 +00004254 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004255 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4256 options::OPT_fno_openmp, false))
4257 switch (getOpenMPRuntime(getToolChain(), Args)) {
4258 case OMPRT_OMP:
4259 case OMPRT_IOMP5:
4260 // Clang can generate useful OpenMP code for these two runtime libraries.
4261 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004262
4263 // If no option regarding the use of TLS in OpenMP codegeneration is
4264 // given, decide a default based on the target. Otherwise rely on the
4265 // options and pass the right information to the frontend.
4266 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004267 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004268 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004269 break;
4270 default:
4271 // By default, if Clang doesn't know how to generate useful OpenMP code
4272 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4273 // down to the actual compilation.
4274 // FIXME: It would be better to have a mode which *only* omits IR
4275 // generation based on the OpenMP support so that we get consistent
4276 // semantic analysis, etc.
4277 break;
4278 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004279
Peter Collingbourne32701642013-11-01 18:16:25 +00004280 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004281 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004282
Eric Christopher459d2712013-02-19 06:16:53 +00004283 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004284 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4285 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4286 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4287 Arch == llvm::Triple::ppc64le))
4288 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4289 << "ppc/ppc64/ppc64le";
4290 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004291
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004292 // -fzvector is incompatible with -faltivec.
4293 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4294 if (Args.hasArg(options::OPT_faltivec))
4295 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4296 << "-faltivec";
4297
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004298 if (getToolChain().SupportsProfiling())
4299 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004300
4301 // -flax-vector-conversions is default.
4302 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4303 options::OPT_fno_lax_vector_conversions))
4304 CmdArgs.push_back("-fno-lax-vector-conversions");
4305
John Brawna7b4ec02015-08-10 11:11:28 +00004306 if (Args.getLastArg(options::OPT_fapple_kext) ||
4307 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004308 CmdArgs.push_back("-fapple-kext");
4309
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004310 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004311 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004312 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004313 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4314 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004315
4316 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4317 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004318 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004319 }
4320
Bob Wilson14adb362012-02-03 06:27:22 +00004321 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004322
Chandler Carruth6e501032011-03-27 00:04:55 +00004323 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4324 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004325 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004326 if (A->getOption().matches(options::OPT_fwrapv))
4327 CmdArgs.push_back("-fwrapv");
4328 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4329 options::OPT_fno_strict_overflow)) {
4330 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4331 CmdArgs.push_back("-fwrapv");
4332 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004333
4334 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4335 options::OPT_fno_reroll_loops))
4336 if (A->getOption().matches(options::OPT_freroll_loops))
4337 CmdArgs.push_back("-freroll-loops");
4338
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004339 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004340 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4341 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004342
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004343 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4344
Daniel Dunbar4930e332009-11-17 08:07:36 +00004345 // -stack-protector=0 is default.
4346 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004347 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4348 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4349 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4350 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4351 Args.ClaimAllArgs(options::OPT_fstack_protector);
4352 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004353 options::OPT_fstack_protector_all,
4354 options::OPT_fstack_protector_strong,
4355 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004356 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004357 StackProtectorLevel = std::max<unsigned>(
4358 LangOptions::SSPOn,
4359 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004360 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004361 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004362 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004363 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004364 } else {
4365 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004366 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004367 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004368 if (StackProtectorLevel) {
4369 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004370 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004371 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004372
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004373 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004374 for (const Arg *A : Args.filtered(options::OPT__param)) {
4375 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004376 if (Str.startswith("ssp-buffer-size=")) {
4377 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004378 CmdArgs.push_back("-stack-protector-buffer-size");
4379 // FIXME: Verify the argument is a valid integer.
4380 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004381 }
Sean Silva14facf32015-06-09 01:57:17 +00004382 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004383 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004384 }
4385
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004386 // Translate -mstackrealign
4387 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004388 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004389 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004390
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004391 if (Args.hasArg(options::OPT_mstack_alignment)) {
4392 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4393 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004394 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004395
Hans Wennborg77dc2362015-01-20 19:45:50 +00004396 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4397 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4398
4399 if (!Size.empty())
4400 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4401 else
4402 CmdArgs.push_back("-mstack-probe-size=0");
4403 }
4404
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004405 switch (getToolChain().getArch()) {
4406 case llvm::Triple::aarch64:
4407 case llvm::Triple::aarch64_be:
4408 case llvm::Triple::arm:
4409 case llvm::Triple::armeb:
4410 case llvm::Triple::thumb:
4411 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004412 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004413 break;
4414
4415 default:
4416 break;
4417 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004418
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004419 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4420 options::OPT_mno_restrict_it)) {
4421 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4422 CmdArgs.push_back("-backend-option");
4423 CmdArgs.push_back("-arm-restrict-it");
4424 } else {
4425 CmdArgs.push_back("-backend-option");
4426 CmdArgs.push_back("-arm-no-restrict-it");
4427 }
James Y Knight2db38f32015-08-15 03:45:25 +00004428 } else if (Triple.isOSWindows() &&
4429 (Triple.getArch() == llvm::Triple::arm ||
4430 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004431 // Windows on ARM expects restricted IT blocks
4432 CmdArgs.push_back("-backend-option");
4433 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004434 }
4435
Daniel Dunbard18049a2009-04-07 21:16:11 +00004436 // Forward -f options with positive and negative forms; we translate
4437 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004438 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4439 StringRef fname = A->getValue();
4440 if (!llvm::sys::fs::exists(fname))
4441 D.Diag(diag::err_drv_no_such_file) << fname;
4442 else
4443 A->render(Args, CmdArgs);
4444 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004445
John Brawna7b4ec02015-08-10 11:11:28 +00004446 // -fbuiltin is default unless -mkernel is used
4447 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4448 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004449 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004450
Nuno Lopes13c88c72009-12-16 16:59:22 +00004451 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4452 options::OPT_fno_assume_sane_operator_new))
4453 CmdArgs.push_back("-fno-assume-sane-operator-new");
4454
Daniel Dunbar4930e332009-11-17 08:07:36 +00004455 // -fblocks=0 is default.
4456 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004457 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004458 (Args.hasArg(options::OPT_fgnu_runtime) &&
4459 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4460 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004461 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004462
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004463 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004464 !getToolChain().hasBlocksRuntime())
4465 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004466 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004467
Richard Smith47972af2015-06-16 00:08:24 +00004468 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004469 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004470 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004471 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004472 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004473 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4474 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004475 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004476 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004477 HaveModules = true;
4478 }
4479 }
4480
Richard Smith47972af2015-06-16 00:08:24 +00004481 // -fmodule-maps enables implicit reading of module map files. By default,
4482 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004483 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4484 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004485 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004486 }
4487
Daniel Jasperac42b752013-10-21 06:34:34 +00004488 // -fmodules-decluse checks that modules used are declared so (off by
4489 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004490 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004491 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004492 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004493 }
4494
Daniel Jasper962b38e2014-04-11 11:47:45 +00004495 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4496 // all #included headers are part of modules.
4497 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004498 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004499 CmdArgs.push_back("-fmodules-strict-decluse");
4500 }
4501
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004502 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4503 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4504 options::OPT_fno_implicit_modules)) {
4505 CmdArgs.push_back("-fno-implicit-modules");
4506 }
4507
Daniel Jasperac42b752013-10-21 06:34:34 +00004508 // -fmodule-name specifies the module that is currently being built (or
4509 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004510 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004511
Richard Smith9887d792014-10-17 01:42:53 +00004512 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004513 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004514 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004515
Richard Smithe842a472014-10-22 02:05:46 +00004516 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004517 if (HaveModules)
4518 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4519 else
4520 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004521
4522 // -fmodule-cache-path specifies where our implicitly-built module files
4523 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004524 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004525 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004526 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004527 if (HaveModules) {
4528 if (C.isForDiagnostics()) {
4529 // When generating crash reports, we want to emit the modules along with
4530 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004531 Path = Output.getFilename();
4532 llvm::sys::path::replace_extension(Path, ".cache");
4533 llvm::sys::path::append(Path, "modules");
4534 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004535 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004536 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004537 llvm::sys::path::append(Path, "org.llvm.clang.");
4538 appendUserToPath(Path);
4539 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004540 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004541 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004542 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4543 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004544 }
4545
4546 // When building modules and generating crashdumps, we need to dump a module
4547 // dependency VFS alongside the output.
4548 if (HaveModules && C.isForDiagnostics()) {
4549 SmallString<128> VFSDir(Output.getFilename());
4550 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004551 // Add the cache directory as a temp so the crash diagnostics pick it up.
4552 C.addTempFile(Args.MakeArgString(VFSDir));
4553
Justin Bognera88f0122014-06-20 22:59:50 +00004554 llvm::sys::path::append(VFSDir, "vfs");
4555 CmdArgs.push_back("-module-dependency-dir");
4556 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004557 }
4558
Richard Smith9887d792014-10-17 01:42:53 +00004559 if (HaveModules)
4560 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004561
Douglas Gregor35b04d62013-02-07 19:01:24 +00004562 // Pass through all -fmodules-ignore-macro arguments.
4563 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004564 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4565 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004566
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004567 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4568
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004569 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4570 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4571 D.Diag(diag::err_drv_argument_not_allowed_with)
4572 << A->getAsString(Args) << "-fbuild-session-timestamp";
4573
4574 llvm::sys::fs::file_status Status;
4575 if (llvm::sys::fs::status(A->getValue(), Status))
4576 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004577 CmdArgs.push_back(Args.MakeArgString(
4578 "-fbuild-session-timestamp=" +
4579 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004580 }
4581
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004582 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004583 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4584 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004585 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4586
4587 Args.AddLastArg(CmdArgs,
4588 options::OPT_fmodules_validate_once_per_build_session);
4589 }
4590
Ben Langmuirdcf73862014-03-12 00:06:17 +00004591 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4592
John McCalldfea9982010-04-09 19:12:06 +00004593 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004594 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004595 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004596 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004597
Anders Carlssond470fef2010-11-21 00:09:52 +00004598 // -felide-constructors is the default.
4599 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004600 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004601 CmdArgs.push_back("-fno-elide-constructors");
4602
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004603 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004604
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004605 if (KernelOrKext || (types::isCXX(InputType) &&
4606 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4607 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004608 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004609
Tony Linthicum76329bf2011-12-12 21:14:55 +00004610 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004611 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4612 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004613 CmdArgs.push_back("-fshort-enums");
4614
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004615 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004616 if (Arg *A = Args.getLastArg(
4617 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4618 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4619 if (A->getOption().matches(options::OPT_funsigned_char) ||
4620 A->getOption().matches(options::OPT_fno_signed_char)) {
4621 CmdArgs.push_back("-fno-signed-char");
4622 }
4623 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004624 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004625 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004626
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004627 // -fuse-cxa-atexit is default.
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00004628 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4629 options::OPT_fno_use_cxa_atexit,
4630 !IsWindowsCygnus && !IsWindowsGNU &&
4631 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4632 getToolChain().getArch() != llvm::Triple::hexagon &&
4633 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004634 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004635 CmdArgs.push_back("-fno-use-cxa-atexit");
4636
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004637 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004638 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004639 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004640 CmdArgs.push_back("-fms-extensions");
4641
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004642 // -fno-use-line-directives is default.
4643 if (Args.hasFlag(options::OPT_fuse_line_directives,
4644 options::OPT_fno_use_line_directives, false))
4645 CmdArgs.push_back("-fuse-line-directives");
4646
Francois Pichet1b4f1632011-09-17 04:32:15 +00004647 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004648 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004649 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004650 (IsWindowsMSVC &&
4651 Args.hasFlag(options::OPT_fms_extensions,
4652 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004653 CmdArgs.push_back("-fms-compatibility");
4654
David Majnemerc371ff02015-03-22 08:39:22 +00004655 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004656 VersionTuple MSVT = visualstudio::getMSVCVersion(
4657 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4658 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004659 CmdArgs.push_back(
4660 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004661
David Majnemer8db91762015-05-18 04:49:30 +00004662 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4663 if (ImplyVCPPCXXVer) {
4664 if (IsMSVC2015Compatible)
4665 CmdArgs.push_back("-std=c++14");
4666 else
4667 CmdArgs.push_back("-std=c++11");
4668 }
4669
Eric Christopher5ecce122013-02-18 00:38:31 +00004670 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004671 if (Args.hasFlag(options::OPT_fborland_extensions,
4672 options::OPT_fno_borland_extensions, false))
4673 CmdArgs.push_back("-fborland-extensions");
4674
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00004675 // -fno-declspec is default, except for PS4.
4676 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
4677 getToolChain().getTriple().isPS4()))
4678 CmdArgs.push_back("-fdeclspec");
4679 else if (Args.hasArg(options::OPT_fno_declspec))
4680 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
4681
David Majnemerc371ff02015-03-22 08:39:22 +00004682 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4683 // than 19.
4684 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4685 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004686 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004687 CmdArgs.push_back("-fno-threadsafe-statics");
4688
Francois Pichet02744872011-09-01 16:38:08 +00004689 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4690 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004691 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004692 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004693 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004694
Chandler Carruthe03aa552010-04-17 20:17:31 +00004695 // -fgnu-keywords default varies depending on language; only pass if
4696 // specified.
4697 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004698 options::OPT_fno_gnu_keywords))
4699 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004700
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004701 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004702 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004703 CmdArgs.push_back("-fgnu89-inline");
4704
Chad Rosier9c76d242012-03-15 22:31:42 +00004705 if (Args.hasArg(options::OPT_fno_inline))
4706 CmdArgs.push_back("-fno-inline");
4707
Chad Rosier64d6be92012-03-06 21:17:19 +00004708 if (Args.hasArg(options::OPT_fno_inline_functions))
4709 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004710
John McCall5fb5df92012-06-20 06:18:46 +00004711 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004712
John McCall5fb5df92012-06-20 06:18:46 +00004713 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004714 // legacy is the default. Except for deployment taget of 10.5,
4715 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4716 // gets ignored silently.
4717 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004718 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4719 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004720 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004721 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004722 if (getToolChain().UseObjCMixedDispatch())
4723 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4724 else
4725 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4726 }
4727 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004728
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004729 // When ObjectiveC legacy runtime is in effect on MacOSX,
4730 // turn on the option to do Array/Dictionary subscripting
4731 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004732 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004733 getToolChain().getTriple().isMacOSX() &&
4734 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4735 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004736 objcRuntime.isNeXTFamily())
4737 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004738
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004739 // -fencode-extended-block-signature=1 is default.
4740 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4741 CmdArgs.push_back("-fencode-extended-block-signature");
4742 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004743
John McCall24fc0de2011-07-06 00:26:06 +00004744 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4745 // NOTE: This logic is duplicated in ToolChains.cpp.
4746 bool ARC = isObjCAutoRefCount(Args);
4747 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004748 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004749
John McCall24fc0de2011-07-06 00:26:06 +00004750 CmdArgs.push_back("-fobjc-arc");
4751
Chandler Carruth491db322011-11-04 07:34:47 +00004752 // FIXME: It seems like this entire block, and several around it should be
4753 // wrapped in isObjC, but for now we just use it here as this is where it
4754 // was being used previously.
4755 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4756 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4757 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4758 else
4759 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4760 }
4761
John McCall24fc0de2011-07-06 00:26:06 +00004762 // Allow the user to enable full exceptions code emission.
4763 // We define off for Objective-CC, on for Objective-C++.
4764 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4765 options::OPT_fno_objc_arc_exceptions,
4766 /*default*/ types::isCXX(InputType)))
4767 CmdArgs.push_back("-fobjc-arc-exceptions");
4768 }
4769
4770 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4771 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004772 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004773 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004774
John McCall24fc0de2011-07-06 00:26:06 +00004775 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4776 // takes precedence.
4777 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4778 if (!GCArg)
4779 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4780 if (GCArg) {
4781 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004782 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004783 } else if (getToolChain().SupportsObjCGC()) {
4784 GCArg->render(Args, CmdArgs);
4785 } else {
4786 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004787 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004788 }
4789 }
4790
Bob Wilsonb111ec92015-03-02 19:01:14 +00004791 if (Args.hasFlag(options::OPT_fapplication_extension,
4792 options::OPT_fno_application_extension, false))
4793 CmdArgs.push_back("-fapplication-extension");
4794
Reid Klecknerc542d372014-06-27 17:02:02 +00004795 // Handle GCC-style exception args.
4796 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004797 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4798 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004799
4800 if (getToolChain().UseSjLjExceptions())
4801 CmdArgs.push_back("-fsjlj-exceptions");
4802
4803 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004804 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4805 options::OPT_fno_assume_sane_operator_new))
4806 CmdArgs.push_back("-fno-assume-sane-operator-new");
4807
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004808 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4809 // most platforms.
4810 if (Args.hasFlag(options::OPT_fsized_deallocation,
4811 options::OPT_fno_sized_deallocation, false))
4812 CmdArgs.push_back("-fsized-deallocation");
4813
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004814 // -fconstant-cfstrings is default, and may be subject to argument translation
4815 // on Darwin.
4816 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4817 options::OPT_fno_constant_cfstrings) ||
4818 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4819 options::OPT_mno_constant_cfstrings))
4820 CmdArgs.push_back("-fno-constant-cfstrings");
4821
John Thompsoned4e2952009-11-05 20:14:16 +00004822 // -fshort-wchar default varies depending on platform; only
4823 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004824 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4825 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004826 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004827
Hans Wennborg28c96312013-07-31 23:39:13 +00004828 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004829 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004830 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004831 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004832
Daniel Dunbar096ed292011-10-05 21:04:55 +00004833 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4834 // -fno-pack-struct doesn't apply to -fpack-struct=.
4835 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004836 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004837 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004838 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004839 } else if (Args.hasFlag(options::OPT_fpack_struct,
4840 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004841 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004842 }
4843
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004844 // Handle -fmax-type-align=N and -fno-type-align
4845 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4846 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4847 if (!SkipMaxTypeAlign) {
4848 std::string MaxTypeAlignStr = "-fmax-type-align=";
4849 MaxTypeAlignStr += A->getValue();
4850 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4851 }
4852 } else if (getToolChain().getTriple().isOSDarwin()) {
4853 if (!SkipMaxTypeAlign) {
4854 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4855 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4856 }
4857 }
4858
John Brawna7b4ec02015-08-10 11:11:28 +00004859 // -fcommon is the default unless compiling kernel code or the target says so
4860 bool NoCommonDefault =
4861 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
4862 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
4863 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004864 CmdArgs.push_back("-fno-common");
4865
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004866 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004867 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004868 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004869 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004870 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004871 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004872
Daniel Dunbar6358d682010-10-15 22:30:42 +00004873 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004874 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004875 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004876 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004877
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004878 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004879 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4880 StringRef value = inputCharset->getValue();
4881 if (value != "UTF-8")
4882 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4883 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004884 }
4885
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004886 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004887 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4888 StringRef value = execCharset->getValue();
4889 if (value != "UTF-8")
4890 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4891 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004892 }
4893
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004894 // -fcaret-diagnostics is default.
4895 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4896 options::OPT_fno_caret_diagnostics, true))
4897 CmdArgs.push_back("-fno-caret-diagnostics");
4898
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004899 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004900 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004901 options::OPT_fno_diagnostics_fixit_info))
4902 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004903
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004904 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004905 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004906 options::OPT_fno_diagnostics_show_option))
4907 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004908
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004909 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004910 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004911 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004912 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004913 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004914
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004915 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004916 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004917 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004918 }
4919
Chandler Carruthb6766f02011-03-27 01:50:55 +00004920 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004921 options::OPT_fdiagnostics_show_note_include_stack,
4922 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004923 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004924 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004925 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4926 else
4927 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4928 }
4929
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004930 // Color diagnostics are the default, unless the terminal doesn't support
4931 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004932 // Support both clang's -f[no-]color-diagnostics and gcc's
4933 // -f[no-]diagnostics-colors[=never|always|auto].
4934 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004935 for (const auto &Arg : Args) {
4936 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004937 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4938 !O.matches(options::OPT_fdiagnostics_color) &&
4939 !O.matches(options::OPT_fno_color_diagnostics) &&
4940 !O.matches(options::OPT_fno_diagnostics_color) &&
4941 !O.matches(options::OPT_fdiagnostics_color_EQ))
4942 continue;
4943
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004944 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004945 if (O.matches(options::OPT_fcolor_diagnostics) ||
4946 O.matches(options::OPT_fdiagnostics_color)) {
4947 ShowColors = Colors_On;
4948 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4949 O.matches(options::OPT_fno_diagnostics_color)) {
4950 ShowColors = Colors_Off;
4951 } else {
4952 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004953 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004954 if (value == "always")
4955 ShowColors = Colors_On;
4956 else if (value == "never")
4957 ShowColors = Colors_Off;
4958 else if (value == "auto")
4959 ShowColors = Colors_Auto;
4960 else
4961 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004962 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004963 }
4964 }
4965 if (ShowColors == Colors_On ||
4966 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004967 CmdArgs.push_back("-fcolor-diagnostics");
4968
Nico Rieck7857d462013-09-11 00:38:02 +00004969 if (Args.hasArg(options::OPT_fansi_escape_codes))
4970 CmdArgs.push_back("-fansi-escape-codes");
4971
Daniel Dunbardb097022009-06-08 21:13:54 +00004972 if (!Args.hasFlag(options::OPT_fshow_source_location,
4973 options::OPT_fno_show_source_location))
4974 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004975
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004976 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004977 true))
4978 CmdArgs.push_back("-fno-show-column");
4979
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004980 if (!Args.hasFlag(options::OPT_fspell_checking,
4981 options::OPT_fno_spell_checking))
4982 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004983
Chad Rosierc8e56e82012-12-05 21:08:21 +00004984 // -fno-asm-blocks is default.
4985 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4986 false))
4987 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004988
Steven Wucb0d13f2015-01-16 23:05:28 +00004989 // -fgnu-inline-asm is default.
4990 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4991 options::OPT_fno_gnu_inline_asm, true))
4992 CmdArgs.push_back("-fno-gnu-inline-asm");
4993
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004994 // Enable vectorization per default according to the optimization level
4995 // selected. For optimization levels that want vectorization we use the alias
4996 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004997 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004998 OptSpecifier VectorizeAliasOption =
4999 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005000 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005001 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005002 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005003
Chad Rosier136d67d2014-04-28 19:30:57 +00005004 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005005 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005006 OptSpecifier SLPVectAliasOption =
5007 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005008 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005009 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005010 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005011
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005012 // -fno-slp-vectorize-aggressive is default.
5013 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005014 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005015 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005016
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005017 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5018 A->render(Args, CmdArgs);
5019
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005020 // -fdollars-in-identifiers default varies depending on platform and
5021 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005022 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005023 options::OPT_fno_dollars_in_identifiers)) {
5024 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005025 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005026 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005027 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005028 }
5029
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005030 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5031 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005032 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005033 options::OPT_fno_unit_at_a_time)) {
5034 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005035 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005036 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005037
Eli Friedman055c9702011-11-02 01:53:16 +00005038 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5039 options::OPT_fno_apple_pragma_pack, false))
5040 CmdArgs.push_back("-fapple-pragma-pack");
5041
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005042 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005043 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5044 // by default.
5045 if (getToolChain().getArch() == llvm::Triple::le32) {
5046 CmdArgs.push_back("-fno-math-builtin");
5047 }
5048
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005049// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5050//
5051// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005052#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005053 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005054 (getToolChain().getArch() == llvm::Triple::arm ||
5055 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005056 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5057 CmdArgs.push_back("-fno-builtin-strcat");
5058 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5059 CmdArgs.push_back("-fno-builtin-strcpy");
5060 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005061#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005062
Justin Bognera88f0122014-06-20 22:59:50 +00005063 // Enable rewrite includes if the user's asked for it or if we're generating
5064 // diagnostics.
5065 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5066 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005067 if (Args.hasFlag(options::OPT_frewrite_includes,
5068 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005069 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005070 CmdArgs.push_back("-frewrite-includes");
5071
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005072 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005073 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005074 options::OPT_traditional_cpp)) {
5075 if (isa<PreprocessJobAction>(JA))
5076 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005077 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005078 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005079 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005080
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005081 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005082 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005083
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005084 // Handle serialized diagnostics.
5085 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5086 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005087 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005088 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005089
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005090 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5091 CmdArgs.push_back("-fretain-comments-from-system-headers");
5092
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005093 // Forward -fcomment-block-commands to -cc1.
5094 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005095 // Forward -fparse-all-comments to -cc1.
5096 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005097
John Brawnad31ace2015-09-23 13:55:40 +00005098 // Turn -fplugin=name.so into -load name.so
5099 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5100 CmdArgs.push_back("-load");
5101 CmdArgs.push_back(A->getValue());
5102 A->claim();
5103 }
5104
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005105 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5106 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005107 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005108 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5109 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005110
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005111 // We translate this by hand to the -cc1 argument, since nightly test uses
5112 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005113 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005114 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005115 } else
Sean Silva14facf32015-06-09 01:57:17 +00005116 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005117 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005118
Bob Wilson23a55f12014-12-21 07:00:00 +00005119 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005120 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5121 // by the frontend.
5122 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5123 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005124
Daniel Dunbard67a3222009-03-30 06:36:42 +00005125 if (Output.getType() == types::TY_Dependencies) {
5126 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005127 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005128 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005129 CmdArgs.push_back(Output.getFilename());
5130 } else {
5131 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005132 }
5133
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005134 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005135
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005136 if (Input.isFilename())
5137 CmdArgs.push_back(Input.getFilename());
5138 else
5139 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005140
Chris Lattnere9d7d782009-11-03 19:50:27 +00005141 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5142
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005143 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005144
5145 // Optionally embed the -cc1 level arguments into the debug info, for build
5146 // analysis.
5147 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005148 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005149 for (const auto &Arg : Args)
5150 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005151
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005152 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005153 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005154 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005155 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005156 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005157 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005158 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005159 }
5160 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005161 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005162 }
5163
Eric Christopherd3804002013-02-22 20:12:52 +00005164 // Add the split debug info name to the command lines here so we
5165 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005166 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005167 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5168 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005169 const char *SplitDwarfOut;
5170 if (SplitDwarf) {
5171 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005172 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005173 CmdArgs.push_back(SplitDwarfOut);
5174 }
5175
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005176 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5177 // Include them with -fcuda-include-gpubinary.
5178 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005179 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005180 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005181 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005182 }
5183
Eric Christopherd3804002013-02-22 20:12:52 +00005184 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005185 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005186 Output.getType() == types::TY_Object &&
5187 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005188 auto CLCommand =
5189 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005190 C.addCommand(llvm::make_unique<FallbackCommand>(
5191 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005192 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005193 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005194 }
5195
Eric Christopherf1545832013-02-22 23:50:16 +00005196 // Handle the debug info splitting at object creation time if we're
5197 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005198 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005199 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005200 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005201
Roman Divacky178e01602011-02-10 16:52:03 +00005202 if (Arg *A = Args.getLastArg(options::OPT_pg))
5203 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005204 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5205 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005206
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005207 // Claim some arguments which clang supports automatically.
5208
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005209 // -fpch-preprocess is used with gcc to add a special marker in the output to
5210 // include the PCH file. Clang's PTH solution is completely transparent, so we
5211 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005212 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005213
Daniel Dunbar17731772009-03-23 19:03:36 +00005214 // Claim some arguments which clang doesn't support, but we don't
5215 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005216 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5217 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005218
Rafael Espindolab0092d72013-09-04 19:37:35 +00005219 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005220 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005221}
5222
John McCall5fb5df92012-06-20 06:18:46 +00005223/// Add options related to the Objective-C runtime/ABI.
5224///
5225/// Returns true if the runtime is non-fragile.
5226ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5227 ArgStringList &cmdArgs,
5228 RewriteKind rewriteKind) const {
5229 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005230 Arg *runtimeArg =
5231 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5232 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005233
5234 // Just forward -fobjc-runtime= to the frontend. This supercedes
5235 // options about fragility.
5236 if (runtimeArg &&
5237 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5238 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005239 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005240 if (runtime.tryParse(value)) {
5241 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005242 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005243 }
5244
5245 runtimeArg->render(args, cmdArgs);
5246 return runtime;
5247 }
5248
5249 // Otherwise, we'll need the ABI "version". Version numbers are
5250 // slightly confusing for historical reasons:
5251 // 1 - Traditional "fragile" ABI
5252 // 2 - Non-fragile ABI, version 1
5253 // 3 - Non-fragile ABI, version 2
5254 unsigned objcABIVersion = 1;
5255 // If -fobjc-abi-version= is present, use that to set the version.
5256 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005257 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005258 if (value == "1")
5259 objcABIVersion = 1;
5260 else if (value == "2")
5261 objcABIVersion = 2;
5262 else if (value == "3")
5263 objcABIVersion = 3;
5264 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005265 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005266 } else {
5267 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005268 bool nonFragileABIIsDefault =
5269 (rewriteKind == RK_NonFragile ||
5270 (rewriteKind == RK_None &&
5271 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005272 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5273 options::OPT_fno_objc_nonfragile_abi,
5274 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005275// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005276#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5277 unsigned nonFragileABIVersion = 1;
5278#else
5279 unsigned nonFragileABIVersion = 2;
5280#endif
5281
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005282 if (Arg *abiArg =
5283 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005284 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005285 if (value == "1")
5286 nonFragileABIVersion = 1;
5287 else if (value == "2")
5288 nonFragileABIVersion = 2;
5289 else
5290 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005291 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005292 }
5293
5294 objcABIVersion = 1 + nonFragileABIVersion;
5295 } else {
5296 objcABIVersion = 1;
5297 }
5298 }
5299
5300 // We don't actually care about the ABI version other than whether
5301 // it's non-fragile.
5302 bool isNonFragile = objcABIVersion != 1;
5303
5304 // If we have no runtime argument, ask the toolchain for its default runtime.
5305 // However, the rewriter only really supports the Mac runtime, so assume that.
5306 ObjCRuntime runtime;
5307 if (!runtimeArg) {
5308 switch (rewriteKind) {
5309 case RK_None:
5310 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5311 break;
5312 case RK_Fragile:
5313 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5314 break;
5315 case RK_NonFragile:
5316 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5317 break;
5318 }
5319
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005320 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005321 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5322 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005323 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005324 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5325
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005326 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005327 } else {
5328 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5329 }
5330
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005331 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005332 } else {
5333 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005334 // Legacy behaviour is to target the gnustep runtime if we are i
5335 // non-fragile mode or the GCC runtime in fragile mode.
5336 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005337 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005338 else
5339 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005340 }
5341
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005342 cmdArgs.push_back(
5343 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005344 return runtime;
5345}
5346
Reid Klecknerc542d372014-06-27 17:02:02 +00005347static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5348 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5349 I += HaveDash;
5350 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005351}
Reid Klecknerc542d372014-06-27 17:02:02 +00005352
5353struct EHFlags {
5354 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5355 bool Synch;
5356 bool Asynch;
5357 bool NoExceptC;
5358};
5359
5360/// /EH controls whether to run destructor cleanups when exceptions are
5361/// thrown. There are three modifiers:
5362/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5363/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5364/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5365/// - c: Assume that extern "C" functions are implicitly noexcept. This
5366/// modifier is an optimization, so we ignore it for now.
5367/// The default is /EHs-c-, meaning cleanups are disabled.
5368static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5369 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005370
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005371 std::vector<std::string> EHArgs =
5372 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005373 for (auto EHVal : EHArgs) {
5374 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5375 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005376 case 'a':
5377 EH.Asynch = maybeConsumeDash(EHVal, I);
5378 continue;
5379 case 'c':
5380 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5381 continue;
5382 case 's':
5383 EH.Synch = maybeConsumeDash(EHVal, I);
5384 continue;
5385 default:
5386 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005387 }
5388 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5389 break;
5390 }
5391 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005392
Reid Klecknerc542d372014-06-27 17:02:02 +00005393 return EH;
5394}
5395
Douglas Katzman3459ce22015-10-08 04:24:12 +00005396void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5397 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5398 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005399 unsigned RTOptionID = options::OPT__SLASH_MT;
5400
Hans Wennborgf1a74252013-09-10 20:18:04 +00005401 if (Args.hasArg(options::OPT__SLASH_LDd))
5402 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5403 // but defining _DEBUG is sticky.
5404 RTOptionID = options::OPT__SLASH_MTd;
5405
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005406 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005407 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005408
David Majnemere2afb472015-07-24 06:49:13 +00005409 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005410 switch (RTOptionID) {
5411 case options::OPT__SLASH_MD:
5412 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005413 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005414 CmdArgs.push_back("-D_MT");
5415 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005416 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005417 break;
5418 case options::OPT__SLASH_MDd:
5419 CmdArgs.push_back("-D_DEBUG");
5420 CmdArgs.push_back("-D_MT");
5421 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005422 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005423 break;
5424 case options::OPT__SLASH_MT:
5425 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005426 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005427 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005428 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005429 break;
5430 case options::OPT__SLASH_MTd:
5431 CmdArgs.push_back("-D_DEBUG");
5432 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005433 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005434 break;
5435 default:
5436 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005437 }
5438
David Majnemere2afb472015-07-24 06:49:13 +00005439 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5440 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5441 } else {
5442 CmdArgs.push_back(FlagForCRT.data());
5443
5444 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5445 // users want. The /Za flag to cl.exe turns this off, but it's not
5446 // implemented in clang.
5447 CmdArgs.push_back("--dependent-lib=oldnames");
5448 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005449
Hans Wennborg8858a032014-07-21 23:42:07 +00005450 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5451 // would produce interleaved output, so ignore /showIncludes in such cases.
5452 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5453 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5454 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005455
David Majnemerf6072342014-07-01 22:24:56 +00005456 // This controls whether or not we emit RTTI data for polymorphic types.
5457 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5458 /*default=*/false))
5459 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005460
Reid Kleckner124955a2015-08-05 18:51:13 +00005461 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005462 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005463 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5464 // If we are emitting CV but not DWARF, don't build information that LLVM
5465 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005466 if (*EmitCodeView && !EmitDwarf)
5467 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5468 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005469 CmdArgs.push_back("-gcodeview");
5470
Reid Klecknerc542d372014-06-27 17:02:02 +00005471 const Driver &D = getToolChain().getDriver();
5472 EHFlags EH = parseClangCLEHFlags(D, Args);
5473 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005474 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005475 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005476 CmdArgs.push_back("-fexceptions");
5477 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005478
Hans Wennborge50cec32014-06-13 20:59:54 +00005479 // /EP should expand to -E -P.
5480 if (Args.hasArg(options::OPT__SLASH_EP)) {
5481 CmdArgs.push_back("-E");
5482 CmdArgs.push_back("-P");
5483 }
5484
David Majnemera5b195a2015-02-14 01:35:12 +00005485 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005486 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5487 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005488 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5489 else
5490 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5491
5492 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5493 VolatileOptionID = A->getOption().getID();
5494
5495 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5496 CmdArgs.push_back("-fms-volatile");
5497
David Majnemer86c318f2014-02-11 21:05:00 +00005498 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5499 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5500 if (MostGeneralArg && BestCaseArg)
5501 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5502 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5503
5504 if (MostGeneralArg) {
5505 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5506 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5507 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5508
5509 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5510 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5511 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5512 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5513 << FirstConflict->getAsString(Args)
5514 << SecondConflict->getAsString(Args);
5515
5516 if (SingleArg)
5517 CmdArgs.push_back("-fms-memptr-rep=single");
5518 else if (MultipleArg)
5519 CmdArgs.push_back("-fms-memptr-rep=multiple");
5520 else
5521 CmdArgs.push_back("-fms-memptr-rep=virtual");
5522 }
5523
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005524 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5525 A->render(Args, CmdArgs);
5526
Hans Wennborg81f74482013-09-10 01:07:07 +00005527 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5528 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005529 if (Args.hasArg(options::OPT__SLASH_fallback))
5530 CmdArgs.push_back("msvc-fallback");
5531 else
5532 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005533 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005534}
5535
Douglas Katzman95354292015-06-23 20:42:09 +00005536visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005537 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005538 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005539 return CLFallback.get();
5540}
5541
Daniel Sanders7f933f42015-01-30 17:35:23 +00005542void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5543 ArgStringList &CmdArgs) const {
5544 StringRef CPUName;
5545 StringRef ABIName;
5546 const llvm::Triple &Triple = getToolChain().getTriple();
5547 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5548
5549 CmdArgs.push_back("-target-abi");
5550 CmdArgs.push_back(ABIName.data());
5551}
5552
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005553void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005554 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005555 const ArgList &Args,
5556 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005557 ArgStringList CmdArgs;
5558
5559 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5560 const InputInfo &Input = Inputs[0];
5561
James Y Knight2db38f32015-08-15 03:45:25 +00005562 std::string TripleStr =
5563 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5564 const llvm::Triple Triple(TripleStr);
5565
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005566 // Don't warn about "clang -w -c foo.s"
5567 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005568 // and "clang -emit-llvm -c foo.s"
5569 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005570
Rafael Espindola577637a2015-01-03 00:06:04 +00005571 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005572
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005573 // Invoke ourselves in -cc1as mode.
5574 //
5575 // FIXME: Implement custom jobs for internal actions.
5576 CmdArgs.push_back("-cc1as");
5577
5578 // Add the "effective" target triple.
5579 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005580 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5581
5582 // Set the output mode, we currently only expect to be used as a real
5583 // assembler.
5584 CmdArgs.push_back("-filetype");
5585 CmdArgs.push_back("obj");
5586
Eric Christopher45f2e712012-12-18 00:31:10 +00005587 // Set the main file name, so that debug info works even with
5588 // -save-temps or preprocessed assembly.
5589 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005590 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005591
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005592 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005593 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005594 if (!CPU.empty()) {
5595 CmdArgs.push_back("-target-cpu");
5596 CmdArgs.push_back(Args.MakeArgString(CPU));
5597 }
5598
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005599 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005600 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005601
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005602 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005603 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005604
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005605 // Pass along any -I options so we get proper .include search paths.
5606 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5607
Eric Christopherfc3ee562012-01-10 00:38:01 +00005608 // Determine the original source input.
5609 const Action *SourceAction = &JA;
5610 while (SourceAction->getKind() != Action::InputClass) {
5611 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5612 SourceAction = SourceAction->getInputs()[0];
5613 }
5614
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005615 // Forward -g and handle debug info related flags, assuming we are dealing
5616 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005617 if (SourceAction->getType() == types::TY_Asm ||
5618 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00005619 bool WantDebug = false;
5620 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00005621 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00005622 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
5623 WantDebug = !A->getOption().matches(options::OPT_g0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00005624 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00005625 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00005626 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00005627 if (DwarfVersion == 0)
5628 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00005629 RenderDebugEnablingArgs(Args, CmdArgs,
5630 (WantDebug ? CodeGenOptions::LimitedDebugInfo
5631 : CodeGenOptions::NoDebugInfo),
5632 DwarfVersion);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005633
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005634 // Add the -fdebug-compilation-dir flag if needed.
5635 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005636
5637 // Set the AT_producer to the clang version when using the integrated
5638 // assembler on assembly source files.
5639 CmdArgs.push_back("-dwarf-debug-producer");
5640 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005641
5642 // And pass along -I options
5643 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005644 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005645
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005646 // Handle -fPIC et al -- the relocation-model affects the assembler
5647 // for some targets.
5648 llvm::Reloc::Model RelocationModel;
5649 unsigned PICLevel;
5650 bool IsPIE;
5651 std::tie(RelocationModel, PICLevel, IsPIE) =
5652 ParsePICArgs(getToolChain(), Triple, Args);
5653
5654 const char *RMName = RelocationModelName(RelocationModel);
5655 if (RMName) {
5656 CmdArgs.push_back("-mrelocation-model");
5657 CmdArgs.push_back(RMName);
5658 }
5659
Kevin Enderby292dc082011-12-22 19:31:58 +00005660 // Optionally embed the -cc1as level arguments into the debug info, for build
5661 // analysis.
5662 if (getToolChain().UseDwarfDebugFlags()) {
5663 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005664 for (const auto &Arg : Args)
5665 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005666
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005667 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005668 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5669 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005670 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005671 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005672 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005673 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005674 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005675 }
5676 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005677 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005678 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005679
5680 // FIXME: Add -static support, once we have it.
5681
Daniel Sanders7f933f42015-01-30 17:35:23 +00005682 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005683 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005684 default:
5685 break;
5686
5687 case llvm::Triple::mips:
5688 case llvm::Triple::mipsel:
5689 case llvm::Triple::mips64:
5690 case llvm::Triple::mips64el:
5691 AddMIPSTargetArgs(Args, CmdArgs);
5692 break;
5693 }
5694
David Blaikie372d9502014-01-17 03:17:40 +00005695 // Consume all the warning flags. Usually this would be handled more
5696 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5697 // doesn't handle that so rather than warning about unused flags that are
5698 // actually used, we'll lie by omission instead.
5699 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005700 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5701 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005702
David Blaikie9260ed62013-07-25 21:19:01 +00005703 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5704 getToolChain().getDriver());
5705
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005706 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005707
5708 assert(Output.isFilename() && "Unexpected lipo output.");
5709 CmdArgs.push_back("-o");
5710 CmdArgs.push_back(Output.getFilename());
5711
Daniel Dunbarb440f562010-08-02 02:38:21 +00005712 assert(Input.isFilename() && "Invalid input.");
5713 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005714
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005715 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005716 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005717
5718 // Handle the debug info splitting at object creation time if we're
5719 // creating an object.
5720 // TODO: Currently only works on linux with newer objcopy.
5721 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005722 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005723 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005724 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005725}
5726
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005727void GnuTool::anchor() {}
5728
Daniel Dunbara3246a02009-03-18 08:07:30 +00005729void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005730 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005731 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005732 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005733 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005734 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005735
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005736 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005737 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005738 // Don't forward any -g arguments to assembly steps.
5739 if (isa<AssembleJobAction>(JA) &&
5740 A->getOption().matches(options::OPT_g_Group))
5741 continue;
5742
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005743 // Don't forward any -W arguments to assembly and link steps.
5744 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5745 A->getOption().matches(options::OPT_W_Group))
5746 continue;
5747
Daniel Dunbar2da02722009-03-19 07:55:12 +00005748 // It is unfortunate that we have to claim here, as this means
5749 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005750 // platforms using a generic gcc, even if we are just using gcc
5751 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005752 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005753 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005754 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005755 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005756
Daniel Dunbar4e295052010-01-25 22:35:08 +00005757 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005758
5759 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005760 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005761 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005762 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005763 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005764 }
5765
Daniel Dunbar5716d872009-05-02 21:41:52 +00005766 // Try to force gcc to match the tool chain we want, if we recognize
5767 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005768 //
5769 // FIXME: The triple class should directly provide the information we want
5770 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005771 switch (getToolChain().getArch()) {
5772 default:
5773 break;
5774 case llvm::Triple::x86:
5775 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005776 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005777 break;
5778 case llvm::Triple::x86_64:
5779 case llvm::Triple::ppc64:
5780 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005781 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005782 break;
5783 case llvm::Triple::sparcel:
5784 CmdArgs.push_back("-EL");
5785 break;
5786 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005787
Daniel Dunbarb440f562010-08-02 02:38:21 +00005788 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005789 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005790 CmdArgs.push_back(Output.getFilename());
5791 } else {
5792 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005793 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005794 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005795
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005796 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005797
5798 // Only pass -x if gcc will understand it; otherwise hope gcc
5799 // understands the suffix correctly. The main use case this would go
5800 // wrong in is for linker inputs if they happened to have an odd
5801 // suffix; really the only way to get this to happen is a command
5802 // like '-x foobar a.c' which will treat a.c like a linker input.
5803 //
5804 // FIXME: For the linker case specifically, can we safely convert
5805 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005806 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005807 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005808 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5809 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005810 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005811 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005812 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005813 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005814 else if (II.getType() == types::TY_ModuleFile)
5815 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005816 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005817
Daniel Dunbara3246a02009-03-18 08:07:30 +00005818 if (types::canTypeBeUserSpecified(II.getType())) {
5819 CmdArgs.push_back("-x");
5820 CmdArgs.push_back(types::getTypeName(II.getType()));
5821 }
5822
Daniel Dunbarb440f562010-08-02 02:38:21 +00005823 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005824 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005825 else {
5826 const Arg &A = II.getInputArg();
5827
5828 // Reverse translate some rewritten options.
5829 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5830 CmdArgs.push_back("-lstdc++");
5831 continue;
5832 }
5833
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005834 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005835 A.render(Args, CmdArgs);
5836 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005837 }
5838
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005839 const std::string customGCCName = D.getCCCGenericGCCName();
5840 const char *GCCName;
5841 if (!customGCCName.empty())
5842 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005843 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005844 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005845 } else
5846 GCCName = "gcc";
5847
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005848 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005849 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005850}
5851
Douglas Katzman95354292015-06-23 20:42:09 +00005852void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5853 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005854 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005855}
5856
Douglas Katzman95354292015-06-23 20:42:09 +00005857void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5858 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005859 const Driver &D = getToolChain().getDriver();
5860
Eric Christophercc7ff502015-01-29 00:56:17 +00005861 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005862 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005863 case types::TY_LLVM_IR:
5864 case types::TY_LTO_IR:
5865 case types::TY_LLVM_BC:
5866 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005867 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005868 break;
5869 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005870 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005871 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005872 case types::TY_Nothing:
5873 CmdArgs.push_back("-fsyntax-only");
5874 break;
5875 default:
5876 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005877 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005878}
5879
Douglas Katzman95354292015-06-23 20:42:09 +00005880void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5881 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005882 // The types are (hopefully) good enough.
5883}
5884
Tony Linthicum76329bf2011-12-12 21:14:55 +00005885// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005886void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5887 ArgStringList &CmdArgs) const {}
5888void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5889 const InputInfo &Output,
5890 const InputInfoList &Inputs,
5891 const ArgList &Args,
5892 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005893 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005894
5895 const Driver &D = getToolChain().getDriver();
5896 ArgStringList CmdArgs;
5897
5898 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005899 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005900 CmdArgs.push_back(Args.MakeArgString(MarchString));
5901
5902 RenderExtraToolArgs(JA, CmdArgs);
5903
5904 if (Output.isFilename()) {
5905 CmdArgs.push_back("-o");
5906 CmdArgs.push_back(Output.getFilename());
5907 } else {
5908 assert(Output.isNothing() && "Unexpected output");
5909 CmdArgs.push_back("-fsyntax-only");
5910 }
5911
Douglas Katzman54366072015-07-27 16:53:08 +00005912 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005913 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005914
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005915 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005916
Tony Linthicum76329bf2011-12-12 21:14:55 +00005917 // Only pass -x if gcc will understand it; otherwise hope gcc
5918 // understands the suffix correctly. The main use case this would go
5919 // wrong in is for linker inputs if they happened to have an odd
5920 // suffix; really the only way to get this to happen is a command
5921 // like '-x foobar a.c' which will treat a.c like a linker input.
5922 //
5923 // FIXME: For the linker case specifically, can we safely convert
5924 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005925 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005926 // Don't try to pass LLVM or AST inputs to a generic gcc.
5927 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5928 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5929 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005930 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005931 else if (II.getType() == types::TY_AST)
5932 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005933 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005934 else if (II.getType() == types::TY_ModuleFile)
5935 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005936 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005937
5938 if (II.isFilename())
5939 CmdArgs.push_back(II.getFilename());
5940 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005941 // Don't render as input, we need gcc to do the translations.
5942 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005943 II.getInputArg().render(Args, CmdArgs);
5944 }
5945
5946 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005947 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005948 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005949}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005950
Douglas Katzman95354292015-06-23 20:42:09 +00005951void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5952 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005953 // The types are (hopefully) good enough.
5954}
5955
Douglas Katzman54366072015-07-27 16:53:08 +00005956static void
5957constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5958 const toolchains::HexagonToolChain &ToolChain,
5959 const InputInfo &Output, const InputInfoList &Inputs,
5960 const ArgList &Args, ArgStringList &CmdArgs,
5961 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005962
Matthew Curtise689b052012-12-06 15:46:07 +00005963 const Driver &D = ToolChain.getDriver();
5964
Matthew Curtise689b052012-12-06 15:46:07 +00005965 //----------------------------------------------------------------------------
5966 //
5967 //----------------------------------------------------------------------------
5968 bool hasStaticArg = Args.hasArg(options::OPT_static);
5969 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005970 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005971 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5972 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5973 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005974 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005975 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005976
Matthew Curtise689b052012-12-06 15:46:07 +00005977 //----------------------------------------------------------------------------
5978 // Silence warnings for various options
5979 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005980
Matthew Curtise689b052012-12-06 15:46:07 +00005981 Args.ClaimAllArgs(options::OPT_g_Group);
5982 Args.ClaimAllArgs(options::OPT_emit_llvm);
5983 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5984 // handled somewhere else.
5985 Args.ClaimAllArgs(options::OPT_static_libgcc);
5986
5987 //----------------------------------------------------------------------------
5988 //
5989 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005990 for (const auto &Opt : ToolChain.ExtraOpts)
5991 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005992
Douglas Katzman54366072015-07-27 16:53:08 +00005993 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00005994 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005995
Matthew Curtise689b052012-12-06 15:46:07 +00005996 if (buildingLib) {
5997 CmdArgs.push_back("-shared");
5998 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5999 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00006000 }
6001
Matthew Curtise689b052012-12-06 15:46:07 +00006002 if (hasStaticArg)
6003 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006004
Matthew Curtise8f80a12012-12-06 17:49:03 +00006005 if (buildPIE && !buildingLib)
6006 CmdArgs.push_back("-pie");
6007
Douglas Katzman54366072015-07-27 16:53:08 +00006008 if (const char *v =
6009 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006010 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00006011 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00006012 }
6013
Matthew Curtise689b052012-12-06 15:46:07 +00006014 //----------------------------------------------------------------------------
6015 //
6016 //----------------------------------------------------------------------------
6017 CmdArgs.push_back("-o");
6018 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006019
Matthew Curtise689b052012-12-06 15:46:07 +00006020 const std::string MarchSuffix = "/" + MarchString;
6021 const std::string G0Suffix = "/G0";
6022 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00006023 const std::string RootDir = ToolChain.GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006024 const std::string StartFilesDir =
6025 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006026
6027 //----------------------------------------------------------------------------
6028 // moslib
6029 //----------------------------------------------------------------------------
6030 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006031 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006032
Sean Silva14facf32015-06-09 01:57:17 +00006033 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6034 A->claim();
6035 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00006036 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006037 }
Matthew Curtise689b052012-12-06 15:46:07 +00006038 if (oslibs.empty()) {
6039 oslibs.push_back("standalone");
6040 hasStandalone = true;
6041 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006042
Matthew Curtise689b052012-12-06 15:46:07 +00006043 //----------------------------------------------------------------------------
6044 // Start Files
6045 //----------------------------------------------------------------------------
6046 if (incStdLib && incStartFiles) {
6047
6048 if (!buildingLib) {
6049 if (hasStandalone) {
6050 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006051 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00006052 }
6053 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
6054 }
6055 std::string initObj = useShared ? "/initS.o" : "/init.o";
6056 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
6057 }
6058
6059 //----------------------------------------------------------------------------
6060 // Library Search Paths
6061 //----------------------------------------------------------------------------
6062 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006063 for (const auto &LibPath : LibPaths)
6064 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006065
6066 //----------------------------------------------------------------------------
6067 //
6068 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006069 Args.AddAllArgs(CmdArgs,
6070 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6071 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006072
6073 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6074
6075 //----------------------------------------------------------------------------
6076 // Libraries
6077 //----------------------------------------------------------------------------
6078 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006079 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00006080 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6081 CmdArgs.push_back("-lm");
6082 }
6083
6084 CmdArgs.push_back("--start-group");
6085
6086 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00006087 for (const std::string &Lib : oslibs)
6088 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006089 CmdArgs.push_back("-lc");
6090 }
6091 CmdArgs.push_back("-lgcc");
6092
6093 CmdArgs.push_back("--end-group");
6094 }
6095
6096 //----------------------------------------------------------------------------
6097 // End files
6098 //----------------------------------------------------------------------------
6099 if (incStdLib && incStartFiles) {
6100 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
6101 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
6102 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006103}
6104
Douglas Katzman95354292015-06-23 20:42:09 +00006105void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6106 const InputInfo &Output,
6107 const InputInfoList &Inputs,
6108 const ArgList &Args,
6109 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006110
Douglas Katzman54366072015-07-27 16:53:08 +00006111 const toolchains::HexagonToolChain &ToolChain =
6112 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006113
6114 ArgStringList CmdArgs;
6115 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
6116 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006117
6118 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00006119 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006120 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006121}
6122// Hexagon tools end.
6123
Tom Stellard8fa33092015-07-18 01:49:05 +00006124void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6125 const InputInfo &Output,
6126 const InputInfoList &Inputs,
6127 const ArgList &Args,
6128 const char *LinkingOutput) const {
6129
6130 std::string Linker = getToolChain().GetProgramPath(getShortName());
6131 ArgStringList CmdArgs;
6132 CmdArgs.push_back("-flavor");
6133 CmdArgs.push_back("gnu");
6134 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006135 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006136 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6137 CmdArgs.push_back("-o");
6138 CmdArgs.push_back(Output.getFilename());
6139 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6140 CmdArgs, Inputs));
6141}
6142// AMDGPU tools end.
6143
Renato Golin7c542b42015-07-27 23:44:45 +00006144const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006145 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006146 if (!Arch.empty())
6147 MArch = Arch;
6148 else
Bernard Ogden31561762013-12-12 13:27:11 +00006149 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006150 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00006151
6152 // Handle -march=native.
6153 if (MArch == "native") {
6154 std::string CPU = llvm::sys::getHostCPUName();
6155 if (CPU != "generic") {
6156 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006157 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006158 // If there is no valid architecture suffix for this CPU we don't know how
6159 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006160 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006161 MArch = "";
6162 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006163 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006164 }
6165 }
6166
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006167 return MArch;
6168}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006169
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006170/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006171StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006172 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006173 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6174 // here means an -march=native that we can't handle, so instead return no CPU.
6175 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006176 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006177
John Brawna95c1a82015-05-08 12:52:18 +00006178 // We need to return an empty string here on invalid MArch values as the
6179 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006180 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006181}
6182
6183/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006184std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006185 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006186 // FIXME: Warn on inconsistent use of -mcpu and -march.
6187 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006188 if (!CPU.empty()) {
6189 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006190 // Handle -mcpu=native.
6191 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006192 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006193 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006194 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006195 }
6196
Renato Goline17c5802015-07-27 23:44:42 +00006197 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006198}
6199
6200/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006201/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006202// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006203StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6204 const llvm::Triple &Triple) {
6205 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006206 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006207 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006208 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006209 if (ArchKind == llvm::ARM::AK_INVALID)
6210 // In case of generic Arch, i.e. "arm",
6211 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006212 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006213 } else {
6214 ArchKind = llvm::ARM::parseCPUArch(CPU);
6215 }
Renato Golin3c007252015-05-28 15:05:53 +00006216 if (ArchKind == llvm::ARM::AK_INVALID)
6217 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006218 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006219}
6220
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006221void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006222 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006223 if (Args.hasArg(options::OPT_r))
6224 return;
6225
John Brawn94fd9632015-05-21 12:19:49 +00006226 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6227 // to generate BE-8 executables.
6228 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6229 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006230}
6231
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006232mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006233 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6234 // was first introduced in Release 3. However, other compilers have
6235 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006236 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6237 .Case("mips1", NanLegacy)
6238 .Case("mips2", NanLegacy)
6239 .Case("mips3", NanLegacy)
6240 .Case("mips4", NanLegacy)
6241 .Case("mips5", NanLegacy)
6242 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006243 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006244 .Case("mips32r3", NanLegacy | Nan2008)
6245 .Case("mips32r5", NanLegacy | Nan2008)
6246 .Case("mips32r6", Nan2008)
6247 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006248 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006249 .Case("mips64r3", NanLegacy | Nan2008)
6250 .Case("mips64r5", NanLegacy | Nan2008)
6251 .Case("mips64r6", Nan2008)
6252 .Default(NanLegacy);
6253}
6254
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006255bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6256 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6257 return A && (A->getValue() == StringRef(Value));
6258}
6259
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006260bool mips::isUCLibc(const ArgList &Args) {
6261 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006262 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006263}
6264
Daniel Sanders2bf13662014-07-10 14:40:57 +00006265bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006266 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6267 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006268 .Case("2008", true)
6269 .Case("legacy", false)
6270 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006271
6272 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006273 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006274 .Cases("mips32r6", "mips64r6", true)
6275 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006276
6277 return false;
6278}
6279
Daniel Sanders379d44b2014-07-16 11:52:23 +00006280bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006281 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006282 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006283 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006284 return false;
6285
6286 if (ABIName != "32")
6287 return false;
6288
Toma Tabacu94ea6862015-06-16 13:54:13 +00006289 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6290 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006291 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006292 return false;
6293
Daniel Sanders379d44b2014-07-16 11:52:23 +00006294 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006295 .Cases("mips2", "mips3", "mips4", "mips5", true)
6296 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6297 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6298 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006299}
6300
Toma Tabacu94ea6862015-06-16 13:54:13 +00006301bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6302 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006303 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006304 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6305
6306 // FPXX shouldn't be used if -msingle-float is present.
6307 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6308 options::OPT_mdouble_float))
6309 if (A->getOption().matches(options::OPT_msingle_float))
6310 UseFPXX = false;
6311
6312 return UseFPXX;
6313}
6314
Tim Northover157d9112014-01-16 08:48:16 +00006315llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006316 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6317 // archs which Darwin doesn't use.
6318
6319 // The matching this routine does is fairly pointless, since it is neither the
6320 // complete architecture list, nor a reasonable subset. The problem is that
6321 // historically the driver driver accepts this and also ties its -march=
6322 // handling to the architecture name, so we need to be careful before removing
6323 // support for it.
6324
6325 // This code must be kept in sync with Clang's Darwin specific argument
6326 // translation.
6327
6328 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006329 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6330 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6331 .Case("ppc64", llvm::Triple::ppc64)
6332 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6333 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6334 llvm::Triple::x86)
6335 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6336 // This is derived from the driver driver.
6337 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6338 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6339 .Cases("armv7s", "xscale", llvm::Triple::arm)
6340 .Case("arm64", llvm::Triple::aarch64)
6341 .Case("r600", llvm::Triple::r600)
6342 .Case("amdgcn", llvm::Triple::amdgcn)
6343 .Case("nvptx", llvm::Triple::nvptx)
6344 .Case("nvptx64", llvm::Triple::nvptx64)
6345 .Case("amdil", llvm::Triple::amdil)
6346 .Case("spir", llvm::Triple::spir)
6347 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006348}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006349
Tim Northover157d9112014-01-16 08:48:16 +00006350void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006351 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006352 T.setArch(Arch);
6353
6354 if (Str == "x86_64h")
6355 T.setArchName(Str);
6356 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6357 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006358 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006359 }
6360}
6361
Bob Wilsondecc03e2012-11-23 06:14:39 +00006362const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006363 const InputInfo &Input) {
6364 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006365}
6366
Bob Wilsondecc03e2012-11-23 06:14:39 +00006367const char *Clang::getBaseInputStem(const ArgList &Args,
6368 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006369 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006370
Chris Lattner906bb902011-01-16 08:14:11 +00006371 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006372 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006373
6374 return Str;
6375}
6376
Bob Wilsondecc03e2012-11-23 06:14:39 +00006377const char *Clang::getDependencyFileName(const ArgList &Args,
6378 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006379 // FIXME: Think about this more.
6380 std::string Res;
6381
6382 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006383 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006384 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006385 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006386 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006387 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006388 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006389}
6390
Douglas Katzman95354292015-06-23 20:42:09 +00006391void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6392 const InputInfo &Output,
6393 const InputInfoList &Inputs,
6394 const ArgList &Args,
6395 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006396 const ToolChain &ToolChain = getToolChain();
6397 const Driver &D = ToolChain.getDriver();
6398 ArgStringList CmdArgs;
6399
6400 // Silence warning for "clang -g foo.o -o foo"
6401 Args.ClaimAllArgs(options::OPT_g_Group);
6402 // and "clang -emit-llvm foo.o -o foo"
6403 Args.ClaimAllArgs(options::OPT_emit_llvm);
6404 // and for "clang -w foo.o -o foo". Other warning options are already
6405 // handled somewhere else.
6406 Args.ClaimAllArgs(options::OPT_w);
6407
6408 if (!D.SysRoot.empty())
6409 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6410
6411 // CloudABI only supports static linkage.
6412 CmdArgs.push_back("-Bstatic");
6413 CmdArgs.push_back("--eh-frame-hdr");
6414 CmdArgs.push_back("--gc-sections");
6415
6416 if (Output.isFilename()) {
6417 CmdArgs.push_back("-o");
6418 CmdArgs.push_back(Output.getFilename());
6419 } else {
6420 assert(Output.isNothing() && "Invalid output.");
6421 }
6422
6423 if (!Args.hasArg(options::OPT_nostdlib) &&
6424 !Args.hasArg(options::OPT_nostartfiles)) {
6425 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6426 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6427 }
6428
6429 Args.AddAllArgs(CmdArgs, options::OPT_L);
6430 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6431 for (const auto &Path : Paths)
6432 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006433 Args.AddAllArgs(CmdArgs,
6434 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6435 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006436
Teresa Johnson945bc502015-10-15 20:35:53 +00006437 if (D.isUsingLTO())
6438 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006439
6440 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6441
6442 if (!Args.hasArg(options::OPT_nostdlib) &&
6443 !Args.hasArg(options::OPT_nodefaultlibs)) {
6444 if (D.CCCIsCXX())
6445 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6446 CmdArgs.push_back("-lc");
6447 CmdArgs.push_back("-lcompiler_rt");
6448 }
6449
6450 if (!Args.hasArg(options::OPT_nostdlib) &&
6451 !Args.hasArg(options::OPT_nostartfiles))
6452 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6453
6454 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006455 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006456}
6457
Douglas Katzman95354292015-06-23 20:42:09 +00006458void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6459 const InputInfo &Output,
6460 const InputInfoList &Inputs,
6461 const ArgList &Args,
6462 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006463 ArgStringList CmdArgs;
6464
6465 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6466 const InputInfo &Input = Inputs[0];
6467
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006468 // Determine the original source input.
6469 const Action *SourceAction = &JA;
6470 while (SourceAction->getKind() != Action::InputClass) {
6471 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6472 SourceAction = SourceAction->getInputs()[0];
6473 }
6474
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006475 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006476 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006477 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6478 // FIXME: at run-time detect assembler capabilities or rely on version
6479 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006480 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006481 const llvm::Triple &T(getToolChain().getTriple());
6482 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006483 CmdArgs.push_back("-Q");
6484 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006485
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006486 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006487 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006488 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006489 if (Args.hasArg(options::OPT_gstabs))
6490 CmdArgs.push_back("--gstabs");
6491 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006492 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006493 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006494
Daniel Dunbarbe220842009-03-20 16:06:39 +00006495 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006496 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006497
Daniel Dunbar6d484762010-07-22 01:47:22 +00006498 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006499 if (getToolChain().getArch() == llvm::Triple::x86 ||
6500 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006501 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6502 CmdArgs.push_back("-force_cpusubtype_ALL");
6503
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006504 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006505 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006506 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006507 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006508 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006509 CmdArgs.push_back("-static");
6510
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006511 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006512
6513 assert(Output.isFilename() && "Unexpected lipo output.");
6514 CmdArgs.push_back("-o");
6515 CmdArgs.push_back(Output.getFilename());
6516
Daniel Dunbarb440f562010-08-02 02:38:21 +00006517 assert(Input.isFilename() && "Invalid input.");
6518 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006519
6520 // asm_final spec is empty.
6521
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006522 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006523 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006524}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006525
Tim Northover157d9112014-01-16 08:48:16 +00006526void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006527
Tim Northover157d9112014-01-16 08:48:16 +00006528void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6529 ArgStringList &CmdArgs) const {
6530 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006531
Daniel Dunbarc1964212009-03-26 16:23:12 +00006532 // Derived from darwin_arch spec.
6533 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006534 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006535
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006536 // FIXME: Is this needed anymore?
6537 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006538 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006539}
6540
Douglas Katzman95354292015-06-23 20:42:09 +00006541bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006542 // We only need to generate a temp path for LTO if we aren't compiling object
6543 // files. When compiling source files, we run 'dsymutil' after linking. We
6544 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006545 for (const auto &Input : Inputs)
6546 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006547 return true;
6548
6549 return false;
6550}
6551
Douglas Katzman95354292015-06-23 20:42:09 +00006552void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6553 ArgStringList &CmdArgs,
6554 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006555 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006556 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006557
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006558 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006559 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6560 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006561 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6562 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006563 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006564 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006565 }
6566
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006567 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006568 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006569 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6570 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006571
Bob Wilson3d27dad2013-08-02 22:25:34 +00006572 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6573 CmdArgs.push_back("-export_dynamic");
6574
Bob Wilsonb111ec92015-03-02 19:01:14 +00006575 // If we are using App Extension restrictions, pass a flag to the linker
6576 // telling it that the compiled code has been audited.
6577 if (Args.hasFlag(options::OPT_fapplication_extension,
6578 options::OPT_fno_application_extension, false))
6579 CmdArgs.push_back("-application_extension");
6580
Teresa Johnson945bc502015-10-15 20:35:53 +00006581 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00006582 // If we are using LTO, then automatically create a temporary file path for
6583 // the linker to use, so that it's lifetime will extend past a possible
6584 // dsymutil step.
6585 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6586 const char *TmpPath = C.getArgs().MakeArgString(
6587 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6588 C.addTempFile(TmpPath);
6589 CmdArgs.push_back("-object_path_lto");
6590 CmdArgs.push_back(TmpPath);
6591 }
6592
6593 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6594 // it in clang installed libraries. If not found, the option is not used
6595 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6596 if (Version[0] >= 133) {
6597 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6598 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6599 SmallString<128> LibLTOPath(P);
6600 llvm::sys::path::append(LibLTOPath, "lib");
6601 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
6602 if (llvm::sys::fs::exists(LibLTOPath)) {
6603 CmdArgs.push_back("-lto_library");
6604 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
6605 } else {
6606 D.Diag(diag::warn_drv_lto_libpath);
6607 }
6608 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00006609 }
6610
Daniel Dunbarc1964212009-03-26 16:23:12 +00006611 // Derived from the "link" spec.
6612 Args.AddAllArgs(CmdArgs, options::OPT_static);
6613 if (!Args.hasArg(options::OPT_static))
6614 CmdArgs.push_back("-dynamic");
6615 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6616 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6617 // here. How do we wish to handle such things?
6618 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006619
Daniel Dunbarc1964212009-03-26 16:23:12 +00006620 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006621 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006622 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006623 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006624
6625 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6626 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6627 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6628
6629 Arg *A;
6630 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6631 (A = Args.getLastArg(options::OPT_current__version)) ||
6632 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006633 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6634 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006635
6636 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6637 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6638 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6639 } else {
6640 CmdArgs.push_back("-dylib");
6641
6642 Arg *A;
6643 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6644 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6645 (A = Args.getLastArg(options::OPT_client__name)) ||
6646 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6647 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6648 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006649 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6650 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006651
Daniel Dunbarc1964212009-03-26 16:23:12 +00006652 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6653 "-dylib_compatibility_version");
6654 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6655 "-dylib_current_version");
6656
Tim Northover157d9112014-01-16 08:48:16 +00006657 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006658
6659 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6660 "-dylib_install_name");
6661 }
6662
6663 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6664 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6665 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006666 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006667 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006668 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6669 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6670 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6671 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6672 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6673 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006674 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006675 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6676 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6677 Args.AddAllArgs(CmdArgs, options::OPT_init);
6678
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006679 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006680 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006681
Daniel Dunbarc1964212009-03-26 16:23:12 +00006682 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6683 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6684 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6685 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6686 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006687
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006688 if (const Arg *A =
6689 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6690 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006691 if (A->getOption().matches(options::OPT_fpie) ||
6692 A->getOption().matches(options::OPT_fPIE))
6693 CmdArgs.push_back("-pie");
6694 else
6695 CmdArgs.push_back("-no_pie");
6696 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006697
6698 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6699 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6700 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6701 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6702 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6703 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6704 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6705 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6706 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6707 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6708 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6709 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6710 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6711 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6712 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6713 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006714
Daniel Dunbar84384642011-05-02 21:03:47 +00006715 // Give --sysroot= preference, over the Apple specific behavior to also use
6716 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006717 StringRef sysroot = C.getSysRoot();
6718 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006719 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006720 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006721 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6722 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006723 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006724 }
6725
Daniel Dunbarc1964212009-03-26 16:23:12 +00006726 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6727 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6728 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6729 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6730 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006731 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006732 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6733 Args.AddAllArgs(CmdArgs, options::OPT_y);
6734 Args.AddLastArg(CmdArgs, options::OPT_w);
6735 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6736 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6737 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6738 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6739 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6740 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6741 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6742 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6743 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6744 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6745 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6746 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6747}
6748
Douglas Katzman95354292015-06-23 20:42:09 +00006749void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6750 const InputInfo &Output,
6751 const InputInfoList &Inputs,
6752 const ArgList &Args,
6753 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006754 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006755
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006756 // If the number of arguments surpasses the system limits, we will encode the
6757 // input files in a separate file, shortening the command line. To this end,
6758 // build a list of input file names that can be passed via a file with the
6759 // -filelist linker option.
6760 llvm::opt::ArgStringList InputFileList;
6761
Daniel Dunbarc1964212009-03-26 16:23:12 +00006762 // The logic here is derived from gcc's behavior; most of which
6763 // comes from specs (starting with link_command). Consult gcc for
6764 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006765 ArgStringList CmdArgs;
6766
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006767 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6768 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6769 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006770 for (const auto &Arg : Args)
6771 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006772 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006773 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006774 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006775 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006776 return;
6777 }
6778
Daniel Dunbarc1964212009-03-26 16:23:12 +00006779 // I'm not sure why this particular decomposition exists in gcc, but
6780 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006781 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006782
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006783 // It seems that the 'e' option is completely ignored for dynamic executables
6784 // (the default), and with static executables, the last one wins, as expected.
6785 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6786 options::OPT_Z_Flag, options::OPT_u_Group,
6787 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006788
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006789 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6790 // members of static archive libraries which implement Objective-C classes or
6791 // categories.
6792 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6793 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006794
Daniel Dunbarc1964212009-03-26 16:23:12 +00006795 CmdArgs.push_back("-o");
6796 CmdArgs.push_back(Output.getFilename());
6797
Chad Rosier06fd3c62012-05-16 23:45:12 +00006798 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006799 !Args.hasArg(options::OPT_nostartfiles))
6800 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006801
Peter Collingbournec4122c12015-06-15 21:08:13 +00006802 // SafeStack requires its own runtime libraries
6803 // These libraries should be linked first, to make sure the
6804 // __safestack_init constructor executes before everything else
6805 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6806 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6807 "libclang_rt.safestack_osx.a",
6808 /*AlwaysLink=*/true);
6809 }
6810
Daniel Dunbarc1964212009-03-26 16:23:12 +00006811 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006812
Douglas Gregor9295df02012-05-15 21:00:27 +00006813 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006814 // Build the input file for -filelist (list of linker input files) in case we
6815 // need it later
6816 for (const auto &II : Inputs) {
6817 if (!II.isFilename()) {
6818 // This is a linker input argument.
6819 // We cannot mix input arguments and file names in a -filelist input, thus
6820 // we prematurely stop our list (remaining files shall be passed as
6821 // arguments).
6822 if (InputFileList.size() > 0)
6823 break;
6824
6825 continue;
6826 }
6827
6828 InputFileList.push_back(II.getFilename());
6829 }
6830
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00006831 if (!Args.hasArg(options::OPT_nostdlib) &&
6832 !Args.hasArg(options::OPT_nodefaultlibs))
6833 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
6834
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006835 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006836 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006837 // We use arclite library for both ARC and subscripting support.
6838 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6839
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006840 CmdArgs.push_back("-framework");
6841 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006842 // Link libobj.
6843 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006844 }
John McCall31168b02011-06-15 23:02:42 +00006845
Daniel Dunbarc1964212009-03-26 16:23:12 +00006846 if (LinkingOutput) {
6847 CmdArgs.push_back("-arch_multiple");
6848 CmdArgs.push_back("-final_output");
6849 CmdArgs.push_back(LinkingOutput);
6850 }
6851
Daniel Dunbarc1964212009-03-26 16:23:12 +00006852 if (Args.hasArg(options::OPT_fnested_functions))
6853 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006854
Justin Bognerc7701242015-05-12 05:44:36 +00006855 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6856
Daniel Dunbarc1964212009-03-26 16:23:12 +00006857 if (!Args.hasArg(options::OPT_nostdlib) &&
6858 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006859 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006860 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006861
Daniel Dunbarc1964212009-03-26 16:23:12 +00006862 // link_ssp spec is empty.
6863
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006864 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006865 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006866 }
6867
Chad Rosier06fd3c62012-05-16 23:45:12 +00006868 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006869 !Args.hasArg(options::OPT_nostartfiles)) {
6870 // endfile_spec is empty.
6871 }
6872
6873 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6874 Args.AddAllArgs(CmdArgs, options::OPT_F);
6875
Steven Wu3ffb61b2015-02-06 18:08:29 +00006876 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006877 for (const Arg *A : Args.filtered(options::OPT_iframework))
6878 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006879
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006880 if (!Args.hasArg(options::OPT_nostdlib) &&
6881 !Args.hasArg(options::OPT_nodefaultlibs)) {
6882 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6883 if (A->getValue() == StringRef("Accelerate")) {
6884 CmdArgs.push_back("-framework");
6885 CmdArgs.push_back("Accelerate");
6886 }
6887 }
6888 }
6889
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006890 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006891 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006892 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006893 Cmd->setInputFileList(std::move(InputFileList));
6894 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006895}
6896
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006897void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006898 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006899 const InputInfoList &Inputs,
6900 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006901 const char *LinkingOutput) const {
6902 ArgStringList CmdArgs;
6903
6904 CmdArgs.push_back("-create");
6905 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006906
6907 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006908 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006909
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006910 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006911 assert(II.isFilename() && "Unexpected lipo input.");
6912 CmdArgs.push_back(II.getFilename());
6913 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006914
6915 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006916 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006917}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006918
Daniel Dunbar88299622010-06-04 18:28:36 +00006919void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006920 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006921 const InputInfoList &Inputs,
6922 const ArgList &Args,
6923 const char *LinkingOutput) const {
6924 ArgStringList CmdArgs;
6925
Daniel Dunbareb86b042011-05-09 17:23:16 +00006926 CmdArgs.push_back("-o");
6927 CmdArgs.push_back(Output.getFilename());
6928
Daniel Dunbar88299622010-06-04 18:28:36 +00006929 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6930 const InputInfo &Input = Inputs[0];
6931 assert(Input.isFilename() && "Unexpected dsymutil input.");
6932 CmdArgs.push_back(Input.getFilename());
6933
Daniel Dunbar88299622010-06-04 18:28:36 +00006934 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006935 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006936 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006937}
6938
Eric Christopher551ef452011-08-23 17:56:55 +00006939void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006940 const InputInfo &Output,
6941 const InputInfoList &Inputs,
6942 const ArgList &Args,
6943 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006944 ArgStringList CmdArgs;
6945 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006946 CmdArgs.push_back("--debug-info");
6947 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006948 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006949
6950 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6951 const InputInfo &Input = Inputs[0];
6952 assert(Input.isFilename() && "Unexpected verify input");
6953
6954 // Grabbing the output of the earlier dsymutil run.
6955 CmdArgs.push_back(Input.getFilename());
6956
6957 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006958 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006959 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00006960}
6961
Douglas Katzman95354292015-06-23 20:42:09 +00006962void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006963 const InputInfo &Output,
6964 const InputInfoList &Inputs,
6965 const ArgList &Args,
6966 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006967 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006968 ArgStringList CmdArgs;
6969
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006970 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006971
6972 CmdArgs.push_back("-o");
6973 CmdArgs.push_back(Output.getFilename());
6974
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006975 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006976 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006977
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006978 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006979 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006980}
6981
Douglas Katzman95354292015-06-23 20:42:09 +00006982void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6983 const InputInfo &Output,
6984 const InputInfoList &Inputs,
6985 const ArgList &Args,
6986 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006987 ArgStringList CmdArgs;
6988
David Chisnall272a0712012-02-29 15:06:12 +00006989 // Demangle C++ names in errors
6990 CmdArgs.push_back("-C");
6991
David Chisnallf571cde2012-02-15 13:39:01 +00006992 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6993 (!Args.hasArg(options::OPT_shared))) {
6994 CmdArgs.push_back("-e");
6995 CmdArgs.push_back("_start");
6996 }
6997
6998 if (Args.hasArg(options::OPT_static)) {
6999 CmdArgs.push_back("-Bstatic");
7000 CmdArgs.push_back("-dn");
7001 } else {
7002 CmdArgs.push_back("-Bdynamic");
7003 if (Args.hasArg(options::OPT_shared)) {
7004 CmdArgs.push_back("-shared");
7005 } else {
7006 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007007 CmdArgs.push_back(
7008 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007009 }
7010 }
7011
7012 if (Output.isFilename()) {
7013 CmdArgs.push_back("-o");
7014 CmdArgs.push_back(Output.getFilename());
7015 } else {
7016 assert(Output.isNothing() && "Invalid output.");
7017 }
7018
7019 if (!Args.hasArg(options::OPT_nostdlib) &&
7020 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007021 if (!Args.hasArg(options::OPT_shared))
7022 CmdArgs.push_back(
7023 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7024
7025 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7026 CmdArgs.push_back(
7027 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7028 CmdArgs.push_back(
7029 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007030 }
7031
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007032 const ToolChain::path_list &Paths = getToolChain().getFilePaths();
7033 for (const auto &Path : Paths)
7034 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
David Chisnallf571cde2012-02-15 13:39:01 +00007035
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007036 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7037 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007038
7039 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7040
7041 if (!Args.hasArg(options::OPT_nostdlib) &&
7042 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007043 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007044 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007045 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007046 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007047 if (!Args.hasArg(options::OPT_shared)) {
7048 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007049 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007050 }
David Chisnallf571cde2012-02-15 13:39:01 +00007051 }
7052
7053 if (!Args.hasArg(options::OPT_nostdlib) &&
7054 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007055 CmdArgs.push_back(
7056 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007057 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007058 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007059
Xinliang David Li69306c02015-10-22 06:15:31 +00007060 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007061
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007062 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007063 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007064}
7065
Douglas Katzman95354292015-06-23 20:42:09 +00007066void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7067 const InputInfo &Output,
7068 const InputInfoList &Inputs,
7069 const ArgList &Args,
7070 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007071 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007072 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00007073 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007074
Rafael Espindolacc126272014-02-28 01:55:21 +00007075 switch (getToolChain().getArch()) {
7076 case llvm::Triple::x86:
7077 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7078 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007079 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007080 break;
7081
7082 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007083 CmdArgs.push_back("-mppc");
7084 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007085 break;
7086
7087 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007088 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00007089 CmdArgs.push_back("-32");
7090 NeedsKPIC = true;
7091 break;
7092
7093 case llvm::Triple::sparcv9:
7094 CmdArgs.push_back("-64");
7095 CmdArgs.push_back("-Av9a");
7096 NeedsKPIC = true;
7097 break;
7098
7099 case llvm::Triple::mips64:
7100 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007101 StringRef CPUName;
7102 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007103 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007104
7105 CmdArgs.push_back("-mabi");
7106 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7107
7108 if (getToolChain().getArch() == llvm::Triple::mips64)
7109 CmdArgs.push_back("-EB");
7110 else
7111 CmdArgs.push_back("-EL");
7112
Rafael Espindolacc126272014-02-28 01:55:21 +00007113 NeedsKPIC = true;
7114 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007115 }
7116
Rafael Espindolacc126272014-02-28 01:55:21 +00007117 default:
7118 break;
7119 }
7120
7121 if (NeedsKPIC)
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007122 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007123
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007124 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007125
7126 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007127 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007128
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007129 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007130 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007131
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007132 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007133 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007134}
7135
Douglas Katzman95354292015-06-23 20:42:09 +00007136void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7137 const InputInfo &Output,
7138 const InputInfoList &Inputs,
7139 const ArgList &Args,
7140 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007141 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007142 ArgStringList CmdArgs;
7143
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007144 // Silence warning for "clang -g foo.o -o foo"
7145 Args.ClaimAllArgs(options::OPT_g_Group);
7146 // and "clang -emit-llvm foo.o -o foo"
7147 Args.ClaimAllArgs(options::OPT_emit_llvm);
7148 // and for "clang -w foo.o -o foo". Other warning options are already
7149 // handled somewhere else.
7150 Args.ClaimAllArgs(options::OPT_w);
7151
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007152 if (getToolChain().getArch() == llvm::Triple::mips64)
7153 CmdArgs.push_back("-EB");
7154 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7155 CmdArgs.push_back("-EL");
7156
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007157 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007158 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007159 CmdArgs.push_back("-e");
7160 CmdArgs.push_back("__start");
7161 }
7162
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007163 if (Args.hasArg(options::OPT_static)) {
7164 CmdArgs.push_back("-Bstatic");
7165 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007166 if (Args.hasArg(options::OPT_rdynamic))
7167 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007168 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007169 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007170 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007171 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007172 } else {
7173 CmdArgs.push_back("-dynamic-linker");
7174 CmdArgs.push_back("/usr/libexec/ld.so");
7175 }
7176 }
7177
Rafael Espindola044f7832013-06-05 04:28:55 +00007178 if (Args.hasArg(options::OPT_nopie))
7179 CmdArgs.push_back("-nopie");
7180
Daniel Dunbarb440f562010-08-02 02:38:21 +00007181 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007182 CmdArgs.push_back("-o");
7183 CmdArgs.push_back(Output.getFilename());
7184 } else {
7185 assert(Output.isNothing() && "Invalid output.");
7186 }
7187
7188 if (!Args.hasArg(options::OPT_nostdlib) &&
7189 !Args.hasArg(options::OPT_nostartfiles)) {
7190 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007191 if (Args.hasArg(options::OPT_pg))
7192 CmdArgs.push_back(
7193 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007194 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007195 CmdArgs.push_back(
7196 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7197 CmdArgs.push_back(
7198 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007199 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007200 CmdArgs.push_back(
7201 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007202 }
7203 }
7204
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007205 std::string Triple = getToolChain().getTripleString();
7206 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007207 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007208 CmdArgs.push_back(
7209 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007210
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007211 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7212 options::OPT_e, options::OPT_s, options::OPT_t,
7213 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007214
Daniel Dunbar54423b22010-09-17 00:24:54 +00007215 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007216
7217 if (!Args.hasArg(options::OPT_nostdlib) &&
7218 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007219 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007220 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007221 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007222 CmdArgs.push_back("-lm_p");
7223 else
7224 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007225 }
7226
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007227 // FIXME: For some reason GCC passes -lgcc before adding
7228 // the default system libraries. Just mimic this for now.
7229 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007230
Eric Christopher17674ec2012-09-13 06:32:34 +00007231 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007232 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7233 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007234 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007235 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007236 }
7237
Chandler Carruth45661652011-12-17 22:32:42 +00007238 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007239 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007240 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007241 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007242 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007243 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007244
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007245 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007246 }
7247
7248 if (!Args.hasArg(options::OPT_nostdlib) &&
7249 !Args.hasArg(options::OPT_nostartfiles)) {
7250 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007251 CmdArgs.push_back(
7252 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007253 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007254 CmdArgs.push_back(
7255 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007256 }
7257
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007258 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007259 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007260}
Ed Schoutene33194b2009-04-02 19:13:12 +00007261
Douglas Katzman95354292015-06-23 20:42:09 +00007262void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7263 const InputInfo &Output,
7264 const InputInfoList &Inputs,
7265 const ArgList &Args,
7266 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007267 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007268 ArgStringList CmdArgs;
7269
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007270 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007271
7272 CmdArgs.push_back("-o");
7273 CmdArgs.push_back(Output.getFilename());
7274
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007275 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007276 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007277
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007278 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007279 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007280}
7281
Douglas Katzman95354292015-06-23 20:42:09 +00007282void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7283 const InputInfo &Output,
7284 const InputInfoList &Inputs,
7285 const ArgList &Args,
7286 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007287 const Driver &D = getToolChain().getDriver();
7288 ArgStringList CmdArgs;
7289
7290 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7291 (!Args.hasArg(options::OPT_shared))) {
7292 CmdArgs.push_back("-e");
7293 CmdArgs.push_back("__start");
7294 }
7295
7296 if (Args.hasArg(options::OPT_static)) {
7297 CmdArgs.push_back("-Bstatic");
7298 } else {
7299 if (Args.hasArg(options::OPT_rdynamic))
7300 CmdArgs.push_back("-export-dynamic");
7301 CmdArgs.push_back("--eh-frame-hdr");
7302 CmdArgs.push_back("-Bdynamic");
7303 if (Args.hasArg(options::OPT_shared)) {
7304 CmdArgs.push_back("-shared");
7305 } else {
7306 CmdArgs.push_back("-dynamic-linker");
7307 CmdArgs.push_back("/usr/libexec/ld.so");
7308 }
7309 }
7310
7311 if (Output.isFilename()) {
7312 CmdArgs.push_back("-o");
7313 CmdArgs.push_back(Output.getFilename());
7314 } else {
7315 assert(Output.isNothing() && "Invalid output.");
7316 }
7317
7318 if (!Args.hasArg(options::OPT_nostdlib) &&
7319 !Args.hasArg(options::OPT_nostartfiles)) {
7320 if (!Args.hasArg(options::OPT_shared)) {
7321 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007322 CmdArgs.push_back(
7323 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007324 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007325 CmdArgs.push_back(
7326 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7327 CmdArgs.push_back(
7328 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007329 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007330 CmdArgs.push_back(
7331 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007332 }
7333 }
7334
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007335 Args.AddAllArgs(CmdArgs,
7336 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007337
7338 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7339
7340 if (!Args.hasArg(options::OPT_nostdlib) &&
7341 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007342 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007343 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7344 if (Args.hasArg(options::OPT_pg))
7345 CmdArgs.push_back("-lm_p");
7346 else
7347 CmdArgs.push_back("-lm");
7348 }
7349
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007350 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007351 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007352 CmdArgs.push_back("-lpthread_p");
7353 else
7354 CmdArgs.push_back("-lpthread");
7355 }
7356
Eli Friedman9fa28852012-08-08 23:57:20 +00007357 if (!Args.hasArg(options::OPT_shared)) {
7358 if (Args.hasArg(options::OPT_pg))
7359 CmdArgs.push_back("-lc_p");
7360 else
7361 CmdArgs.push_back("-lc");
7362 }
7363
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007364 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007365 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007366 case llvm::Triple::arm:
7367 MyArch = "arm";
7368 break;
7369 case llvm::Triple::x86:
7370 MyArch = "i386";
7371 break;
7372 case llvm::Triple::x86_64:
7373 MyArch = "amd64";
7374 break;
7375 default:
7376 llvm_unreachable("Unsupported architecture");
7377 }
7378 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007379 }
7380
7381 if (!Args.hasArg(options::OPT_nostdlib) &&
7382 !Args.hasArg(options::OPT_nostartfiles)) {
7383 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007384 CmdArgs.push_back(
7385 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007386 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007387 CmdArgs.push_back(
7388 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007389 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007390
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007391 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007392 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007393}
7394
Douglas Katzman95354292015-06-23 20:42:09 +00007395void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7396 const InputInfo &Output,
7397 const InputInfoList &Inputs,
7398 const ArgList &Args,
7399 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007400 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007401 ArgStringList CmdArgs;
7402
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007403 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7404 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007405 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007406 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007407 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007408 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007409 else if (getToolChain().getArch() == llvm::Triple::mips ||
7410 getToolChain().getArch() == llvm::Triple::mipsel ||
7411 getToolChain().getArch() == llvm::Triple::mips64 ||
7412 getToolChain().getArch() == llvm::Triple::mips64el) {
7413 StringRef CPUName;
7414 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007415 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007416
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007417 CmdArgs.push_back("-march");
7418 CmdArgs.push_back(CPUName.data());
7419
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007420 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007421 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007422
7423 if (getToolChain().getArch() == llvm::Triple::mips ||
7424 getToolChain().getArch() == llvm::Triple::mips64)
7425 CmdArgs.push_back("-EB");
7426 else
7427 CmdArgs.push_back("-EL");
7428
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007429 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007430 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007431 getToolChain().getArch() == llvm::Triple::armeb ||
7432 getToolChain().getArch() == llvm::Triple::thumb ||
7433 getToolChain().getArch() == llvm::Triple::thumbeb) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007434 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007435
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007436 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007437 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007438 else
Renato Golinf4421f72014-02-19 10:44:07 +00007439 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007440
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007441 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007442 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007443 case llvm::Triple::GNUEABI:
7444 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007445 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007446 break;
7447
7448 default:
7449 CmdArgs.push_back("-matpcs");
7450 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007451 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007452 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007453 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007454 if (getToolChain().getArch() == llvm::Triple::sparc)
7455 CmdArgs.push_back("-Av8plusa");
7456 else
7457 CmdArgs.push_back("-Av9a");
7458
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007459 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007460 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007461
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007462 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007463
7464 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007465 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007466
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007467 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007468 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007469
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007470 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007471 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007472}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007473
Douglas Katzman95354292015-06-23 20:42:09 +00007474void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7475 const InputInfo &Output,
7476 const InputInfoList &Inputs,
7477 const ArgList &Args,
7478 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007479 const toolchains::FreeBSD &ToolChain =
7480 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007481 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007482 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007483 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007484 !Args.hasArg(options::OPT_shared) &&
7485 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007486 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007487
7488 // Silence warning for "clang -g foo.o -o foo"
7489 Args.ClaimAllArgs(options::OPT_g_Group);
7490 // and "clang -emit-llvm foo.o -o foo"
7491 Args.ClaimAllArgs(options::OPT_emit_llvm);
7492 // and for "clang -w foo.o -o foo". Other warning options are already
7493 // handled somewhere else.
7494 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007495
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007496 if (!D.SysRoot.empty())
7497 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7498
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007499 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007500 CmdArgs.push_back("-pie");
7501
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007502 if (Args.hasArg(options::OPT_static)) {
7503 CmdArgs.push_back("-Bstatic");
7504 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007505 if (Args.hasArg(options::OPT_rdynamic))
7506 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007507 CmdArgs.push_back("--eh-frame-hdr");
7508 if (Args.hasArg(options::OPT_shared)) {
7509 CmdArgs.push_back("-Bshareable");
7510 } else {
7511 CmdArgs.push_back("-dynamic-linker");
7512 CmdArgs.push_back("/libexec/ld-elf.so.1");
7513 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007514 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007515 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7516 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7517 CmdArgs.push_back("--hash-style=both");
7518 }
7519 }
7520 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007521 }
7522
7523 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7524 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007525 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007526 CmdArgs.push_back("-m");
7527 CmdArgs.push_back("elf_i386_fbsd");
7528 }
7529
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007530 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007531 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007532 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007533 }
7534
Daniel Dunbarb440f562010-08-02 02:38:21 +00007535 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007536 CmdArgs.push_back("-o");
7537 CmdArgs.push_back(Output.getFilename());
7538 } else {
7539 assert(Output.isNothing() && "Invalid output.");
7540 }
7541
7542 if (!Args.hasArg(options::OPT_nostdlib) &&
7543 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007544 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007545 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007546 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007547 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007548 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007549 crt1 = "Scrt1.o";
7550 else
7551 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007552 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007553 if (crt1)
7554 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7555
7556 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7557
Craig Topper92fc2df2014-05-17 16:56:41 +00007558 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007559 if (Args.hasArg(options::OPT_static))
7560 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007561 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007562 crtbegin = "crtbeginS.o";
7563 else
7564 crtbegin = "crtbegin.o";
7565
7566 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007567 }
7568
7569 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007570 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007571 for (const auto &Path : Paths)
7572 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007573 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7574 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007575 Args.AddAllArgs(CmdArgs, options::OPT_s);
7576 Args.AddAllArgs(CmdArgs, options::OPT_t);
7577 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7578 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007579
Teresa Johnson945bc502015-10-15 20:35:53 +00007580 if (D.isUsingLTO())
7581 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007582
Alexey Samsonov52550342014-09-15 19:58:40 +00007583 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007584 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007585
7586 if (!Args.hasArg(options::OPT_nostdlib) &&
7587 !Args.hasArg(options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00007588 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007589 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007590 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007591 if (Args.hasArg(options::OPT_pg))
7592 CmdArgs.push_back("-lm_p");
7593 else
7594 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007595 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007596 if (NeedsSanitizerDeps)
7597 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007598 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7599 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007600 if (Args.hasArg(options::OPT_pg))
7601 CmdArgs.push_back("-lgcc_p");
7602 else
7603 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007604 if (Args.hasArg(options::OPT_static)) {
7605 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007606 } else if (Args.hasArg(options::OPT_pg)) {
7607 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007608 } else {
7609 CmdArgs.push_back("--as-needed");
7610 CmdArgs.push_back("-lgcc_s");
7611 CmdArgs.push_back("--no-as-needed");
7612 }
7613
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007614 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007615 if (Args.hasArg(options::OPT_pg))
7616 CmdArgs.push_back("-lpthread_p");
7617 else
7618 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007619 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007620
Roman Divacky66f22762011-02-10 16:59:40 +00007621 if (Args.hasArg(options::OPT_pg)) {
7622 if (Args.hasArg(options::OPT_shared))
7623 CmdArgs.push_back("-lc");
7624 else
7625 CmdArgs.push_back("-lc_p");
7626 CmdArgs.push_back("-lgcc_p");
7627 } else {
7628 CmdArgs.push_back("-lc");
7629 CmdArgs.push_back("-lgcc");
7630 }
7631
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007632 if (Args.hasArg(options::OPT_static)) {
7633 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007634 } else if (Args.hasArg(options::OPT_pg)) {
7635 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007636 } else {
7637 CmdArgs.push_back("--as-needed");
7638 CmdArgs.push_back("-lgcc_s");
7639 CmdArgs.push_back("--no-as-needed");
7640 }
7641 }
7642
7643 if (!Args.hasArg(options::OPT_nostdlib) &&
7644 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007645 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007646 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007647 else
7648 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007649 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007650 }
7651
Xinliang David Li69306c02015-10-22 06:15:31 +00007652 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007653
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007654 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007655 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007656}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007657
Douglas Katzman95354292015-06-23 20:42:09 +00007658void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007659 const InputInfo &Output,
7660 const InputInfoList &Inputs,
7661 const ArgList &Args,
7662 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007663 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007664 ArgStringList CmdArgs;
7665
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007666 // GNU as needs different flags for creating the correct output format
7667 // on architectures with different ABIs or optional feature sets.
7668 switch (getToolChain().getArch()) {
7669 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007670 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007671 break;
7672 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007673 case llvm::Triple::armeb:
7674 case llvm::Triple::thumb:
7675 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007676 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007677 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7678 std::string Arch =
7679 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007680 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007681 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007682 }
7683
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007684 case llvm::Triple::mips:
7685 case llvm::Triple::mipsel:
7686 case llvm::Triple::mips64:
7687 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007688 StringRef CPUName;
7689 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007690 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007691
7692 CmdArgs.push_back("-march");
7693 CmdArgs.push_back(CPUName.data());
7694
7695 CmdArgs.push_back("-mabi");
7696 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7697
7698 if (getToolChain().getArch() == llvm::Triple::mips ||
7699 getToolChain().getArch() == llvm::Triple::mips64)
7700 CmdArgs.push_back("-EB");
7701 else
7702 CmdArgs.push_back("-EL");
7703
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007704 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007705 break;
7706 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007707
7708 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007709 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007710 CmdArgs.push_back("-32");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007711 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007712 break;
7713
7714 case llvm::Triple::sparcv9:
7715 CmdArgs.push_back("-64");
7716 CmdArgs.push_back("-Av9");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007717 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007718 break;
7719
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007720 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007721 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007722 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007723
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007724 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007725
7726 CmdArgs.push_back("-o");
7727 CmdArgs.push_back(Output.getFilename());
7728
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007729 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007730 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007731
David Chisnallddbd68f2011-09-27 22:03:18 +00007732 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007733 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007734}
7735
Douglas Katzman95354292015-06-23 20:42:09 +00007736void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7737 const InputInfo &Output,
7738 const InputInfoList &Inputs,
7739 const ArgList &Args,
7740 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007741 const Driver &D = getToolChain().getDriver();
7742 ArgStringList CmdArgs;
7743
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007744 if (!D.SysRoot.empty())
7745 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7746
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007747 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007748 if (Args.hasArg(options::OPT_static)) {
7749 CmdArgs.push_back("-Bstatic");
7750 } else {
7751 if (Args.hasArg(options::OPT_rdynamic))
7752 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007753 if (Args.hasArg(options::OPT_shared)) {
7754 CmdArgs.push_back("-Bshareable");
7755 } else {
7756 CmdArgs.push_back("-dynamic-linker");
7757 CmdArgs.push_back("/libexec/ld.elf_so");
7758 }
7759 }
7760
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007761 // Many NetBSD architectures support more than one ABI.
7762 // Determine the correct emulation for ld.
7763 switch (getToolChain().getArch()) {
7764 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007765 CmdArgs.push_back("-m");
7766 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007767 break;
7768 case llvm::Triple::arm:
7769 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007770 CmdArgs.push_back("-m");
7771 switch (getToolChain().getTriple().getEnvironment()) {
7772 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007773 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007774 CmdArgs.push_back("armelf_nbsd_eabi");
7775 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007776 case llvm::Triple::EABIHF:
7777 case llvm::Triple::GNUEABIHF:
7778 CmdArgs.push_back("armelf_nbsd_eabihf");
7779 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007780 default:
7781 CmdArgs.push_back("armelf_nbsd");
7782 break;
7783 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007784 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007785 case llvm::Triple::armeb:
7786 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007787 arm::appendEBLinkFlags(
7788 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007789 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007790 CmdArgs.push_back("-m");
7791 switch (getToolChain().getTriple().getEnvironment()) {
7792 case llvm::Triple::EABI:
7793 case llvm::Triple::GNUEABI:
7794 CmdArgs.push_back("armelfb_nbsd_eabi");
7795 break;
7796 case llvm::Triple::EABIHF:
7797 case llvm::Triple::GNUEABIHF:
7798 CmdArgs.push_back("armelfb_nbsd_eabihf");
7799 break;
7800 default:
7801 CmdArgs.push_back("armelfb_nbsd");
7802 break;
7803 }
7804 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007805 case llvm::Triple::mips64:
7806 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007807 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007808 CmdArgs.push_back("-m");
7809 if (getToolChain().getArch() == llvm::Triple::mips64)
7810 CmdArgs.push_back("elf32btsmip");
7811 else
7812 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007813 } else if (mips::hasMipsAbiArg(Args, "64")) {
7814 CmdArgs.push_back("-m");
7815 if (getToolChain().getArch() == llvm::Triple::mips64)
7816 CmdArgs.push_back("elf64btsmip");
7817 else
7818 CmdArgs.push_back("elf64ltsmip");
7819 }
7820 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007821 case llvm::Triple::ppc:
7822 CmdArgs.push_back("-m");
7823 CmdArgs.push_back("elf32ppc_nbsd");
7824 break;
7825
7826 case llvm::Triple::ppc64:
7827 case llvm::Triple::ppc64le:
7828 CmdArgs.push_back("-m");
7829 CmdArgs.push_back("elf64ppc");
7830 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007831
7832 case llvm::Triple::sparc:
7833 CmdArgs.push_back("-m");
7834 CmdArgs.push_back("elf32_sparc");
7835 break;
7836
7837 case llvm::Triple::sparcv9:
7838 CmdArgs.push_back("-m");
7839 CmdArgs.push_back("elf64_sparc");
7840 break;
7841
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007842 default:
7843 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007844 }
7845
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007846 if (Output.isFilename()) {
7847 CmdArgs.push_back("-o");
7848 CmdArgs.push_back(Output.getFilename());
7849 } else {
7850 assert(Output.isNothing() && "Invalid output.");
7851 }
7852
7853 if (!Args.hasArg(options::OPT_nostdlib) &&
7854 !Args.hasArg(options::OPT_nostartfiles)) {
7855 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007856 CmdArgs.push_back(
7857 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7858 CmdArgs.push_back(
7859 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7860 CmdArgs.push_back(
7861 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007862 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007863 CmdArgs.push_back(
7864 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7865 CmdArgs.push_back(
7866 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007867 }
7868 }
7869
7870 Args.AddAllArgs(CmdArgs, options::OPT_L);
7871 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7872 Args.AddAllArgs(CmdArgs, options::OPT_e);
7873 Args.AddAllArgs(CmdArgs, options::OPT_s);
7874 Args.AddAllArgs(CmdArgs, options::OPT_t);
7875 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7876 Args.AddAllArgs(CmdArgs, options::OPT_r);
7877
7878 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7879
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007880 unsigned Major, Minor, Micro;
7881 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7882 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007883 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007884 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007885 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007886 case llvm::Triple::arm:
7887 case llvm::Triple::armeb:
7888 case llvm::Triple::thumb:
7889 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007890 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007891 case llvm::Triple::ppc64:
7892 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007893 case llvm::Triple::x86:
7894 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007895 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007896 break;
7897 default:
7898 break;
7899 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007900 }
7901
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007902 if (!Args.hasArg(options::OPT_nostdlib) &&
7903 !Args.hasArg(options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00007904 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007905 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007906 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7907 CmdArgs.push_back("-lm");
7908 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007909 if (Args.hasArg(options::OPT_pthread))
7910 CmdArgs.push_back("-lpthread");
7911 CmdArgs.push_back("-lc");
7912
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007913 if (useLibgcc) {
7914 if (Args.hasArg(options::OPT_static)) {
7915 // libgcc_eh depends on libc, so resolve as much as possible,
7916 // pull in any new requirements from libc and then get the rest
7917 // of libgcc.
7918 CmdArgs.push_back("-lgcc_eh");
7919 CmdArgs.push_back("-lc");
7920 CmdArgs.push_back("-lgcc");
7921 } else {
7922 CmdArgs.push_back("-lgcc");
7923 CmdArgs.push_back("--as-needed");
7924 CmdArgs.push_back("-lgcc_s");
7925 CmdArgs.push_back("--no-as-needed");
7926 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007927 }
7928 }
7929
7930 if (!Args.hasArg(options::OPT_nostdlib) &&
7931 !Args.hasArg(options::OPT_nostartfiles)) {
7932 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007933 CmdArgs.push_back(
7934 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007935 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007936 CmdArgs.push_back(
7937 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7938 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007939 }
7940
Xinliang David Li69306c02015-10-22 06:15:31 +00007941 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007942
Logan Chieneb9162f2014-06-26 14:23:45 +00007943 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007944 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007945}
7946
Douglas Katzman95354292015-06-23 20:42:09 +00007947void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7948 const InputInfo &Output,
7949 const InputInfoList &Inputs,
7950 const ArgList &Args,
7951 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007952 claimNoWarnArgs(Args);
7953
James Y Knight2db38f32015-08-15 03:45:25 +00007954 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
7955 llvm::Triple Triple = llvm::Triple(TripleStr);
7956
Rafael Espindola92b00932010-08-10 00:25:48 +00007957 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007958 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007959
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007960 llvm::Reloc::Model RelocationModel;
7961 unsigned PICLevel;
7962 bool IsPIE;
7963 std::tie(RelocationModel, PICLevel, IsPIE) =
7964 ParsePICArgs(getToolChain(), Triple, Args);
7965
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007966 switch (getToolChain().getArch()) {
7967 default:
7968 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007969 // Add --32/--64 to make sure we get the format we want.
7970 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007971 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007972 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007973 break;
7974 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007975 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7976 CmdArgs.push_back("--x32");
7977 else
7978 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007979 break;
7980 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007981 CmdArgs.push_back("-a32");
7982 CmdArgs.push_back("-mppc");
7983 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007984 break;
7985 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007986 CmdArgs.push_back("-a64");
7987 CmdArgs.push_back("-mppc64");
7988 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007989 break;
7990 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007991 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007992 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007993 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007994 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007995 break;
7996 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007997 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007998 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007999 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008000 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008001 break;
8002 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008003 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00008004 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008005 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008006 break;
8007 case llvm::Triple::arm:
8008 case llvm::Triple::armeb:
8009 case llvm::Triple::thumb:
8010 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008011 const llvm::Triple &Triple2 = getToolChain().getTriple();
8012 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008013 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008014 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008015 break;
8016 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008017 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008018 break;
8019 default:
8020 break;
8021 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008022
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008023 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008024 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8025 case arm::FloatABI::Soft:
8026 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8027 break;
8028 case arm::FloatABI::SoftFP:
8029 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8030 break;
8031 case arm::FloatABI::Hard:
8032 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8033 break;
8034 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008035
8036 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008037
8038 // FIXME: remove krait check when GNU tools support krait cpu
8039 // for now replace it with -march=armv7-a to avoid a lower
8040 // march from being picked in the absence of a cpu flag.
8041 Arg *A;
8042 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008043 StringRef(A->getValue()).lower() == "krait")
8044 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008045 else
8046 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008047 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008048 break;
8049 }
8050 case llvm::Triple::mips:
8051 case llvm::Triple::mipsel:
8052 case llvm::Triple::mips64:
8053 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008054 StringRef CPUName;
8055 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008056 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008057 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008058
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008059 CmdArgs.push_back("-march");
8060 CmdArgs.push_back(CPUName.data());
8061
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008062 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008063 CmdArgs.push_back(ABIName.data());
8064
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008065 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8066 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008067 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008068 CmdArgs.push_back("-mno-shared");
8069
Daniel Sanders379d44b2014-07-16 11:52:23 +00008070 // LLVM doesn't support -mplt yet and acts as if it is always given.
8071 // However, -mplt has no effect with the N64 ABI.
8072 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008073
8074 if (getToolChain().getArch() == llvm::Triple::mips ||
8075 getToolChain().getArch() == llvm::Triple::mips64)
8076 CmdArgs.push_back("-EB");
8077 else
8078 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008079
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008080 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8081 if (StringRef(A->getValue()) == "2008")
8082 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8083 }
8084
Daniel Sanders379d44b2014-07-16 11:52:23 +00008085 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8086 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8087 options::OPT_mfp64)) {
8088 A->claim();
8089 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008090 } else if (mips::shouldUseFPXX(
8091 Args, getToolChain().getTriple(), CPUName, ABIName,
8092 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008093 CmdArgs.push_back("-mfpxx");
8094
8095 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8096 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008097 if (Arg *A =
8098 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008099 if (A->getOption().matches(options::OPT_mips16)) {
8100 A->claim();
8101 A->render(Args, CmdArgs);
8102 } else {
8103 A->claim();
8104 CmdArgs.push_back("-no-mips16");
8105 }
8106 }
8107
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008108 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8109 options::OPT_mno_micromips);
8110 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8111 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8112
Simon Atanasyanbd986632013-11-26 11:58:04 +00008113 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8114 // Do not use AddLastArg because not all versions of MIPS assembler
8115 // support -mmsa / -mno-msa options.
8116 if (A->getOption().matches(options::OPT_mmsa))
8117 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8118 }
8119
Daniel Sanders379d44b2014-07-16 11:52:23 +00008120 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8121 options::OPT_msoft_float);
8122
Toma Tabacub36d6102015-06-11 12:13:18 +00008123 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8124 options::OPT_msingle_float);
8125
Daniel Sanders379d44b2014-07-16 11:52:23 +00008126 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8127 options::OPT_mno_odd_spreg);
8128
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008129 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008130 break;
8131 }
8132 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008133 // Always pass an -march option, since our default of z10 is later
8134 // than the GNU assembler's default.
8135 StringRef CPUName = getSystemZTargetCPU(Args);
8136 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008137 break;
8138 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008139 }
8140
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008141 if (NeedsKPIC) {
8142 if (RelocationModel != llvm::Reloc::Static)
8143 CmdArgs.push_back("-KPIC");
8144 }
Rafael Espindola92b00932010-08-10 00:25:48 +00008145
Renato Golina74bbc72015-07-22 15:32:36 +00008146 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008147 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008148
8149 CmdArgs.push_back("-o");
8150 CmdArgs.push_back(Output.getFilename());
8151
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008152 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008153 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008154
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008155 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008156 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008157
8158 // Handle the debug info splitting at object creation time if we're
8159 // creating an object.
8160 // TODO: Currently only works on linux with newer objcopy.
8161 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008162 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008163 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008164 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008165}
8166
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008167static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008168 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008169 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008170 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008171 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8172 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008173 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008174 CmdArgs.push_back("-lgcc");
8175
Logan Chien3d3373c2012-11-19 12:04:11 +00008176 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008177 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008178 CmdArgs.push_back("-lgcc");
8179 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008180 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008181 CmdArgs.push_back("--as-needed");
8182 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008183 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008184 CmdArgs.push_back("--no-as-needed");
8185 }
8186
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008187 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008188 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008189 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008190 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008191
8192 // According to Android ABI, we have to link with libdl if we are
8193 // linking with non-static libgcc.
8194 //
8195 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8196 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8197 if (isAndroid && !StaticLibgcc)
8198 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008199}
8200
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008201static std::string getLinuxDynamicLinker(const ArgList &Args,
8202 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008203 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8204
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008205 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008206 if (ToolChain.getTriple().isArch64Bit())
8207 return "/system/bin/linker64";
8208 else
8209 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008210 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8211 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008212 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008213 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008214 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008215 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008216 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008217 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008218 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008219 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008220 return "/lib/ld-linux-armhf.so.3";
8221 else
8222 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008223 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8224 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008225 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008226 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008227 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008228 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008229 return "/lib/ld-linux.so.3";
8230 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8231 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00008232 StringRef CPUName;
8233 StringRef ABIName;
8234 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
Vasileios Kalintiris69675272015-10-05 09:12:36 +00008235 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00008236
8237 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
8238 .Case("o32", "/lib")
8239 .Case("n32", "/lib32")
8240 .Case("n64", "/lib64")
8241 .Default("/lib");
8242 StringRef LibName;
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008243 if (mips::isUCLibc(Args))
8244 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00008245 else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008246 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008247
8248 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008249 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008250 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008251 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008252 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8253 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008254 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008255 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008256 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8257 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008258 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008259 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008260 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008261 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008262 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008263 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008264 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8265 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008266 else
8267 return "/lib64/ld-linux-x86-64.so.2";
8268}
8269
Renato Golinc4b49242014-02-13 10:01:16 +00008270static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008271 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008272 // Make use of compiler-rt if --rtlib option is used
8273 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8274
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008275 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008276 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008277 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008278 default:
8279 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008280 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008281 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008282 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008283 break;
8284 }
Renato Golinc4b49242014-02-13 10:01:16 +00008285 break;
8286 case ToolChain::RLT_Libgcc:
8287 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8288 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008289 }
8290}
8291
Rafael Espindola1e085772014-08-15 17:14:35 +00008292static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8293 switch (T.getArch()) {
8294 case llvm::Triple::x86:
8295 return "elf_i386";
8296 case llvm::Triple::aarch64:
8297 return "aarch64linux";
8298 case llvm::Triple::aarch64_be:
8299 return "aarch64_be_linux";
8300 case llvm::Triple::arm:
8301 case llvm::Triple::thumb:
8302 return "armelf_linux_eabi";
8303 case llvm::Triple::armeb:
8304 case llvm::Triple::thumbeb:
8305 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8306 case llvm::Triple::ppc:
8307 return "elf32ppclinux";
8308 case llvm::Triple::ppc64:
8309 return "elf64ppc";
8310 case llvm::Triple::ppc64le:
8311 return "elf64lppc";
8312 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008313 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008314 return "elf32_sparc";
8315 case llvm::Triple::sparcv9:
8316 return "elf64_sparc";
8317 case llvm::Triple::mips:
8318 return "elf32btsmip";
8319 case llvm::Triple::mipsel:
8320 return "elf32ltsmip";
8321 case llvm::Triple::mips64:
8322 if (mips::hasMipsAbiArg(Args, "n32"))
8323 return "elf32btsmipn32";
8324 return "elf64btsmip";
8325 case llvm::Triple::mips64el:
8326 if (mips::hasMipsAbiArg(Args, "n32"))
8327 return "elf32ltsmipn32";
8328 return "elf64ltsmip";
8329 case llvm::Triple::systemz:
8330 return "elf64_s390";
8331 case llvm::Triple::x86_64:
8332 if (T.getEnvironment() == llvm::Triple::GNUX32)
8333 return "elf32_x86_64";
8334 return "elf_x86_64";
8335 default:
8336 llvm_unreachable("Unexpected arch");
8337 }
8338}
8339
Douglas Katzman95354292015-06-23 20:42:09 +00008340void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8341 const InputInfo &Output,
8342 const InputInfoList &Inputs,
8343 const ArgList &Args,
8344 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008345 const toolchains::Linux &ToolChain =
8346 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008347 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008348
8349 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8350 llvm::Triple Triple = llvm::Triple(TripleStr);
8351
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008352 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008353 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008354 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008355 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8356 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008357
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008358 ArgStringList CmdArgs;
8359
Rafael Espindolad1002f62010-11-15 18:28:16 +00008360 // Silence warning for "clang -g foo.o -o foo"
8361 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008362 // and "clang -emit-llvm foo.o -o foo"
8363 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008364 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008365 // handled somewhere else.
8366 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008367
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008368 if (!D.SysRoot.empty())
8369 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008370
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008371 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008372 CmdArgs.push_back("-pie");
8373
Rafael Espindola1c76c592010-11-07 22:57:16 +00008374 if (Args.hasArg(options::OPT_rdynamic))
8375 CmdArgs.push_back("-export-dynamic");
8376
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008377 if (Args.hasArg(options::OPT_s))
8378 CmdArgs.push_back("-s");
8379
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008380 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008381 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008382
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008383 for (const auto &Opt : ToolChain.ExtraOpts)
8384 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008385
8386 if (!Args.hasArg(options::OPT_static)) {
8387 CmdArgs.push_back("--eh-frame-hdr");
8388 }
8389
8390 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008391 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008392
8393 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008394 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8395 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008396 CmdArgs.push_back("-Bstatic");
8397 else
8398 CmdArgs.push_back("-static");
8399 } else if (Args.hasArg(options::OPT_shared)) {
8400 CmdArgs.push_back("-shared");
8401 }
8402
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008403 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8404 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008405 (!Args.hasArg(options::OPT_static) &&
8406 !Args.hasArg(options::OPT_shared))) {
8407 CmdArgs.push_back("-dynamic-linker");
8408 CmdArgs.push_back(Args.MakeArgString(
8409 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8410 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008411
8412 CmdArgs.push_back("-o");
8413 CmdArgs.push_back(Output.getFilename());
8414
Rafael Espindola81937ec2010-12-01 01:52:43 +00008415 if (!Args.hasArg(options::OPT_nostdlib) &&
8416 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008417 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008418 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008419 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008420 if (Args.hasArg(options::OPT_pg))
8421 crt1 = "gcrt1.o";
8422 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008423 crt1 = "Scrt1.o";
8424 else
8425 crt1 = "crt1.o";
8426 }
8427 if (crt1)
8428 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008429
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008430 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8431 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008432
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008433 const char *crtbegin;
8434 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008435 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008436 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008437 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008438 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008439 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008440 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008441 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00008442 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008443
8444 // Add crtfastmath.o if available and fast math is enabled.
8445 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008446 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008447
8448 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008449 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008450
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008451 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008452
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008453 for (const auto &Path : Paths)
8454 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008455
Teresa Johnson945bc502015-10-15 20:35:53 +00008456 if (D.isUsingLTO())
8457 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008458
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008459 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8460 CmdArgs.push_back("--no-demangle");
8461
Alexey Samsonov52550342014-09-15 19:58:40 +00008462 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008463 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008464 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008465 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008466
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008467 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008468 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008469 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008470 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008471 if (OnlyLibstdcxxStatic)
8472 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008473 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008474 if (OnlyLibstdcxxStatic)
8475 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008476 CmdArgs.push_back("-lm");
8477 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008478 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8479 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008480
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008481 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008482 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8483 if (Args.hasArg(options::OPT_static))
8484 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008485
Alexey Samsonov52550342014-09-15 19:58:40 +00008486 if (NeedsSanitizerDeps)
8487 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8488
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008489 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8490 Args.hasArg(options::OPT_pthreads);
8491
8492 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8493 options::OPT_fno_openmp, false)) {
8494 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8495 // FIXME: Does this really make sense for all GNU toolchains?
8496 WantPthread = true;
8497
8498 // Also link the particular OpenMP runtimes.
8499 switch (getOpenMPRuntime(ToolChain, Args)) {
8500 case OMPRT_OMP:
8501 CmdArgs.push_back("-lomp");
8502 break;
8503 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008504 CmdArgs.push_back("-lgomp");
8505
8506 // FIXME: Exclude this for platforms with libgomp that don't require
8507 // librt. Most modern Linux platforms require it, but some may not.
8508 CmdArgs.push_back("-lrt");
8509 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008510 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008511 CmdArgs.push_back("-liomp5");
8512 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008513 case OMPRT_Unknown:
8514 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008515 break;
8516 }
Chandler Carruth01538002013-01-17 13:19:29 +00008517 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008518
Renato Golinc4b49242014-02-13 10:01:16 +00008519 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008520
Richard Smith31d1de22015-05-20 22:48:44 +00008521 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008522 CmdArgs.push_back("-lpthread");
8523
8524 CmdArgs.push_back("-lc");
8525
8526 if (Args.hasArg(options::OPT_static))
8527 CmdArgs.push_back("--end-group");
8528 else
Renato Golinc4b49242014-02-13 10:01:16 +00008529 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008530 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008531
Rafael Espindola81937ec2010-12-01 01:52:43 +00008532 if (!Args.hasArg(options::OPT_nostartfiles)) {
8533 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008534 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008535 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008536 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008537 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008538 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008539 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008540
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00008541 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008542 if (!isAndroid)
8543 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008544 }
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00008545 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008546
Justin Bognerd3371d82015-07-17 03:35:54 +00008547 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8548 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008549}
8550
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008551// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8552// for the various SFI requirements like register masking. The assembly tool
8553// inserts the file containing the macros as an input into all the assembly
8554// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008555void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8556 const InputInfo &Output,
8557 const InputInfoList &Inputs,
8558 const ArgList &Args,
8559 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008560 const toolchains::NaClToolChain &ToolChain =
8561 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008562 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8563 "nacl-arm-macros.s");
8564 InputInfoList NewInputs;
8565 NewInputs.push_back(NaClMacros);
8566 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008567 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8568 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008569}
8570
Douglas Katzman750cfc52015-06-29 18:42:16 +00008571// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008572// we use static by default, do not yet support sanitizers or LTO, and a few
8573// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008574// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008575void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8576 const InputInfo &Output,
8577 const InputInfoList &Inputs,
8578 const ArgList &Args,
8579 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008580
Douglas Katzman54366072015-07-27 16:53:08 +00008581 const toolchains::NaClToolChain &ToolChain =
8582 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008583 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008584 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008585 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008586 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008587
8588 ArgStringList CmdArgs;
8589
8590 // Silence warning for "clang -g foo.o -o foo"
8591 Args.ClaimAllArgs(options::OPT_g_Group);
8592 // and "clang -emit-llvm foo.o -o foo"
8593 Args.ClaimAllArgs(options::OPT_emit_llvm);
8594 // and for "clang -w foo.o -o foo". Other warning options are already
8595 // handled somewhere else.
8596 Args.ClaimAllArgs(options::OPT_w);
8597
8598 if (!D.SysRoot.empty())
8599 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8600
8601 if (Args.hasArg(options::OPT_rdynamic))
8602 CmdArgs.push_back("-export-dynamic");
8603
8604 if (Args.hasArg(options::OPT_s))
8605 CmdArgs.push_back("-s");
8606
Douglas Katzman54366072015-07-27 16:53:08 +00008607 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8608 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008609 CmdArgs.push_back("--build-id");
8610
8611 if (!IsStatic)
8612 CmdArgs.push_back("--eh-frame-hdr");
8613
8614 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008615 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008616 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008617 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008618 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008619 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008620 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008621 else if (Arch == llvm::Triple::mipsel)
8622 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008623 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008624 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8625 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008626
8627 if (IsStatic)
8628 CmdArgs.push_back("-static");
8629 else if (Args.hasArg(options::OPT_shared))
8630 CmdArgs.push_back("-shared");
8631
8632 CmdArgs.push_back("-o");
8633 CmdArgs.push_back(Output.getFilename());
8634 if (!Args.hasArg(options::OPT_nostdlib) &&
8635 !Args.hasArg(options::OPT_nostartfiles)) {
8636 if (!Args.hasArg(options::OPT_shared))
8637 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8638 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8639
8640 const char *crtbegin;
8641 if (IsStatic)
8642 crtbegin = "crtbeginT.o";
8643 else if (Args.hasArg(options::OPT_shared))
8644 crtbegin = "crtbeginS.o";
8645 else
8646 crtbegin = "crtbegin.o";
8647 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8648 }
8649
8650 Args.AddAllArgs(CmdArgs, options::OPT_L);
8651 Args.AddAllArgs(CmdArgs, options::OPT_u);
8652
8653 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8654
8655 for (const auto &Path : Paths)
8656 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8657
8658 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8659 CmdArgs.push_back("--no-demangle");
8660
8661 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8662
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008663 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008664 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008665 bool OnlyLibstdcxxStatic =
8666 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008667 if (OnlyLibstdcxxStatic)
8668 CmdArgs.push_back("-Bstatic");
8669 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8670 if (OnlyLibstdcxxStatic)
8671 CmdArgs.push_back("-Bdynamic");
8672 CmdArgs.push_back("-lm");
8673 }
8674
8675 if (!Args.hasArg(options::OPT_nostdlib)) {
8676 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8677 // Always use groups, since it has no effect on dynamic libraries.
8678 CmdArgs.push_back("--start-group");
8679 CmdArgs.push_back("-lc");
8680 // NaCl's libc++ currently requires libpthread, so just always include it
8681 // in the group for C++.
8682 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008683 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008684 // Gold, used by Mips, handles nested groups differently than ld, and
8685 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8686 // which is not a desired behaviour here.
8687 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8688 if (getToolChain().getArch() == llvm::Triple::mipsel)
8689 CmdArgs.push_back("-lnacl");
8690
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008691 CmdArgs.push_back("-lpthread");
8692 }
8693
8694 CmdArgs.push_back("-lgcc");
8695 CmdArgs.push_back("--as-needed");
8696 if (IsStatic)
8697 CmdArgs.push_back("-lgcc_eh");
8698 else
8699 CmdArgs.push_back("-lgcc_s");
8700 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008701
8702 // Mips needs to create and use pnacl_legacy library that contains
8703 // definitions from bitcode/pnaclmm.c and definitions for
8704 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8705 if (getToolChain().getArch() == llvm::Triple::mipsel)
8706 CmdArgs.push_back("-lpnacl_legacy");
8707
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008708 CmdArgs.push_back("--end-group");
8709 }
8710
8711 if (!Args.hasArg(options::OPT_nostartfiles)) {
8712 const char *crtend;
8713 if (Args.hasArg(options::OPT_shared))
8714 crtend = "crtendS.o";
8715 else
8716 crtend = "crtend.o";
8717
8718 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8719 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8720 }
8721 }
8722
Justin Bognerd3371d82015-07-17 03:35:54 +00008723 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8724 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008725}
8726
Douglas Katzman95354292015-06-23 20:42:09 +00008727void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8728 const InputInfo &Output,
8729 const InputInfoList &Inputs,
8730 const ArgList &Args,
8731 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008732 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008733 ArgStringList CmdArgs;
8734
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008735 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008736
8737 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008738 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008739
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008740 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008741 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008742
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008743 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008744 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008745}
8746
Douglas Katzman95354292015-06-23 20:42:09 +00008747void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8748 const InputInfo &Output,
8749 const InputInfoList &Inputs,
8750 const ArgList &Args,
8751 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008752 const Driver &D = getToolChain().getDriver();
8753 ArgStringList CmdArgs;
8754
Daniel Dunbarb440f562010-08-02 02:38:21 +00008755 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008756 CmdArgs.push_back("-o");
8757 CmdArgs.push_back(Output.getFilename());
8758 } else {
8759 assert(Output.isNothing() && "Invalid output.");
8760 }
8761
8762 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008763 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008764 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8765 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8766 CmdArgs.push_back(
8767 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8768 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008769 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008770
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008771 Args.AddAllArgs(CmdArgs,
8772 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008773
Daniel Dunbar54423b22010-09-17 00:24:54 +00008774 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008775
Xinliang David Li69306c02015-10-22 06:15:31 +00008776 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008777
Chris Lattner3e2ee142010-07-07 16:01:42 +00008778 if (!Args.hasArg(options::OPT_nostdlib) &&
8779 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008780 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008781 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008782 CmdArgs.push_back("-lm");
8783 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008784 }
8785
8786 if (!Args.hasArg(options::OPT_nostdlib) &&
8787 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008788 if (Args.hasArg(options::OPT_pthread))
8789 CmdArgs.push_back("-lpthread");
8790 CmdArgs.push_back("-lc");
8791 CmdArgs.push_back("-lCompilerRT-Generic");
8792 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8793 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008794 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008795 }
8796
Logan Chieneb9162f2014-06-26 14:23:45 +00008797 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008798 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008799}
8800
Daniel Dunbarcc912342009-05-02 18:28:39 +00008801/// DragonFly Tools
8802
8803// For now, DragonFly Assemble does just about the same as for
8804// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008805void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8806 const InputInfo &Output,
8807 const InputInfoList &Inputs,
8808 const ArgList &Args,
8809 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008810 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008811 ArgStringList CmdArgs;
8812
8813 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8814 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008815 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008816 CmdArgs.push_back("--32");
8817
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008818 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008819
8820 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008821 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008822
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008823 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008824 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008825
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008826 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008827 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008828}
8829
Douglas Katzman95354292015-06-23 20:42:09 +00008830void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8831 const InputInfo &Output,
8832 const InputInfoList &Inputs,
8833 const ArgList &Args,
8834 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008835 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008836 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008837 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008838
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008839 if (!D.SysRoot.empty())
8840 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8841
John McCall65b8da02013-04-11 22:55:55 +00008842 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008843 if (Args.hasArg(options::OPT_static)) {
8844 CmdArgs.push_back("-Bstatic");
8845 } else {
John McCall65b8da02013-04-11 22:55:55 +00008846 if (Args.hasArg(options::OPT_rdynamic))
8847 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008848 if (Args.hasArg(options::OPT_shared))
8849 CmdArgs.push_back("-Bshareable");
8850 else {
8851 CmdArgs.push_back("-dynamic-linker");
8852 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8853 }
John McCall65b8da02013-04-11 22:55:55 +00008854 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008855 }
8856
8857 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8858 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008859 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008860 CmdArgs.push_back("-m");
8861 CmdArgs.push_back("elf_i386");
8862 }
8863
Daniel Dunbarb440f562010-08-02 02:38:21 +00008864 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008865 CmdArgs.push_back("-o");
8866 CmdArgs.push_back(Output.getFilename());
8867 } else {
8868 assert(Output.isNothing() && "Invalid output.");
8869 }
8870
8871 if (!Args.hasArg(options::OPT_nostdlib) &&
8872 !Args.hasArg(options::OPT_nostartfiles)) {
8873 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008874 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008875 CmdArgs.push_back(
8876 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008877 else {
8878 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008879 CmdArgs.push_back(
8880 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008881 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008882 CmdArgs.push_back(
8883 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008884 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008885 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008886 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008887 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008888 CmdArgs.push_back(
8889 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008890 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008891 CmdArgs.push_back(
8892 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008893 }
8894
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008895 Args.AddAllArgs(CmdArgs,
8896 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00008897
Daniel Dunbar54423b22010-09-17 00:24:54 +00008898 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008899
8900 if (!Args.hasArg(options::OPT_nostdlib) &&
8901 !Args.hasArg(options::OPT_nodefaultlibs)) {
8902 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8903 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008904 if (UseGCC47)
8905 CmdArgs.push_back("-L/usr/lib/gcc47");
8906 else
8907 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008908
8909 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008910 if (UseGCC47) {
8911 CmdArgs.push_back("-rpath");
8912 CmdArgs.push_back("/usr/lib/gcc47");
8913 } else {
8914 CmdArgs.push_back("-rpath");
8915 CmdArgs.push_back("/usr/lib/gcc44");
8916 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008917 }
8918
Hans Wennborg70850d82013-07-18 20:29:38 +00008919 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008920 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008921 CmdArgs.push_back("-lm");
8922 }
8923
Daniel Dunbarcc912342009-05-02 18:28:39 +00008924 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008925 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008926
8927 if (!Args.hasArg(options::OPT_nolibc)) {
8928 CmdArgs.push_back("-lc");
8929 }
8930
John McCall65b8da02013-04-11 22:55:55 +00008931 if (UseGCC47) {
8932 if (Args.hasArg(options::OPT_static) ||
8933 Args.hasArg(options::OPT_static_libgcc)) {
8934 CmdArgs.push_back("-lgcc");
8935 CmdArgs.push_back("-lgcc_eh");
8936 } else {
8937 if (Args.hasArg(options::OPT_shared_libgcc)) {
8938 CmdArgs.push_back("-lgcc_pic");
8939 if (!Args.hasArg(options::OPT_shared))
8940 CmdArgs.push_back("-lgcc");
8941 } else {
8942 CmdArgs.push_back("-lgcc");
8943 CmdArgs.push_back("--as-needed");
8944 CmdArgs.push_back("-lgcc_pic");
8945 CmdArgs.push_back("--no-as-needed");
8946 }
8947 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008948 } else {
John McCall65b8da02013-04-11 22:55:55 +00008949 if (Args.hasArg(options::OPT_shared)) {
8950 CmdArgs.push_back("-lgcc_pic");
8951 } else {
8952 CmdArgs.push_back("-lgcc");
8953 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008954 }
8955 }
8956
8957 if (!Args.hasArg(options::OPT_nostdlib) &&
8958 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008959 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008960 CmdArgs.push_back(
8961 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008962 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008963 CmdArgs.push_back(
8964 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8965 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008966 }
8967
Xinliang David Li69306c02015-10-22 06:15:31 +00008968 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008969
Logan Chieneb9162f2014-06-26 14:23:45 +00008970 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008971 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008972}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008973
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008974// Try to find Exe from a Visual Studio distribution. This first tries to find
8975// an installed copy of Visual Studio and, failing that, looks in the PATH,
8976// making sure that whatever executable that's found is not a same-named exe
8977// from clang itself to prevent clang from falling back to itself.
8978static std::string FindVisualStudioExecutable(const ToolChain &TC,
8979 const char *Exe,
8980 const char *ClangProgramPath) {
8981 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8982 std::string visualStudioBinDir;
8983 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8984 visualStudioBinDir)) {
8985 SmallString<128> FilePath(visualStudioBinDir);
8986 llvm::sys::path::append(FilePath, Exe);
8987 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8988 return FilePath.str();
8989 }
8990
8991 return Exe;
8992}
8993
Douglas Katzman95354292015-06-23 20:42:09 +00008994void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8995 const InputInfo &Output,
8996 const InputInfoList &Inputs,
8997 const ArgList &Args,
8998 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008999 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009000 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009001
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009002 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9003 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009004 CmdArgs.push_back(
9005 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009006
9007 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009008 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009009 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009010
Zachary Turner10d75b22014-10-22 20:40:43 +00009011 if (!llvm::sys::Process::GetEnv("LIB")) {
9012 // If the VC environment hasn't been configured (perhaps because the user
9013 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009014 // the environment variable is set however, assume the user knows what
9015 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009016 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009017 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009018 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9019 SmallString<128> LibDir(VisualStudioDir);
9020 llvm::sys::path::append(LibDir, "VC", "lib");
9021 switch (MSVC.getArch()) {
9022 case llvm::Triple::x86:
9023 // x86 just puts the libraries directly in lib
9024 break;
9025 case llvm::Triple::x86_64:
9026 llvm::sys::path::append(LibDir, "amd64");
9027 break;
9028 case llvm::Triple::arm:
9029 llvm::sys::path::append(LibDir, "arm");
9030 break;
9031 default:
9032 break;
9033 }
9034 CmdArgs.push_back(
9035 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009036
9037 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9038 std::string UniversalCRTLibPath;
9039 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9040 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9041 UniversalCRTLibPath.c_str()));
9042 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009043 }
9044
9045 std::string WindowsSdkLibPath;
9046 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9047 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9048 WindowsSdkLibPath.c_str()));
9049 }
9050
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009051 CmdArgs.push_back("-nologo");
9052
Reid Kleckner124955a2015-08-05 18:51:13 +00009053 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009054 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009055
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009056 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009057 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009058 if (DLL) {
9059 CmdArgs.push_back(Args.MakeArgString("-dll"));
9060
9061 SmallString<128> ImplibName(Output.getFilename());
9062 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009063 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009064 }
9065
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009066 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009067 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009068 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009069 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Craig Topper273dbc62015-10-18 05:29:26 +00009070 static const char *const CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009071 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00009072 };
9073 for (const auto &Component : CompilerRTComponents)
Xinliang David Li69306c02015-10-22 06:15:31 +00009074 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Component));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009075 // Make sure the dynamic runtime thunk is not optimized out at link time
9076 // to ensure proper SEH handling.
9077 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009078 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009079 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009080 } else {
Craig Topper273dbc62015-10-18 05:29:26 +00009081 static const char *const CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009082 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00009083 };
9084 for (const auto &Component : CompilerRTComponents)
Xinliang David Li69306c02015-10-22 06:15:31 +00009085 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Component));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009086 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009087 }
9088
Hans Wennborg2e274592013-08-13 23:38:57 +00009089 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009090
Alexey Bataevc7e84352015-08-19 04:49:01 +00009091 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9092 options::OPT_fno_openmp, false)) {
9093 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9094 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9095 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9096 TC.getDriver().Dir + "/../lib"));
9097 switch (getOpenMPRuntime(getToolChain(), Args)) {
9098 case OMPRT_OMP:
9099 CmdArgs.push_back("-defaultlib:libomp.lib");
9100 break;
9101 case OMPRT_IOMP5:
9102 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9103 break;
9104 case OMPRT_GOMP:
9105 break;
9106 case OMPRT_Unknown:
9107 // Already diagnosed.
9108 break;
9109 }
9110 }
9111
Reid Kleckner337188f2014-09-16 19:22:00 +00009112 // Add filenames, libraries, and other linker inputs.
9113 for (const auto &Input : Inputs) {
9114 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009115 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009116 continue;
9117 }
9118
9119 const Arg &A = Input.getInputArg();
9120
9121 // Render -l options differently for the MSVC linker.
9122 if (A.getOption().matches(options::OPT_l)) {
9123 StringRef Lib = A.getValue();
9124 const char *LinkLibArg;
9125 if (Lib.endswith(".lib"))
9126 LinkLibArg = Args.MakeArgString(Lib);
9127 else
9128 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9129 CmdArgs.push_back(LinkLibArg);
9130 continue;
9131 }
9132
9133 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9134 // or -L. Render it, even if MSVC doesn't understand it.
9135 A.renderAsInput(Args, CmdArgs);
9136 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009137
Zachary Turner719f58c2014-12-01 23:06:47 +00009138 // We need to special case some linker paths. In the case of lld, we need to
9139 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9140 // linker, we need to use a special search algorithm.
9141 llvm::SmallString<128> linkPath;
9142 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9143 if (Linker.equals_lower("lld"))
9144 Linker = "lld-link";
9145
9146 if (Linker.equals_lower("link")) {
9147 // If we're using the MSVC linker, it's not sufficient to just use link
9148 // from the program PATH, because other environments like GnuWin32 install
9149 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009150 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009151 C.getDriver().getClangProgramPath());
9152 } else {
9153 linkPath = Linker;
9154 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009155 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009156 }
9157
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009158 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009159 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009160}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009161
Douglas Katzman95354292015-06-23 20:42:09 +00009162void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9163 const InputInfo &Output,
9164 const InputInfoList &Inputs,
9165 const ArgList &Args,
9166 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009167 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9168}
9169
Douglas Katzman95354292015-06-23 20:42:09 +00009170std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009171 Compilation &C, const JobAction &JA, const InputInfo &Output,
9172 const InputInfoList &Inputs, const ArgList &Args,
9173 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009174 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009175 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009176 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009177 CmdArgs.push_back("/W0"); // No warnings.
9178
9179 // The goal is to be able to invoke this tool correctly based on
9180 // any flag accepted by clang-cl.
9181
9182 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009183 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009184
9185 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009186 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9187 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9188 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009189 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9190 if (A->getOption().getID() == options::OPT_O0) {
9191 CmdArgs.push_back("/Od");
9192 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009193 CmdArgs.push_back("/Og");
9194
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009195 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009196 if (OptLevel == "s" || OptLevel == "z")
9197 CmdArgs.push_back("/Os");
9198 else
9199 CmdArgs.push_back("/Ot");
9200
9201 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009202 }
9203 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009204 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9205 options::OPT_fno_omit_frame_pointer))
9206 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9207 ? "/Oy"
9208 : "/Oy-");
9209 if (!Args.hasArg(options::OPT_fwritable_strings))
9210 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009211
Nico Weber3f8dafb2015-03-12 19:37:10 +00009212 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009213 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9214
David Majnemerf6072342014-07-01 22:24:56 +00009215 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9216 /*default=*/false))
9217 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009218 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9219 options::OPT_fno_function_sections))
9220 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9221 ? "/Gy"
9222 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009223 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9224 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009225 CmdArgs.push_back(
9226 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009227 if (Args.hasArg(options::OPT_fsyntax_only))
9228 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009229 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9230 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009231 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009232
Nico Weber3f8dafb2015-03-12 19:37:10 +00009233 std::vector<std::string> Includes =
9234 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009235 for (const auto &Include : Includes)
9236 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009237
Hans Wennborg87cfa712013-09-19 20:32:16 +00009238 // Flags that can simply be passed through.
9239 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9240 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009241 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009242 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009243
9244 // The order of these flags is relevant, so pick the last one.
9245 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9246 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9247 A->render(Args, CmdArgs);
9248
Hans Wennborg87cfa712013-09-19 20:32:16 +00009249 // Input filename.
9250 assert(Inputs.size() == 1);
9251 const InputInfo &II = Inputs[0];
9252 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9253 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9254 if (II.isFilename())
9255 CmdArgs.push_back(II.getFilename());
9256 else
9257 II.getInputArg().renderAsInput(Args, CmdArgs);
9258
9259 // Output filename.
9260 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009261 const char *Fo =
9262 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009263 CmdArgs.push_back(Fo);
9264
Hans Wennborg188382e2013-09-20 18:16:35 +00009265 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009266 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9267 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009268 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009269 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009270}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009271
Yaron Keren1c0070c2015-07-02 04:45:27 +00009272/// MinGW Tools
9273void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9274 const InputInfo &Output,
9275 const InputInfoList &Inputs,
9276 const ArgList &Args,
9277 const char *LinkingOutput) const {
9278 claimNoWarnArgs(Args);
9279 ArgStringList CmdArgs;
9280
9281 if (getToolChain().getArch() == llvm::Triple::x86) {
9282 CmdArgs.push_back("--32");
9283 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9284 CmdArgs.push_back("--64");
9285 }
9286
9287 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9288
9289 CmdArgs.push_back("-o");
9290 CmdArgs.push_back(Output.getFilename());
9291
9292 for (const auto &II : Inputs)
9293 CmdArgs.push_back(II.getFilename());
9294
9295 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009296 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009297
9298 if (Args.hasArg(options::OPT_gsplit_dwarf))
9299 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9300 SplitDebugName(Args, Inputs[0]));
9301}
9302
9303void MinGW::Linker::AddLibGCC(const ArgList &Args,
9304 ArgStringList &CmdArgs) const {
9305 if (Args.hasArg(options::OPT_mthreads))
9306 CmdArgs.push_back("-lmingwthrd");
9307 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009308
Yaron Kerenaa281332015-08-09 00:24:07 +00009309 // Make use of compiler-rt if --rtlib option is used
9310 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9311 if (RLT == ToolChain::RLT_Libgcc) {
9312 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9313 Args.hasArg(options::OPT_static);
9314 bool Shared = Args.hasArg(options::OPT_shared);
9315 bool CXX = getToolChain().getDriver().CCCIsCXX();
9316
9317 if (Static || (!CXX && !Shared)) {
9318 CmdArgs.push_back("-lgcc");
9319 CmdArgs.push_back("-lgcc_eh");
9320 } else {
9321 CmdArgs.push_back("-lgcc_s");
9322 CmdArgs.push_back("-lgcc");
9323 }
9324 } else {
9325 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9326 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009327
Yaron Keren1c0070c2015-07-02 04:45:27 +00009328 CmdArgs.push_back("-lmoldname");
9329 CmdArgs.push_back("-lmingwex");
9330 CmdArgs.push_back("-lmsvcrt");
9331}
9332
9333void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9334 const InputInfo &Output,
9335 const InputInfoList &Inputs,
9336 const ArgList &Args,
9337 const char *LinkingOutput) const {
9338 const ToolChain &TC = getToolChain();
9339 const Driver &D = TC.getDriver();
9340 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9341
9342 ArgStringList CmdArgs;
9343
9344 // Silence warning for "clang -g foo.o -o foo"
9345 Args.ClaimAllArgs(options::OPT_g_Group);
9346 // and "clang -emit-llvm foo.o -o foo"
9347 Args.ClaimAllArgs(options::OPT_emit_llvm);
9348 // and for "clang -w foo.o -o foo". Other warning options are already
9349 // handled somewhere else.
9350 Args.ClaimAllArgs(options::OPT_w);
9351
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009352 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9353 if (LinkerName.equals_lower("lld")) {
9354 CmdArgs.push_back("-flavor");
9355 CmdArgs.push_back("gnu");
9356 }
9357
Yaron Keren1c0070c2015-07-02 04:45:27 +00009358 if (!D.SysRoot.empty())
9359 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9360
9361 if (Args.hasArg(options::OPT_s))
9362 CmdArgs.push_back("-s");
9363
9364 CmdArgs.push_back("-m");
9365 if (TC.getArch() == llvm::Triple::x86)
9366 CmdArgs.push_back("i386pe");
9367 if (TC.getArch() == llvm::Triple::x86_64)
9368 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009369 if (TC.getArch() == llvm::Triple::arm)
9370 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009371
9372 if (Args.hasArg(options::OPT_mwindows)) {
9373 CmdArgs.push_back("--subsystem");
9374 CmdArgs.push_back("windows");
9375 } else if (Args.hasArg(options::OPT_mconsole)) {
9376 CmdArgs.push_back("--subsystem");
9377 CmdArgs.push_back("console");
9378 }
9379
9380 if (Args.hasArg(options::OPT_static))
9381 CmdArgs.push_back("-Bstatic");
9382 else {
9383 if (Args.hasArg(options::OPT_mdll))
9384 CmdArgs.push_back("--dll");
9385 else if (Args.hasArg(options::OPT_shared))
9386 CmdArgs.push_back("--shared");
9387 CmdArgs.push_back("-Bdynamic");
9388 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9389 CmdArgs.push_back("-e");
9390 if (TC.getArch() == llvm::Triple::x86)
9391 CmdArgs.push_back("_DllMainCRTStartup@12");
9392 else
9393 CmdArgs.push_back("DllMainCRTStartup");
9394 CmdArgs.push_back("--enable-auto-image-base");
9395 }
9396 }
9397
9398 CmdArgs.push_back("-o");
9399 CmdArgs.push_back(Output.getFilename());
9400
9401 Args.AddAllArgs(CmdArgs, options::OPT_e);
9402 // FIXME: add -N, -n flags
9403 Args.AddLastArg(CmdArgs, options::OPT_r);
9404 Args.AddLastArg(CmdArgs, options::OPT_s);
9405 Args.AddLastArg(CmdArgs, options::OPT_t);
9406 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9407 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9408
9409 if (!Args.hasArg(options::OPT_nostdlib) &&
9410 !Args.hasArg(options::OPT_nostartfiles)) {
9411 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9412 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9413 } else {
9414 if (Args.hasArg(options::OPT_municode))
9415 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9416 else
9417 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9418 }
9419 if (Args.hasArg(options::OPT_pg))
9420 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9421 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9422 }
9423
9424 Args.AddAllArgs(CmdArgs, options::OPT_L);
9425 const ToolChain::path_list Paths = TC.getFilePaths();
9426 for (const auto &Path : Paths)
9427 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9428
9429 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9430
9431 // TODO: Add ASan stuff here
9432
9433 // TODO: Add profile stuff here
9434
9435 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9436 !Args.hasArg(options::OPT_nodefaultlibs)) {
9437 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9438 !Args.hasArg(options::OPT_static);
9439 if (OnlyLibstdcxxStatic)
9440 CmdArgs.push_back("-Bstatic");
9441 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9442 if (OnlyLibstdcxxStatic)
9443 CmdArgs.push_back("-Bdynamic");
9444 }
9445
9446 if (!Args.hasArg(options::OPT_nostdlib)) {
9447 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9448 if (Args.hasArg(options::OPT_static))
9449 CmdArgs.push_back("--start-group");
9450
9451 if (Args.hasArg(options::OPT_fstack_protector) ||
9452 Args.hasArg(options::OPT_fstack_protector_strong) ||
9453 Args.hasArg(options::OPT_fstack_protector_all)) {
9454 CmdArgs.push_back("-lssp_nonshared");
9455 CmdArgs.push_back("-lssp");
9456 }
9457 if (Args.hasArg(options::OPT_fopenmp))
9458 CmdArgs.push_back("-lgomp");
9459
9460 AddLibGCC(Args, CmdArgs);
9461
9462 if (Args.hasArg(options::OPT_pg))
9463 CmdArgs.push_back("-lgmon");
9464
Yaron Kerenadce68e2015-07-06 18:52:19 +00009465 if (Args.hasArg(options::OPT_pthread))
9466 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009467
9468 // add system libraries
9469 if (Args.hasArg(options::OPT_mwindows)) {
9470 CmdArgs.push_back("-lgdi32");
9471 CmdArgs.push_back("-lcomdlg32");
9472 }
9473 CmdArgs.push_back("-ladvapi32");
9474 CmdArgs.push_back("-lshell32");
9475 CmdArgs.push_back("-luser32");
9476 CmdArgs.push_back("-lkernel32");
9477
9478 if (Args.hasArg(options::OPT_static))
9479 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009480 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009481 AddLibGCC(Args, CmdArgs);
9482 }
9483
9484 if (!Args.hasArg(options::OPT_nostartfiles)) {
9485 // Add crtfastmath.o if available and fast math is enabled.
9486 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9487
9488 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9489 }
9490 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009491 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009492 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009493}
9494
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009495/// XCore Tools
9496// We pass assemble and link construction to the xcc tool.
9497
Douglas Katzman95354292015-06-23 20:42:09 +00009498void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9499 const InputInfo &Output,
9500 const InputInfoList &Inputs,
9501 const ArgList &Args,
9502 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009503 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009504 ArgStringList CmdArgs;
9505
9506 CmdArgs.push_back("-o");
9507 CmdArgs.push_back(Output.getFilename());
9508
9509 CmdArgs.push_back("-c");
9510
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009511 if (Args.hasArg(options::OPT_v))
9512 CmdArgs.push_back("-v");
9513
Robert Lytton894d25c2014-05-02 09:33:25 +00009514 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9515 if (!A->getOption().matches(options::OPT_g0))
9516 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009517
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009518 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9519 false))
9520 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009521
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009522 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009523
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009524 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009525 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009526
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009527 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009528 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009529}
9530
Douglas Katzman95354292015-06-23 20:42:09 +00009531void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9532 const InputInfo &Output,
9533 const InputInfoList &Inputs,
9534 const ArgList &Args,
9535 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009536 ArgStringList CmdArgs;
9537
9538 if (Output.isFilename()) {
9539 CmdArgs.push_back("-o");
9540 CmdArgs.push_back(Output.getFilename());
9541 } else {
9542 assert(Output.isNothing() && "Invalid output.");
9543 }
9544
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009545 if (Args.hasArg(options::OPT_v))
9546 CmdArgs.push_back("-v");
9547
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009548 // Pass -fexceptions through to the linker if it was present.
9549 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9550 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009551 CmdArgs.push_back("-fexceptions");
9552
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009553 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9554
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009555 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009556 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009557}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009558
Douglas Katzman95354292015-06-23 20:42:09 +00009559void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9560 const InputInfo &Output,
9561 const InputInfoList &Inputs,
9562 const ArgList &Args,
9563 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009564 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009565 const auto &TC =
9566 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9567 ArgStringList CmdArgs;
9568 const char *Exec;
9569
9570 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009571 default:
9572 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009573 case llvm::Triple::arm:
9574 case llvm::Triple::thumb:
9575 break;
9576 case llvm::Triple::x86:
9577 CmdArgs.push_back("--32");
9578 break;
9579 case llvm::Triple::x86_64:
9580 CmdArgs.push_back("--64");
9581 break;
9582 }
9583
9584 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9585
9586 CmdArgs.push_back("-o");
9587 CmdArgs.push_back(Output.getFilename());
9588
9589 for (const auto &Input : Inputs)
9590 CmdArgs.push_back(Input.getFilename());
9591
9592 const std::string Assembler = TC.GetProgramPath("as");
9593 Exec = Args.MakeArgString(Assembler);
9594
Justin Bognerd3371d82015-07-17 03:35:54 +00009595 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009596}
9597
Douglas Katzman95354292015-06-23 20:42:09 +00009598void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9599 const InputInfo &Output,
9600 const InputInfoList &Inputs,
9601 const ArgList &Args,
9602 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009603 const auto &TC =
9604 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9605 const llvm::Triple &T = TC.getTriple();
9606 const Driver &D = TC.getDriver();
9607 SmallString<128> EntryPoint;
9608 ArgStringList CmdArgs;
9609 const char *Exec;
9610
9611 // Silence warning for "clang -g foo.o -o foo"
9612 Args.ClaimAllArgs(options::OPT_g_Group);
9613 // and "clang -emit-llvm foo.o -o foo"
9614 Args.ClaimAllArgs(options::OPT_emit_llvm);
9615 // and for "clang -w foo.o -o foo"
9616 Args.ClaimAllArgs(options::OPT_w);
9617 // Other warning options are already handled somewhere else.
9618
9619 if (!D.SysRoot.empty())
9620 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9621
9622 if (Args.hasArg(options::OPT_pie))
9623 CmdArgs.push_back("-pie");
9624 if (Args.hasArg(options::OPT_rdynamic))
9625 CmdArgs.push_back("-export-dynamic");
9626 if (Args.hasArg(options::OPT_s))
9627 CmdArgs.push_back("--strip-all");
9628
9629 CmdArgs.push_back("-m");
9630 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009631 default:
9632 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009633 case llvm::Triple::arm:
9634 case llvm::Triple::thumb:
9635 // FIXME: this is incorrect for WinCE
9636 CmdArgs.push_back("thumb2pe");
9637 break;
9638 case llvm::Triple::x86:
9639 CmdArgs.push_back("i386pe");
9640 EntryPoint.append("_");
9641 break;
9642 case llvm::Triple::x86_64:
9643 CmdArgs.push_back("i386pep");
9644 break;
9645 }
9646
9647 if (Args.hasArg(options::OPT_shared)) {
9648 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009649 default:
9650 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009651 case llvm::Triple::arm:
9652 case llvm::Triple::thumb:
9653 case llvm::Triple::x86_64:
9654 EntryPoint.append("_DllMainCRTStartup");
9655 break;
9656 case llvm::Triple::x86:
9657 EntryPoint.append("_DllMainCRTStartup@12");
9658 break;
9659 }
9660
9661 CmdArgs.push_back("-shared");
9662 CmdArgs.push_back("-Bdynamic");
9663
9664 CmdArgs.push_back("--enable-auto-image-base");
9665
9666 CmdArgs.push_back("--entry");
9667 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9668 } else {
9669 EntryPoint.append("mainCRTStartup");
9670
9671 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9672 : "-Bdynamic");
9673
9674 if (!Args.hasArg(options::OPT_nostdlib) &&
9675 !Args.hasArg(options::OPT_nostartfiles)) {
9676 CmdArgs.push_back("--entry");
9677 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9678 }
9679
9680 // FIXME: handle subsystem
9681 }
9682
9683 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009684 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009685
9686 CmdArgs.push_back("-o");
9687 CmdArgs.push_back(Output.getFilename());
9688
9689 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9690 SmallString<261> ImpLib(Output.getFilename());
9691 llvm::sys::path::replace_extension(ImpLib, ".lib");
9692
9693 CmdArgs.push_back("--out-implib");
9694 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9695 }
9696
9697 if (!Args.hasArg(options::OPT_nostdlib) &&
9698 !Args.hasArg(options::OPT_nostartfiles)) {
9699 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9700 const char *CRTBegin;
9701
9702 CRTBegin =
9703 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9704 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9705 }
9706
9707 Args.AddAllArgs(CmdArgs, options::OPT_L);
9708
9709 const auto &Paths = TC.getFilePaths();
9710 for (const auto &Path : Paths)
9711 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9712
9713 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9714
9715 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9716 !Args.hasArg(options::OPT_nodefaultlibs)) {
9717 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9718 !Args.hasArg(options::OPT_static);
9719 if (StaticCXX)
9720 CmdArgs.push_back("-Bstatic");
9721 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9722 if (StaticCXX)
9723 CmdArgs.push_back("-Bdynamic");
9724 }
9725
9726 if (!Args.hasArg(options::OPT_nostdlib)) {
9727 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9728 // TODO handle /MT[d] /MD[d]
9729 CmdArgs.push_back("-lmsvcrt");
9730 AddRunTimeLibs(TC, D, CmdArgs, Args);
9731 }
9732 }
9733
9734 const std::string Linker = TC.GetProgramPath("ld");
9735 Exec = Args.MakeArgString(Linker);
9736
Justin Bognerd3371d82015-07-17 03:35:54 +00009737 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009738}
Douglas Katzman84a75642015-06-19 14:55:19 +00009739
Douglas Katzman95354292015-06-23 20:42:09 +00009740void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9741 const InputInfo &Output,
9742 const InputInfoList &Inputs,
9743 const ArgList &Args,
9744 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009745
9746 ArgStringList CmdArgs;
9747
9748 assert(Inputs.size() == 1);
9749 const InputInfo &II = Inputs[0];
9750 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9751 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9752
Douglas Katzman84a75642015-06-19 14:55:19 +00009753 CmdArgs.push_back("-DMYRIAD2");
9754 CmdArgs.push_back("-mcpu=myriad2");
9755 CmdArgs.push_back("-S");
9756
Douglas Katzmanf6071112015-08-03 14:34:22 +00009757 // Append all -I, -iquote, -isystem paths, defines/undefines,
9758 // 'f' flags, optimize flags, and warning options.
9759 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +00009760 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
9761 options::OPT_D, options::OPT_U,
9762 options::OPT_f_Group, options::OPT_f_clang_Group,
9763 options::OPT_g_Group, options::OPT_M_Group,
9764 options::OPT_O_Group, options::OPT_W_Group});
9765
9766 // If we're producing a dependency file, and assembly is the final action,
9767 // then the name of the target in the dependency file should be the '.o'
9768 // file, not the '.s' file produced by this step. For example, instead of
9769 // /tmp/mumble.s: mumble.c .../someheader.h
9770 // the filename on the lefthand side should be "mumble.o"
9771 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
9772 C.getActions().size() == 1 &&
9773 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
9774 Arg *A = Args.getLastArg(options::OPT_o);
9775 if (A) {
9776 CmdArgs.push_back("-MT");
9777 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
9778 }
9779 }
9780
Douglas Katzman84a75642015-06-19 14:55:19 +00009781 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9782
9783 CmdArgs.push_back(II.getFilename());
9784 CmdArgs.push_back("-o");
9785 CmdArgs.push_back(Output.getFilename());
9786
9787 std::string Exec =
9788 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009789 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9790 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009791}
9792
Douglas Katzman95354292015-06-23 20:42:09 +00009793void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9794 const InputInfo &Output,
9795 const InputInfoList &Inputs,
9796 const ArgList &Args,
9797 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009798 ArgStringList CmdArgs;
9799
9800 assert(Inputs.size() == 1);
9801 const InputInfo &II = Inputs[0];
9802 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9803 assert(Output.getType() == types::TY_Object);
9804
9805 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009806 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +00009807 CmdArgs.push_back("-noSPrefixing");
9808 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009809 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9810 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
9811 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +00009812 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009813 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +00009814 }
9815 CmdArgs.push_back("-elf"); // Output format.
9816 CmdArgs.push_back(II.getFilename());
9817 CmdArgs.push_back(
9818 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9819
9820 std::string Exec =
9821 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009822 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9823 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009824}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009825
9826void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9827 const InputInfo &Output,
9828 const InputInfoList &Inputs,
9829 const ArgList &Args,
9830 const char *LinkingOutput) const {
9831 const auto &TC =
9832 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
9833 const llvm::Triple &T = TC.getTriple();
9834 ArgStringList CmdArgs;
9835 bool UseStartfiles = !Args.hasArg(options::OPT_nostartfiles);
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009836 bool UseDefaultLibs = !Args.hasArg(options::OPT_nostdlib) &&
9837 !Args.hasArg(options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009838
9839 std::string StartFilesDir, BuiltinLibDir;
9840 TC.getCompilerSupportDir(StartFilesDir);
9841 TC.getBuiltinLibDir(BuiltinLibDir);
9842
9843 if (T.getArch() == llvm::Triple::sparc)
9844 CmdArgs.push_back("-EB");
9845 else // SHAVE assumes little-endian, and sparcel is expressly so.
9846 CmdArgs.push_back("-EL");
9847
9848 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
9849 // but we never pass through a --sysroot option and various other bits.
9850 // For example, there are no sanitizers (yet) nor gold linker.
9851
9852 // Eat some arguments that may be present but have no effect.
9853 Args.ClaimAllArgs(options::OPT_g_Group);
9854 Args.ClaimAllArgs(options::OPT_w);
9855 Args.ClaimAllArgs(options::OPT_static_libgcc);
9856
9857 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
9858 CmdArgs.push_back("-s");
9859
9860 CmdArgs.push_back("-o");
9861 CmdArgs.push_back(Output.getFilename());
9862
9863 if (UseStartfiles) {
9864 // If you want startfiles, it means you want the builtin crti and crtbegin,
9865 // but not crt0. Myriad link commands provide their own crt0.o as needed.
9866 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crti.o"));
9867 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtbegin.o"));
9868 }
9869
9870 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
9871 options::OPT_e, options::OPT_s, options::OPT_t,
9872 options::OPT_Z_Flag, options::OPT_r});
9873
Douglas Katzman526b5f92015-10-21 19:33:54 +00009874 // The linker doesn't use these builtin paths unless directed to,
9875 // because it was not compiled for support with sysroots, nor does
9876 // it have a default of little-endian with FPU.
9877 CmdArgs.push_back(Args.MakeArgString("-L" + BuiltinLibDir));
9878 CmdArgs.push_back(Args.MakeArgString("-L" + StartFilesDir));
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009879
9880 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9881
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009882 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +00009883 if (C.getDriver().CCCIsCXX())
9884 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009885 if (T.getOS() == llvm::Triple::RTEMS) {
9886 CmdArgs.push_back("--start-group");
9887 CmdArgs.push_back("-lc");
9888 // You must provide your own "-L" option to enable finding these.
9889 CmdArgs.push_back("-lrtemscpu");
9890 CmdArgs.push_back("-lrtemsbsp");
9891 CmdArgs.push_back("--end-group");
9892 } else {
9893 CmdArgs.push_back("-lc");
9894 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009895 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009896 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009897 if (UseStartfiles) {
9898 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtend.o"));
9899 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtn.o"));
9900 }
9901
9902 std::string Exec =
9903 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
9904 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9905 CmdArgs, Inputs));
9906}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00009907
9908void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
9909 const InputInfo &Output,
9910 const InputInfoList &Inputs,
9911 const ArgList &Args,
9912 const char *LinkingOutput) const {
9913 claimNoWarnArgs(Args);
9914 ArgStringList CmdArgs;
9915
9916 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9917
9918 CmdArgs.push_back("-o");
9919 CmdArgs.push_back(Output.getFilename());
9920
9921 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
9922 const InputInfo &Input = Inputs[0];
9923 assert(Input.isFilename() && "Invalid input.");
9924 CmdArgs.push_back(Input.getFilename());
9925
9926 const char *Exec =
9927 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
9928 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
9929}
9930
9931static void AddPS4ProfileRT(const ToolChain &TC, const ArgList &Args,
9932 ArgStringList &CmdArgs) {
9933 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
9934 false) ||
9935 Args.hasArg(options::OPT_fprofile_generate) ||
9936 Args.hasArg(options::OPT_fprofile_instr_generate) ||
9937 Args.hasArg(options::OPT_fcreate_profile) ||
9938 Args.hasArg(options::OPT_coverage)))
9939 return;
9940
9941 assert(TC.getTriple().isPS4CPU() &&
9942 "Profiling libraries are only implemented for the PS4 CPU");
9943 CmdArgs.push_back("-lclang_rt.profile-x86_64");
9944}
9945
9946static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
9947 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
9948 if (SanArgs.needsUbsanRt()) {
9949 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
9950 }
9951 if (SanArgs.needsAsanRt()) {
9952 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
9953 }
9954}
9955
9956static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
9957 const JobAction &JA, const InputInfo &Output,
9958 const InputInfoList &Inputs,
9959 const ArgList &Args,
9960 const char *LinkingOutput) {
9961 const toolchains::FreeBSD &ToolChain =
9962 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
9963 const Driver &D = ToolChain.getDriver();
9964 ArgStringList CmdArgs;
9965
9966 // Silence warning for "clang -g foo.o -o foo"
9967 Args.ClaimAllArgs(options::OPT_g_Group);
9968 // and "clang -emit-llvm foo.o -o foo"
9969 Args.ClaimAllArgs(options::OPT_emit_llvm);
9970 // and for "clang -w foo.o -o foo". Other warning options are already
9971 // handled somewhere else.
9972 Args.ClaimAllArgs(options::OPT_w);
9973
9974 if (!D.SysRoot.empty())
9975 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9976
9977 if (Args.hasArg(options::OPT_pie))
9978 CmdArgs.push_back("-pie");
9979
9980 if (Args.hasArg(options::OPT_rdynamic))
9981 CmdArgs.push_back("-export-dynamic");
9982 if (Args.hasArg(options::OPT_shared))
9983 CmdArgs.push_back("--oformat=so");
9984
9985 if (Output.isFilename()) {
9986 CmdArgs.push_back("-o");
9987 CmdArgs.push_back(Output.getFilename());
9988 } else {
9989 assert(Output.isNothing() && "Invalid output.");
9990 }
9991
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +00009992 AddPS4SanitizerArgs(ToolChain, CmdArgs);
9993
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00009994 Args.AddAllArgs(CmdArgs, options::OPT_L);
9995 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
9996 Args.AddAllArgs(CmdArgs, options::OPT_e);
9997 Args.AddAllArgs(CmdArgs, options::OPT_s);
9998 Args.AddAllArgs(CmdArgs, options::OPT_t);
9999 Args.AddAllArgs(CmdArgs, options::OPT_r);
10000
10001 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10002 CmdArgs.push_back("--no-demangle");
10003
10004 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10005
10006 if (Args.hasArg(options::OPT_pthread)) {
10007 CmdArgs.push_back("-lpthread");
10008 }
10009
10010 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010011
10012 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10013
10014 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10015}
10016
10017static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10018 const JobAction &JA, const InputInfo &Output,
10019 const InputInfoList &Inputs,
10020 const ArgList &Args,
10021 const char *LinkingOutput) {
10022 const toolchains::FreeBSD &ToolChain =
10023 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10024 const Driver &D = ToolChain.getDriver();
10025 ArgStringList CmdArgs;
10026
10027 // Silence warning for "clang -g foo.o -o foo"
10028 Args.ClaimAllArgs(options::OPT_g_Group);
10029 // and "clang -emit-llvm foo.o -o foo"
10030 Args.ClaimAllArgs(options::OPT_emit_llvm);
10031 // and for "clang -w foo.o -o foo". Other warning options are already
10032 // handled somewhere else.
10033 Args.ClaimAllArgs(options::OPT_w);
10034
10035 if (!D.SysRoot.empty())
10036 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10037
10038 if (Args.hasArg(options::OPT_pie))
10039 CmdArgs.push_back("-pie");
10040
10041 if (Args.hasArg(options::OPT_static)) {
10042 CmdArgs.push_back("-Bstatic");
10043 } else {
10044 if (Args.hasArg(options::OPT_rdynamic))
10045 CmdArgs.push_back("-export-dynamic");
10046 CmdArgs.push_back("--eh-frame-hdr");
10047 if (Args.hasArg(options::OPT_shared)) {
10048 CmdArgs.push_back("-Bshareable");
10049 } else {
10050 CmdArgs.push_back("-dynamic-linker");
10051 CmdArgs.push_back("/libexec/ld-elf.so.1");
10052 }
10053 CmdArgs.push_back("--enable-new-dtags");
10054 }
10055
10056 if (Output.isFilename()) {
10057 CmdArgs.push_back("-o");
10058 CmdArgs.push_back(Output.getFilename());
10059 } else {
10060 assert(Output.isNothing() && "Invalid output.");
10061 }
10062
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010063 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10064
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010065 if (!Args.hasArg(options::OPT_nostdlib) &&
10066 !Args.hasArg(options::OPT_nostartfiles)) {
10067 const char *crt1 = NULL;
10068 if (!Args.hasArg(options::OPT_shared)) {
10069 if (Args.hasArg(options::OPT_pg))
10070 crt1 = "gcrt1.o";
10071 else if (Args.hasArg(options::OPT_pie))
10072 crt1 = "Scrt1.o";
10073 else
10074 crt1 = "crt1.o";
10075 }
10076 if (crt1)
10077 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10078
10079 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10080
10081 const char *crtbegin = NULL;
10082 if (Args.hasArg(options::OPT_static))
10083 crtbegin = "crtbeginT.o";
10084 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10085 crtbegin = "crtbeginS.o";
10086 else
10087 crtbegin = "crtbegin.o";
10088
10089 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10090 }
10091
10092 Args.AddAllArgs(CmdArgs, options::OPT_L);
10093
10094 const ToolChain::path_list Paths = ToolChain.getFilePaths();
10095 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
10096 i != e; ++i)
10097 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
10098
10099 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10100 Args.AddAllArgs(CmdArgs, options::OPT_e);
10101 Args.AddAllArgs(CmdArgs, options::OPT_s);
10102 Args.AddAllArgs(CmdArgs, options::OPT_t);
10103 Args.AddAllArgs(CmdArgs, options::OPT_r);
10104
10105 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10106 CmdArgs.push_back("--no-demangle");
10107
10108 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10109
10110 if (!Args.hasArg(options::OPT_nostdlib) &&
10111 !Args.hasArg(options::OPT_nodefaultlibs)) {
10112 // For PS4, we always want to pass libm, libstdc++ and libkernel
10113 // libraries for both C and C++ compilations.
10114 CmdArgs.push_back("-lkernel");
10115 if (D.CCCIsCXX()) {
10116 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10117 if (Args.hasArg(options::OPT_pg))
10118 CmdArgs.push_back("-lm_p");
10119 else
10120 CmdArgs.push_back("-lm");
10121 }
10122 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10123 // the default system libraries. Just mimic this for now.
10124 if (Args.hasArg(options::OPT_pg))
10125 CmdArgs.push_back("-lgcc_p");
10126 else
10127 CmdArgs.push_back("-lcompiler_rt");
10128 if (Args.hasArg(options::OPT_static)) {
10129 CmdArgs.push_back("-lstdc++");
10130 } else if (Args.hasArg(options::OPT_pg)) {
10131 CmdArgs.push_back("-lgcc_eh_p");
10132 } else {
10133 CmdArgs.push_back("--as-needed");
10134 CmdArgs.push_back("-lstdc++");
10135 CmdArgs.push_back("--no-as-needed");
10136 }
10137
10138 if (Args.hasArg(options::OPT_pthread)) {
10139 if (Args.hasArg(options::OPT_pg))
10140 CmdArgs.push_back("-lpthread_p");
10141 else
10142 CmdArgs.push_back("-lpthread");
10143 }
10144
10145 if (Args.hasArg(options::OPT_pg)) {
10146 if (Args.hasArg(options::OPT_shared))
10147 CmdArgs.push_back("-lc");
10148 else {
10149 if (Args.hasArg(options::OPT_static)) {
10150 CmdArgs.push_back("--start-group");
10151 CmdArgs.push_back("-lc_p");
10152 CmdArgs.push_back("-lpthread_p");
10153 CmdArgs.push_back("--end-group");
10154 } else {
10155 CmdArgs.push_back("-lc_p");
10156 }
10157 }
10158 CmdArgs.push_back("-lgcc_p");
10159 } else {
10160 if (Args.hasArg(options::OPT_static)) {
10161 CmdArgs.push_back("--start-group");
10162 CmdArgs.push_back("-lc");
10163 CmdArgs.push_back("-lpthread");
10164 CmdArgs.push_back("--end-group");
10165 } else {
10166 CmdArgs.push_back("-lc");
10167 }
10168 CmdArgs.push_back("-lcompiler_rt");
10169 }
10170
10171 if (Args.hasArg(options::OPT_static)) {
10172 CmdArgs.push_back("-lstdc++");
10173 } else if (Args.hasArg(options::OPT_pg)) {
10174 CmdArgs.push_back("-lgcc_eh_p");
10175 } else {
10176 CmdArgs.push_back("--as-needed");
10177 CmdArgs.push_back("-lstdc++");
10178 CmdArgs.push_back("--no-as-needed");
10179 }
10180 }
10181
10182 if (!Args.hasArg(options::OPT_nostdlib) &&
10183 !Args.hasArg(options::OPT_nostartfiles)) {
10184 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10185 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10186 else
10187 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10188 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10189 }
10190
10191 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010192
10193 const char *Exec =
10194#ifdef LLVM_ON_WIN32
10195 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold.exe"));
10196#else
10197 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10198#endif
10199
10200 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10201}
10202
10203void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10204 const InputInfo &Output,
10205 const InputInfoList &Inputs,
10206 const ArgList &Args,
10207 const char *LinkingOutput) const {
10208 const toolchains::FreeBSD &ToolChain =
10209 static_cast<const toolchains::FreeBSD &>(getToolChain());
10210 const Driver &D = ToolChain.getDriver();
10211 bool PS4Linker;
10212 StringRef LinkerOptName;
10213 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10214 LinkerOptName = A->getValue();
10215 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10216 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10217 }
10218
10219 if (LinkerOptName == "gold")
10220 PS4Linker = false;
10221 else if (LinkerOptName == "ps4")
10222 PS4Linker = true;
10223 else
10224 PS4Linker = !Args.hasArg(options::OPT_shared);
10225
10226 if (PS4Linker)
10227 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10228 else
10229 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10230}