blob: f20e5cd8ef8bec8a9c7674de3e7148285c779d25 [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()) {
837 if (VersionNum < 6)
838 Features.push_back("+strict-align");
839 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
840 if (VersionNum < 7)
841 Features.push_back("+strict-align");
842 } else
843 Features.push_back("+strict-align");
844 }
845
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000846 // llvm does not support reserving registers in general. There is support
847 // for reserving r9 on ARM though (defined as a platform-specific register
848 // in ARM EABI).
849 if (Args.hasArg(options::OPT_ffixed_r9))
850 Features.push_back("+reserve-r9");
851
Akira Hatanaka580efb22015-07-16 00:43:00 +0000852 // The kext linker doesn't know how to deal with movw/movt.
853 if (KernelOrKext)
854 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000855}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000856
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000857void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
858 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000859 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000860 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000861 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000862 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000863 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000864 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000865 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000866 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000867 ABIName = "aapcs";
868 } else {
869 ABIName = "apcs-gnu";
870 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000871 } else if (Triple.isOSWindows()) {
872 // FIXME: this is invalid for WindowsCE
873 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000874 } else {
875 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000876 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000877 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000878 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000879 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000880 ABIName = "aapcs-linux";
881 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000882 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000883 case llvm::Triple::EABI:
884 ABIName = "aapcs";
885 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000886 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000887 if (Triple.getOS() == llvm::Triple::NetBSD)
888 ABIName = "apcs-gnu";
889 else
890 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000891 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000892 }
893 }
894 CmdArgs.push_back("-target-abi");
895 CmdArgs.push_back(ABIName);
896
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000897 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000898 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000899 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000900 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000901 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000902 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000903 CmdArgs.push_back("-mfloat-abi");
904 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000905 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000906 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000907 CmdArgs.push_back("-mfloat-abi");
908 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000909 } else {
910 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000911 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000912 CmdArgs.push_back("-mfloat-abi");
913 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000914 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000915
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000916 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000917 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
918 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000919 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000920 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000921 CmdArgs.push_back("-arm-global-merge=false");
922 else
923 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000924 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000925
Bob Wilson9c8af452013-04-11 18:53:25 +0000926 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000927 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000928 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000929}
Renato Goline17c5802015-07-27 23:44:42 +0000930// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000931
Tim Northover573cbee2014-05-24 12:52:07 +0000932/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
933/// targeting.
934static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000935 Arg *A;
936 std::string CPU;
937 // If we have -mtune or -mcpu, use that.
938 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +0000939 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +0000940 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000941 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +0000942 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +0000943 }
944
Kevin Qin110db6f2014-07-18 07:03:22 +0000945 // Handle CPU name is 'native'.
946 if (CPU == "native")
947 return llvm::sys::getHostCPUName();
948 else if (CPU.size())
949 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000950
James Molloy9b1586b2014-04-17 12:51:17 +0000951 // Make sure we pick "cyclone" if -arch is used.
952 // FIXME: Should this be picked by checking the target triple instead?
953 if (Args.getLastArg(options::OPT_arch))
954 return "cyclone";
955
956 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000957}
958
Tim Northover573cbee2014-05-24 12:52:07 +0000959void Clang::AddAArch64TargetArgs(const ArgList &Args,
960 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000961 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
962 llvm::Triple Triple(TripleStr);
963
964 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
965 Args.hasArg(options::OPT_mkernel) ||
966 Args.hasArg(options::OPT_fapple_kext))
967 CmdArgs.push_back("-disable-red-zone");
968
969 if (!Args.hasFlag(options::OPT_mimplicit_float,
970 options::OPT_mno_implicit_float, true))
971 CmdArgs.push_back("-no-implicit-float");
972
Craig Topper92fc2df2014-05-17 16:56:41 +0000973 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000974 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
975 ABIName = A->getValue();
976 else if (Triple.isOSDarwin())
977 ABIName = "darwinpcs";
978 else
979 ABIName = "aapcs";
980
981 CmdArgs.push_back("-target-abi");
982 CmdArgs.push_back(ABIName);
983
Bradley Smith9ff64332014-10-13 10:16:06 +0000984 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
985 options::OPT_mno_fix_cortex_a53_835769)) {
986 CmdArgs.push_back("-backend-option");
987 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
988 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
989 else
990 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000991 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
992 // Enabled A53 errata (835769) workaround by default on android
993 CmdArgs.push_back("-backend-option");
994 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000995 }
996
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000997 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000998 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
999 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001000 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001001 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001002 CmdArgs.push_back("-aarch64-global-merge=false");
1003 else
1004 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001005 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001006}
1007
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001008// Get CPU and ABI names. They are not independent
1009// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001010void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1011 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001012 const char *DefMips32CPU = "mips32r2";
1013 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001014
Daniel Sanders2bf13662014-07-10 14:40:57 +00001015 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1016 // default for mips64(el)?-img-linux-gnu.
1017 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1018 Triple.getEnvironment() == llvm::Triple::GNU) {
1019 DefMips32CPU = "mips32r6";
1020 DefMips64CPU = "mips64r6";
1021 }
Renato Golin7c542b42015-07-27 23:44:45 +00001022
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001023 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
1024 if (Triple.getEnvironment() == llvm::Triple::Android)
1025 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001026
Brad Smithba26f582015-01-06 02:53:17 +00001027 // MIPS3 is the default for mips64*-unknown-openbsd.
1028 if (Triple.getOS() == llvm::Triple::OpenBSD)
1029 DefMips64CPU = "mips3";
1030
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001031 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001032 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001033
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001034 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001035 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001036 // Convert a GNU style Mips ABI name to the name
1037 // accepted by LLVM Mips backend.
1038 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001039 .Case("32", "o32")
1040 .Case("64", "n64")
1041 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001042 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001043
1044 // Setup default CPU and ABI names.
1045 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001046 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001047 default:
1048 llvm_unreachable("Unexpected triple arch name");
1049 case llvm::Triple::mips:
1050 case llvm::Triple::mipsel:
1051 CPUName = DefMips32CPU;
1052 break;
1053 case llvm::Triple::mips64:
1054 case llvm::Triple::mips64el:
1055 CPUName = DefMips64CPU;
1056 break;
1057 }
1058 }
1059
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001060 if (ABIName.empty()) {
1061 // Deduce ABI name from the target triple.
1062 if (Triple.getArch() == llvm::Triple::mips ||
1063 Triple.getArch() == llvm::Triple::mipsel)
1064 ABIName = "o32";
1065 else
1066 ABIName = "n64";
1067 }
1068
1069 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001070 // Deduce CPU name from ABI name.
1071 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001072 .Cases("o32", "eabi", DefMips32CPU)
1073 .Cases("n32", "n64", DefMips64CPU)
1074 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001075 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001076
1077 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001078}
1079
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001080// Convert ABI name to the GNU tools acceptable variant.
1081static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1082 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001083 .Case("o32", "32")
1084 .Case("n64", "64")
1085 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001086}
1087
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001088// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1089// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001090static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1091 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001092 if (Arg *A =
1093 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1094 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001095 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001096 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001097 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001098 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001099 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001100 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1101 .Case("soft", mips::FloatABI::Soft)
1102 .Case("hard", mips::FloatABI::Hard)
1103 .Default(mips::FloatABI::Invalid);
1104 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001105 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001106 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001107 }
1108 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001109 }
1110
1111 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001112 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001113 // Assume "hard", because it's a default value used by gcc.
1114 // When we start to recognize specific target MIPS processors,
1115 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001116 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001117 }
1118
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001119 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1120 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001121}
1122
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001123static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001124 std::vector<const char *> &Features,
1125 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001126 StringRef FeatureName) {
1127 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001128 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001129 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001130 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001131 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001132 }
1133}
1134
Daniel Sanders379d44b2014-07-16 11:52:23 +00001135static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1136 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001137 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001138 StringRef CPUName;
1139 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001140 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001141 ABIName = getGnuCompatibleMipsABIName(ABIName);
1142
Daniel Sandersfeb61302014-08-08 15:47:17 +00001143 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1144 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001145
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001146 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1147 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001148 // FIXME: Note, this is a hack. We need to pass the selected float
1149 // mode to the MipsTargetInfoBase to define appropriate macros there.
1150 // Now it is the only method.
1151 Features.push_back("+soft-float");
1152 }
1153
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001154 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001155 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001156 if (Val == "2008") {
1157 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1158 Features.push_back("+nan2008");
1159 else {
1160 Features.push_back("-nan2008");
1161 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1162 }
1163 } else if (Val == "legacy") {
1164 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1165 Features.push_back("-nan2008");
1166 else {
1167 Features.push_back("+nan2008");
1168 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1169 }
1170 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001171 D.Diag(diag::err_drv_unsupported_option_argument)
1172 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001173 }
1174
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001175 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1176 options::OPT_mdouble_float, "single-float");
1177 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1178 "mips16");
1179 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1180 options::OPT_mno_micromips, "micromips");
1181 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1182 "dsp");
1183 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1184 "dspr2");
1185 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1186 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001187
1188 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1189 // pass -mfpxx
1190 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1191 options::OPT_mfp64)) {
1192 if (A->getOption().matches(options::OPT_mfp32))
1193 Features.push_back(Args.MakeArgString("-fp64"));
1194 else if (A->getOption().matches(options::OPT_mfpxx)) {
1195 Features.push_back(Args.MakeArgString("+fpxx"));
1196 Features.push_back(Args.MakeArgString("+nooddspreg"));
1197 } else
1198 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001199 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001200 Features.push_back(Args.MakeArgString("+fpxx"));
1201 Features.push_back(Args.MakeArgString("+nooddspreg"));
1202 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001203
Daniel Sanders28e5d392014-07-10 10:39:51 +00001204 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1205 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001206}
1207
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001208void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001209 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001210 const Driver &D = getToolChain().getDriver();
1211 StringRef CPUName;
1212 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001213 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001214 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001215
1216 CmdArgs.push_back("-target-abi");
1217 CmdArgs.push_back(ABIName.data());
1218
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001219 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1220 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001221 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001222 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001223 CmdArgs.push_back("-mfloat-abi");
1224 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001225 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001226 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001227 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001228 CmdArgs.push_back("-mfloat-abi");
1229 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001230 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001231
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001232 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1233 if (A->getOption().matches(options::OPT_mxgot)) {
1234 CmdArgs.push_back("-mllvm");
1235 CmdArgs.push_back("-mxgot");
1236 }
1237 }
1238
Simon Atanasyanc580b322013-05-11 06:33:44 +00001239 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1240 options::OPT_mno_ldc1_sdc1)) {
1241 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1242 CmdArgs.push_back("-mllvm");
1243 CmdArgs.push_back("-mno-ldc1-sdc1");
1244 }
1245 }
1246
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001247 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1248 options::OPT_mno_check_zero_division)) {
1249 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1250 CmdArgs.push_back("-mllvm");
1251 CmdArgs.push_back("-mno-check-zero-division");
1252 }
1253 }
1254
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001255 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001256 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001257 CmdArgs.push_back("-mllvm");
1258 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1259 A->claim();
1260 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001261}
1262
Hal Finkel8eb59282012-06-11 22:35:19 +00001263/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1264static std::string getPPCTargetCPU(const ArgList &Args) {
1265 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001266 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001267
1268 if (CPUName == "native") {
1269 std::string CPU = llvm::sys::getHostCPUName();
1270 if (!CPU.empty() && CPU != "generic")
1271 return CPU;
1272 else
1273 return "";
1274 }
1275
1276 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001277 .Case("common", "generic")
1278 .Case("440", "440")
1279 .Case("440fp", "440")
1280 .Case("450", "450")
1281 .Case("601", "601")
1282 .Case("602", "602")
1283 .Case("603", "603")
1284 .Case("603e", "603e")
1285 .Case("603ev", "603ev")
1286 .Case("604", "604")
1287 .Case("604e", "604e")
1288 .Case("620", "620")
1289 .Case("630", "pwr3")
1290 .Case("G3", "g3")
1291 .Case("7400", "7400")
1292 .Case("G4", "g4")
1293 .Case("7450", "7450")
1294 .Case("G4+", "g4+")
1295 .Case("750", "750")
1296 .Case("970", "970")
1297 .Case("G5", "g5")
1298 .Case("a2", "a2")
1299 .Case("a2q", "a2q")
1300 .Case("e500mc", "e500mc")
1301 .Case("e5500", "e5500")
1302 .Case("power3", "pwr3")
1303 .Case("power4", "pwr4")
1304 .Case("power5", "pwr5")
1305 .Case("power5x", "pwr5x")
1306 .Case("power6", "pwr6")
1307 .Case("power6x", "pwr6x")
1308 .Case("power7", "pwr7")
1309 .Case("power8", "pwr8")
1310 .Case("pwr3", "pwr3")
1311 .Case("pwr4", "pwr4")
1312 .Case("pwr5", "pwr5")
1313 .Case("pwr5x", "pwr5x")
1314 .Case("pwr6", "pwr6")
1315 .Case("pwr6x", "pwr6x")
1316 .Case("pwr7", "pwr7")
1317 .Case("pwr8", "pwr8")
1318 .Case("powerpc", "ppc")
1319 .Case("powerpc64", "ppc64")
1320 .Case("powerpc64le", "ppc64le")
1321 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001322 }
1323
1324 return "";
1325}
1326
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001327static void getPPCTargetFeatures(const ArgList &Args,
1328 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001329 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1330 StringRef Name = A->getOption().getName();
1331 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001332
1333 // Skip over "-m".
1334 assert(Name.startswith("m") && "Invalid feature name.");
1335 Name = Name.substr(1);
1336
1337 bool IsNegative = Name.startswith("no-");
1338 if (IsNegative)
1339 Name = Name.substr(3);
1340
1341 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1342 // pass the correct option to the backend while calling the frontend
1343 // option the same.
1344 // TODO: Change the LLVM backend option maybe?
1345 if (Name == "mfcrf")
1346 Name = "mfocrf";
1347
1348 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1349 }
1350
1351 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001352 AddTargetFeature(Args, Features, options::OPT_faltivec,
1353 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001354}
1355
Ulrich Weigand8afad612014-07-28 13:17:52 +00001356void Clang::AddPPCTargetArgs(const ArgList &Args,
1357 ArgStringList &CmdArgs) const {
1358 // Select the ABI to use.
1359 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001360 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001361 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001362 case llvm::Triple::ppc64: {
1363 // When targeting a processor that supports QPX, or if QPX is
1364 // specifically enabled, default to using the ABI that supports QPX (so
1365 // long as it is not specifically disabled).
1366 bool HasQPX = false;
1367 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1368 HasQPX = A->getValue() == StringRef("a2q");
1369 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1370 if (HasQPX) {
1371 ABIName = "elfv1-qpx";
1372 break;
1373 }
1374
Ulrich Weigand8afad612014-07-28 13:17:52 +00001375 ABIName = "elfv1";
1376 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001377 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001378 case llvm::Triple::ppc64le:
1379 ABIName = "elfv2";
1380 break;
1381 default:
1382 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001383 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001384
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001385 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1386 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1387 // the option if given as we don't have backend support for any targets
1388 // that don't use the altivec abi.
1389 if (StringRef(A->getValue()) != "altivec")
1390 ABIName = A->getValue();
1391
Ulrich Weigand8afad612014-07-28 13:17:52 +00001392 if (ABIName) {
1393 CmdArgs.push_back("-target-abi");
1394 CmdArgs.push_back(ABIName);
1395 }
1396}
1397
1398bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1399 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1400 return A && (A->getValue() == StringRef(Value));
1401}
1402
Tom Stellard6674c702013-04-01 20:56:53 +00001403/// Get the (LLVM) name of the R600 gpu we are targeting.
1404static std::string getR600TargetGPU(const ArgList &Args) {
1405 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001406 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001407 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001408 .Cases("rv630", "rv635", "r600")
1409 .Cases("rv610", "rv620", "rs780", "rs880")
1410 .Case("rv740", "rv770")
1411 .Case("palm", "cedar")
1412 .Cases("sumo", "sumo2", "sumo")
1413 .Case("hemlock", "cypress")
1414 .Case("aruba", "cayman")
1415 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001416 }
1417 return "";
1418}
1419
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001420void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001421 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001422 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001423 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001424
James Y Knightb2406522015-06-15 20:51:24 +00001425 bool SoftFloatABI = false;
1426 if (Arg *A =
1427 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001428 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001429 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001430 }
1431
James Y Knightb2406522015-06-15 20:51:24 +00001432 // Only the hard-float ABI on Sparc is standardized, and it is the
1433 // default. GCC also supports a nonstandard soft-float ABI mode, and
1434 // perhaps LLVM should implement that, too. However, since llvm
1435 // currently does not support Sparc soft-float, at all, display an
1436 // error if it's requested.
1437 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001438 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1439 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001440 }
1441}
1442
Richard Sandiford4652d892013-07-19 16:51:51 +00001443static const char *getSystemZTargetCPU(const ArgList &Args) {
1444 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1445 return A->getValue();
1446 return "z10";
1447}
1448
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001449static void getSystemZTargetFeatures(const ArgList &Args,
1450 std::vector<const char *> &Features) {
1451 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001452 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001453 if (A->getOption().matches(options::OPT_mhtm))
1454 Features.push_back("+transactional-execution");
1455 else
1456 Features.push_back("-transactional-execution");
1457 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001458 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001459 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001460 if (A->getOption().matches(options::OPT_mvx))
1461 Features.push_back("+vector");
1462 else
1463 Features.push_back("-vector");
1464 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001465}
1466
Chandler Carruth953fb082013-01-13 11:46:33 +00001467static const char *getX86TargetCPU(const ArgList &Args,
1468 const llvm::Triple &Triple) {
1469 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001470 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001471 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001472 return "core-avx2";
1473
Chandler Carruth953fb082013-01-13 11:46:33 +00001474 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001475 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001476
1477 // FIXME: Reject attempts to use -march=native unless the target matches
1478 // the host.
1479 //
1480 // FIXME: We should also incorporate the detected target features for use
1481 // with -native.
1482 std::string CPU = llvm::sys::getHostCPUName();
1483 if (!CPU.empty() && CPU != "generic")
1484 return Args.MakeArgString(CPU);
1485 }
1486
Reid Kleckner3123eff2015-06-30 16:32:04 +00001487 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1488 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1489 StringRef Arch = A->getValue();
1490 const char *CPU;
1491 if (Triple.getArch() == llvm::Triple::x86) {
1492 CPU = llvm::StringSwitch<const char *>(Arch)
1493 .Case("IA32", "i386")
1494 .Case("SSE", "pentium3")
1495 .Case("SSE2", "pentium4")
1496 .Case("AVX", "sandybridge")
1497 .Case("AVX2", "haswell")
1498 .Default(nullptr);
1499 } else {
1500 CPU = llvm::StringSwitch<const char *>(Arch)
1501 .Case("AVX", "sandybridge")
1502 .Case("AVX2", "haswell")
1503 .Default(nullptr);
1504 }
1505 if (CPU)
1506 return CPU;
1507 }
1508
Chandler Carruth953fb082013-01-13 11:46:33 +00001509 // Select the default CPU if none was given (or detection failed).
1510
1511 if (Triple.getArch() != llvm::Triple::x86_64 &&
1512 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001513 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001514
1515 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1516
1517 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001518 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001519 if (Triple.getArchName() == "x86_64h")
1520 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001521 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001522 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001523
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001524 // Set up default CPU name for PS4 compilers.
1525 if (Triple.isPS4CPU())
1526 return "btver2";
1527
Alexey Bataev286d1b92014-01-31 04:07:13 +00001528 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001529 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001530 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001531
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001532 // Everything else goes to x86-64 in 64-bit mode.
1533 if (Is64Bit)
1534 return "x86-64";
1535
1536 switch (Triple.getOS()) {
1537 case llvm::Triple::FreeBSD:
1538 case llvm::Triple::NetBSD:
1539 case llvm::Triple::OpenBSD:
1540 return "i486";
1541 case llvm::Triple::Haiku:
1542 return "i586";
1543 case llvm::Triple::Bitrig:
1544 return "i686";
1545 default:
1546 // Fallback to p4.
1547 return "pentium4";
1548 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001549}
1550
Dan Gohmanc2853072015-09-03 22:51:53 +00001551/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1552static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1553 // If we have -mcpu=, use that.
1554 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1555 StringRef CPU = A->getValue();
1556
1557#ifdef __wasm__
1558 // Handle "native" by examining the host. "native" isn't meaningful when
1559 // cross compiling, so only support this when the host is also WebAssembly.
1560 if (CPU == "native")
1561 return llvm::sys::getHostCPUName();
1562#endif
1563
1564 return CPU;
1565 }
1566
1567 return "generic";
1568}
1569
Renato Golin7c542b42015-07-27 23:44:45 +00001570static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1571 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001572 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001573 default:
1574 return "";
1575
Amara Emerson703da2e2013-10-31 09:32:33 +00001576 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001577 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001578 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001579
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001580 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001581 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001582 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001583 case llvm::Triple::thumbeb: {
1584 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001585 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001586 return arm::getARMTargetCPU(MCPU, MArch, T);
1587 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001588 case llvm::Triple::mips:
1589 case llvm::Triple::mipsel:
1590 case llvm::Triple::mips64:
1591 case llvm::Triple::mips64el: {
1592 StringRef CPUName;
1593 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001594 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001595 return CPUName;
1596 }
1597
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001598 case llvm::Triple::nvptx:
1599 case llvm::Triple::nvptx64:
1600 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1601 return A->getValue();
1602 return "";
1603
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001604 case llvm::Triple::ppc:
1605 case llvm::Triple::ppc64:
1606 case llvm::Triple::ppc64le: {
1607 std::string TargetCPUName = getPPCTargetCPU(Args);
1608 // LLVM may default to generating code for the native CPU,
1609 // but, like gcc, we default to a more generic option for
1610 // each architecture. (except on Darwin)
1611 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1612 if (T.getArch() == llvm::Triple::ppc64)
1613 TargetCPUName = "ppc64";
1614 else if (T.getArch() == llvm::Triple::ppc64le)
1615 TargetCPUName = "ppc64le";
1616 else
1617 TargetCPUName = "ppc";
1618 }
1619 return TargetCPUName;
1620 }
1621
1622 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001623 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001624 case llvm::Triple::sparcv9:
1625 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001626 return A->getValue();
1627 return "";
1628
1629 case llvm::Triple::x86:
1630 case llvm::Triple::x86_64:
1631 return getX86TargetCPU(Args, T);
1632
1633 case llvm::Triple::hexagon:
Douglas Katzman54366072015-07-27 16:53:08 +00001634 return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001635
1636 case llvm::Triple::systemz:
1637 return getSystemZTargetCPU(Args);
1638
1639 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001640 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001641 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001642
1643 case llvm::Triple::wasm32:
1644 case llvm::Triple::wasm64:
1645 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001646 }
1647}
1648
Alp Tokerce365ca2013-12-02 12:43:03 +00001649static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1650 ArgStringList &CmdArgs) {
1651 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1652 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1653 // forward.
1654 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001655 std::string Plugin =
1656 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001657 CmdArgs.push_back(Args.MakeArgString(Plugin));
1658
1659 // Try to pass driver level flags relevant to LTO code generation down to
1660 // the plugin.
1661
1662 // Handle flags for selecting CPU variants.
1663 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1664 if (!CPU.empty())
1665 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1666}
1667
Sanjay Patel2987c292015-06-11 14:53:41 +00001668/// This is a helper function for validating the optional refinement step
1669/// parameter in reciprocal argument strings. Return false if there is an error
1670/// parsing the refinement step. Otherwise, return true and set the Position
1671/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001672static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001673 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001674 const char RefinementStepToken = ':';
1675 Position = In.find(RefinementStepToken);
1676 if (Position != StringRef::npos) {
1677 StringRef Option = A.getOption().getName();
1678 StringRef RefStep = In.substr(Position + 1);
1679 // Allow exactly one numeric character for the additional refinement
1680 // step parameter. This is reasonable for all currently-supported
1681 // operations and architectures because we would expect that a larger value
1682 // of refinement steps would cause the estimate "optimization" to
1683 // under-perform the native operation. Also, if the estimate does not
1684 // converge quickly, it probably will not ever converge, so further
1685 // refinement steps will not produce a better answer.
1686 if (RefStep.size() != 1) {
1687 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1688 return false;
1689 }
1690 char RefStepChar = RefStep[0];
1691 if (RefStepChar < '0' || RefStepChar > '9') {
1692 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1693 return false;
1694 }
1695 }
1696 return true;
1697}
1698
1699/// The -mrecip flag requires processing of many optional parameters.
1700static void ParseMRecip(const Driver &D, const ArgList &Args,
1701 ArgStringList &OutStrings) {
1702 StringRef DisabledPrefixIn = "!";
1703 StringRef DisabledPrefixOut = "!";
1704 StringRef EnabledPrefixOut = "";
1705 StringRef Out = "-mrecip=";
1706
1707 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1708 if (!A)
1709 return;
1710
1711 unsigned NumOptions = A->getNumValues();
1712 if (NumOptions == 0) {
1713 // No option is the same as "all".
1714 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1715 return;
1716 }
1717
1718 // Pass through "all", "none", or "default" with an optional refinement step.
1719 if (NumOptions == 1) {
1720 StringRef Val = A->getValue(0);
1721 size_t RefStepLoc;
1722 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1723 return;
1724 StringRef ValBase = Val.slice(0, RefStepLoc);
1725 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1726 OutStrings.push_back(Args.MakeArgString(Out + Val));
1727 return;
1728 }
1729 }
1730
1731 // Each reciprocal type may be enabled or disabled individually.
1732 // Check each input value for validity, concatenate them all back together,
1733 // and pass through.
1734
1735 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001736 OptionStrings.insert(std::make_pair("divd", false));
1737 OptionStrings.insert(std::make_pair("divf", false));
1738 OptionStrings.insert(std::make_pair("vec-divd", false));
1739 OptionStrings.insert(std::make_pair("vec-divf", false));
1740 OptionStrings.insert(std::make_pair("sqrtd", false));
1741 OptionStrings.insert(std::make_pair("sqrtf", false));
1742 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1743 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001744
1745 for (unsigned i = 0; i != NumOptions; ++i) {
1746 StringRef Val = A->getValue(i);
1747
1748 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1749 // Ignore the disablement token for string matching.
1750 if (IsDisabled)
1751 Val = Val.substr(1);
1752
1753 size_t RefStep;
1754 if (!getRefinementStep(Val, D, *A, RefStep))
1755 return;
1756
1757 StringRef ValBase = Val.slice(0, RefStep);
1758 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1759 if (OptionIter == OptionStrings.end()) {
1760 // Try again specifying float suffix.
1761 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1762 if (OptionIter == OptionStrings.end()) {
1763 // The input name did not match any known option string.
1764 D.Diag(diag::err_drv_unknown_argument) << Val;
1765 return;
1766 }
1767 // The option was specified without a float or double suffix.
1768 // Make sure that the double entry was not already specified.
1769 // The float entry will be checked below.
1770 if (OptionStrings[ValBase.str() + 'd']) {
1771 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1772 return;
1773 }
1774 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001775
Sanjay Patel2987c292015-06-11 14:53:41 +00001776 if (OptionIter->second == true) {
1777 // Duplicate option specified.
1778 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1779 return;
1780 }
1781
1782 // Mark the matched option as found. Do not allow duplicate specifiers.
1783 OptionIter->second = true;
1784
1785 // If the precision was not specified, also mark the double entry as found.
1786 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1787 OptionStrings[ValBase.str() + 'd'] = true;
1788
1789 // Build the output string.
1790 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1791 Out = Args.MakeArgString(Out + Prefix + Val);
1792 if (i != NumOptions - 1)
1793 Out = Args.MakeArgString(Out + ",");
1794 }
1795
1796 OutStrings.push_back(Args.MakeArgString(Out));
1797}
1798
Eric Christopherc54920a2015-03-23 19:26:05 +00001799static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001800 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001801 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001802 // If -march=native, autodetect the feature list.
1803 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1804 if (StringRef(A->getValue()) == "native") {
1805 llvm::StringMap<bool> HostFeatures;
1806 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1807 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001808 Features.push_back(
1809 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001810 }
1811 }
1812
Jim Grosbach82eee262013-11-16 00:53:35 +00001813 if (Triple.getArchName() == "x86_64h") {
1814 // x86_64h implies quite a few of the more modern subtarget features
1815 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1816 Features.push_back("-rdrnd");
1817 Features.push_back("-aes");
1818 Features.push_back("-pclmul");
1819 Features.push_back("-rtm");
1820 Features.push_back("-hle");
1821 Features.push_back("-fsgsbase");
1822 }
1823
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001824 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001825 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001826 if (Triple.getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001827 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001828 Features.push_back("+sse4.2");
1829 Features.push_back("+popcnt");
1830 } else
1831 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001832 }
1833
Eric Christopherc54920a2015-03-23 19:26:05 +00001834 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001835 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1836 StringRef Arch = A->getValue();
1837 bool ArchUsed = false;
1838 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001839 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001840 if (Arch == "AVX" || Arch == "AVX2") {
1841 ArchUsed = true;
1842 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1843 }
1844 }
1845 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001846 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001847 if (Arch == "IA32") {
1848 ArchUsed = true;
1849 } else if (Arch == "SSE" || Arch == "SSE2") {
1850 ArchUsed = true;
1851 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1852 }
1853 }
1854 if (!ArchUsed)
1855 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1856 }
1857
Jim Grosbach82eee262013-11-16 00:53:35 +00001858 // Now add any that the user explicitly requested on the command line,
1859 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001860 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1861 StringRef Name = A->getOption().getName();
1862 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001863
1864 // Skip over "-m".
1865 assert(Name.startswith("m") && "Invalid feature name.");
1866 Name = Name.substr(1);
1867
1868 bool IsNegative = Name.startswith("no-");
1869 if (IsNegative)
1870 Name = Name.substr(3);
1871
1872 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1873 }
1874}
1875
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001876void Clang::AddX86TargetArgs(const ArgList &Args,
1877 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001878 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001879 Args.hasArg(options::OPT_mkernel) ||
1880 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001881 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001882
Bob Wilson2616e2e2013-02-10 16:01:41 +00001883 // Default to avoid implicit floating-point for kernel/kext code, but allow
1884 // that to be overridden with -mno-soft-float.
1885 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1886 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001887 if (Arg *A = Args.getLastArg(
1888 options::OPT_msoft_float, options::OPT_mno_soft_float,
1889 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001890 const Option &O = A->getOption();
1891 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1892 O.matches(options::OPT_msoft_float));
1893 }
1894 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001895 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001896
1897 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1898 StringRef Value = A->getValue();
1899 if (Value == "intel" || Value == "att") {
1900 CmdArgs.push_back("-mllvm");
1901 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1902 } else {
1903 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1904 << A->getOption().getName() << Value;
1905 }
1906 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001907}
1908
Tony Linthicum76329bf2011-12-12 21:14:55 +00001909void Clang::AddHexagonTargetArgs(const ArgList &Args,
1910 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001911 CmdArgs.push_back("-mqdsp6-compat");
1912 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001913
Douglas Katzman54366072015-07-27 16:53:08 +00001914 if (const char *v =
1915 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001916 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001917 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001918 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001919 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001920 }
1921
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001922 if (!Args.hasArg(options::OPT_fno_short_enums))
1923 CmdArgs.push_back("-fshort-enums");
1924 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001925 CmdArgs.push_back("-mllvm");
1926 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001927 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001928 CmdArgs.push_back("-mllvm");
1929 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001930}
1931
Kevin Qin110db6f2014-07-18 07:03:22 +00001932// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001933static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001934 std::vector<const char *> &Features) {
1935 SmallVector<StringRef, 8> Split;
1936 text.split(Split, StringRef("+"), -1, false);
1937
Benjamin Kramer72e64312015-09-24 14:48:49 +00001938 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00001939 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00001940 .Case("fp", "+fp-armv8")
1941 .Case("simd", "+neon")
1942 .Case("crc", "+crc")
1943 .Case("crypto", "+crypto")
1944 .Case("nofp", "-fp-armv8")
1945 .Case("nosimd", "-neon")
1946 .Case("nocrc", "-crc")
1947 .Case("nocrypto", "-crypto")
1948 .Default(nullptr);
1949 if (result)
1950 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00001951 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00001952 D.Diag(diag::err_drv_no_neon_modifier);
1953 else
1954 return false;
1955 }
1956 return true;
1957}
1958
1959// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1960// decode CPU and feature.
1961static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1962 std::vector<const char *> &Features) {
1963 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1964 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001965 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
1966 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001967 Features.push_back("+neon");
1968 Features.push_back("+crc");
1969 Features.push_back("+crypto");
1970 } else if (CPU == "generic") {
1971 Features.push_back("+neon");
1972 } else {
1973 return false;
1974 }
1975
1976 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1977 return false;
1978
1979 return true;
1980}
1981
1982static bool
1983getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1984 const ArgList &Args,
1985 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00001986 std::string MarchLowerCase = March.lower();
1987 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001988
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001989 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001990 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001991 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001992 Features.push_back("+v8.1a");
1993 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001994 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001995 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001996
1997 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1998 return false;
1999
2000 return true;
2001}
2002
2003static bool
2004getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2005 const ArgList &Args,
2006 std::vector<const char *> &Features) {
2007 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002008 std::string McpuLowerCase = Mcpu.lower();
2009 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002010 return false;
2011
2012 return true;
2013}
2014
2015static bool
2016getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2017 const ArgList &Args,
2018 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002019 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002020 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002021 if (MtuneLowerCase == "native")
2022 MtuneLowerCase = llvm::sys::getHostCPUName();
2023 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002024 Features.push_back("+zcm");
2025 Features.push_back("+zcz");
2026 }
2027 return true;
2028}
2029
2030static bool
2031getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2032 const ArgList &Args,
2033 std::vector<const char *> &Features) {
2034 StringRef CPU;
2035 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002036 std::string McpuLowerCase = Mcpu.lower();
2037 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002038 return false;
2039
2040 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2041}
2042
Akira Hatanaka92500472015-07-27 19:29:04 +00002043static void getAArch64TargetFeatures(const Driver &D,
2044 const llvm::Triple &Triple,
2045 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002046 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002047 Arg *A;
2048 bool success = true;
2049 // Enable NEON by default.
2050 Features.push_back("+neon");
2051 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2052 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2053 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2054 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002055 else if (Args.hasArg(options::OPT_arch))
2056 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2057 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002058
2059 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2060 success =
2061 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2062 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2063 success =
2064 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002065 else if (Args.hasArg(options::OPT_arch))
2066 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2067 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002068
2069 if (!success)
2070 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002071
2072 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2073 Features.push_back("-fp-armv8");
2074 Features.push_back("-crypto");
2075 Features.push_back("-neon");
2076 }
Bradley Smith418c5932014-05-02 15:17:51 +00002077
2078 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002079 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002080 if (A->getOption().matches(options::OPT_mcrc))
2081 Features.push_back("+crc");
2082 else
2083 Features.push_back("-crc");
2084 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002085
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002086 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2087 options::OPT_munaligned_access))
2088 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2089 Features.push_back("+strict-align");
2090
Akira Hatanaka92500472015-07-27 19:29:04 +00002091 if (Args.hasArg(options::OPT_ffixed_x18) || Triple.isOSDarwin())
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002092 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002093}
2094
Dan Gohmanc2853072015-09-03 22:51:53 +00002095static void getWebAssemblyTargetFeatures(const ArgList &Args,
2096 std::vector<const char *> &Features) {
2097 for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) {
2098 StringRef Name = A->getOption().getName();
2099 A->claim();
2100
2101 // Skip over "-m".
2102 assert(Name.startswith("m") && "Invalid feature name.");
2103 Name = Name.substr(1);
2104
2105 bool IsNegative = Name.startswith("no-");
2106 if (IsNegative)
2107 Name = Name.substr(3);
2108
2109 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2110 }
2111}
2112
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002113static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002114 const ArgList &Args, ArgStringList &CmdArgs,
2115 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002116 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002117 std::vector<const char *> Features;
2118 switch (Triple.getArch()) {
2119 default:
2120 break;
2121 case llvm::Triple::mips:
2122 case llvm::Triple::mipsel:
2123 case llvm::Triple::mips64:
2124 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002125 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002126 break;
2127
2128 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002129 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002130 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002131 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002132 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002133 break;
2134
2135 case llvm::Triple::ppc:
2136 case llvm::Triple::ppc64:
2137 case llvm::Triple::ppc64le:
2138 getPPCTargetFeatures(Args, Features);
2139 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002140 case llvm::Triple::systemz:
2141 getSystemZTargetFeatures(Args, Features);
2142 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002143 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002144 case llvm::Triple::aarch64_be:
Akira Hatanaka92500472015-07-27 19:29:04 +00002145 getAArch64TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002146 break;
2147 case llvm::Triple::x86:
2148 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002149 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002150 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002151 case llvm::Triple::wasm32:
2152 case llvm::Triple::wasm64:
2153 getWebAssemblyTargetFeatures(Args, Features);
2154 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002155 }
Rafael Espindola43964802013-08-21 17:34:32 +00002156
2157 // Find the last of each feature.
2158 llvm::StringMap<unsigned> LastOpt;
2159 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2160 const char *Name = Features[I];
2161 assert(Name[0] == '-' || Name[0] == '+');
2162 LastOpt[Name + 1] = I;
2163 }
2164
2165 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2166 // If this feature was overridden, ignore it.
2167 const char *Name = Features[I];
2168 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2169 assert(LastI != LastOpt.end());
2170 unsigned Last = LastI->second;
2171 if (Last != I)
2172 continue;
2173
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002174 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002175 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002176 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002177}
2178
David Majnemerae394812014-12-09 00:12:30 +00002179static bool
2180shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2181 const llvm::Triple &Triple) {
2182 // We use the zero-cost exception tables for Objective-C if the non-fragile
2183 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2184 // later.
2185 if (runtime.isNonFragile())
2186 return true;
2187
2188 if (!Triple.isMacOSX())
2189 return false;
2190
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002191 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002192 (Triple.getArch() == llvm::Triple::x86_64 ||
2193 Triple.getArch() == llvm::Triple::arm));
2194}
2195
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002196/// Adds exception related arguments to the driver command arguments. There's a
2197/// master flag, -fexceptions and also language specific flags to enable/disable
2198/// C++ and Objective-C exceptions. This makes it possible to for example
2199/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002200static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002201 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002202 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002203 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002204 const Driver &D = TC.getDriver();
2205 const llvm::Triple &Triple = TC.getTriple();
2206
Chad Rosier4fab82c2012-03-26 22:04:46 +00002207 if (KernelOrKext) {
2208 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2209 // arguments now to avoid warnings about unused arguments.
2210 Args.ClaimAllArgs(options::OPT_fexceptions);
2211 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2212 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2213 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2214 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2215 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002216 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002217 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002218
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002219 // See if the user explicitly enabled exceptions.
2220 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2221 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002222
David Majnemerae394812014-12-09 00:12:30 +00002223 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2224 // is not necessarily sensible, but follows GCC.
2225 if (types::isObjC(InputType) &&
2226 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002227 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002228 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002229
David Majnemerae394812014-12-09 00:12:30 +00002230 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002231 }
2232
2233 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002234 // Disable C++ EH by default on XCore, PS4, and MSVC.
2235 // FIXME: Remove MSVC from this list once things work.
2236 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2237 !Triple.isPS4CPU() &&
2238 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002239 Arg *ExceptionArg = Args.getLastArg(
2240 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2241 options::OPT_fexceptions, options::OPT_fno_exceptions);
2242 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002243 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002244 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2245 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002246
2247 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002248 if (Triple.isPS4CPU()) {
2249 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2250 assert(ExceptionArg &&
2251 "On the PS4 exceptions should only be enabled if passing "
2252 "an argument");
2253 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2254 const Arg *RTTIArg = TC.getRTTIArg();
2255 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2256 D.Diag(diag::err_drv_argument_not_allowed_with)
2257 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2258 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2259 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2260 } else
2261 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2262
Anders Carlssone96ab552011-02-28 02:27:16 +00002263 CmdArgs.push_back("-fcxx-exceptions");
2264
David Majnemer8de68642014-12-05 08:11:58 +00002265 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002266 }
2267 }
2268
David Majnemer8de68642014-12-05 08:11:58 +00002269 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002270 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002271}
2272
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002273static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002274 bool Default = true;
2275 if (TC.getTriple().isOSDarwin()) {
2276 // The native darwin assembler doesn't support the linker_option directives,
2277 // so we disable them if we think the .s file will be passed to it.
2278 Default = TC.useIntegratedAs();
2279 }
2280 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2281 Default);
2282}
2283
Ted Kremenek62093662013-03-12 17:02:12 +00002284static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2285 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002286 bool UseDwarfDirectory =
2287 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2288 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002289 return !UseDwarfDirectory;
2290}
2291
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002292/// \brief Check whether the given input tree contains any compilation actions.
2293static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002294 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002295 return true;
2296
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002297 for (const auto &Act : *A)
2298 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002299 return true;
2300
2301 return false;
2302}
2303
2304/// \brief Check if -relax-all should be passed to the internal assembler.
2305/// This is done by default when compiling non-assembler source with -O0.
2306static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2307 bool RelaxDefault = true;
2308
2309 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2310 RelaxDefault = A->getOption().matches(options::OPT_O0);
2311
2312 if (RelaxDefault) {
2313 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002314 for (const auto &Act : C.getActions()) {
2315 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002316 RelaxDefault = true;
2317 break;
2318 }
2319 }
2320 }
2321
2322 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002323 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002324}
2325
David Blaikie9260ed62013-07-25 21:19:01 +00002326static void CollectArgsForIntegratedAssembler(Compilation &C,
2327 const ArgList &Args,
2328 ArgStringList &CmdArgs,
2329 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002330 if (UseRelaxAll(C, Args))
2331 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002332
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002333 // When passing -I arguments to the assembler we sometimes need to
2334 // unconditionally take the next argument. For example, when parsing
2335 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2336 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2337 // arg after parsing the '-I' arg.
2338 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002339
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002340 // When using an integrated assembler, translate -Wa, and -Xassembler
2341 // options.
2342 bool CompressDebugSections = false;
2343 for (const Arg *A :
2344 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2345 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002346
Benjamin Kramer72e64312015-09-24 14:48:49 +00002347 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002348 if (TakeNextArg) {
2349 CmdArgs.push_back(Value.data());
2350 TakeNextArg = false;
2351 continue;
2352 }
David Blaikie9260ed62013-07-25 21:19:01 +00002353
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002354 if (Value == "-force_cpusubtype_ALL") {
2355 // Do nothing, this is the default and we don't support anything else.
2356 } else if (Value == "-L") {
2357 CmdArgs.push_back("-msave-temp-labels");
2358 } else if (Value == "--fatal-warnings") {
2359 CmdArgs.push_back("-massembler-fatal-warnings");
2360 } else if (Value == "--noexecstack") {
2361 CmdArgs.push_back("-mnoexecstack");
2362 } else if (Value == "-compress-debug-sections" ||
2363 Value == "--compress-debug-sections") {
2364 CompressDebugSections = true;
2365 } else if (Value == "-nocompress-debug-sections" ||
2366 Value == "--nocompress-debug-sections") {
2367 CompressDebugSections = false;
2368 } else if (Value.startswith("-I")) {
2369 CmdArgs.push_back(Value.data());
2370 // We need to consume the next argument if the current arg is a plain
2371 // -I. The next arg will be the include directory.
2372 if (Value == "-I")
2373 TakeNextArg = true;
2374 } else if (Value.startswith("-gdwarf-")) {
2375 CmdArgs.push_back(Value.data());
Renato Golin7c542b42015-07-27 23:44:45 +00002376 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2377 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2378 // Do nothing, we'll validate it later.
Daniel Sanders4f7cd232015-09-03 12:58:39 +00002379 } else if (Value == "--trap") {
2380 CmdArgs.push_back("-target-feature");
2381 CmdArgs.push_back("+use-tcc-in-div");
2382 } else if (Value == "--break") {
2383 CmdArgs.push_back("-target-feature");
2384 CmdArgs.push_back("-use-tcc-in-div");
Daniel Sanders63f28262015-09-22 13:52:32 +00002385 } else if (Value.startswith("-msoft-float")) {
2386 CmdArgs.push_back("-target-feature");
2387 CmdArgs.push_back("+soft-float");
2388 } else if (Value.startswith("-mhard-float")) {
2389 CmdArgs.push_back("-target-feature");
2390 CmdArgs.push_back("-soft-float");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002391 } else {
2392 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002393 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002394 }
2395 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002396 }
2397 if (CompressDebugSections) {
2398 if (llvm::zlib::isAvailable())
2399 CmdArgs.push_back("-compress-debug-sections");
2400 else
2401 D.Diag(diag::warn_debug_compression_unavailable);
2402 }
David Blaikie9260ed62013-07-25 21:19:01 +00002403}
2404
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00002405static const char *getCompilerRTArgString(const ToolChain &TC,
2406 const llvm::opt::ArgList &Args,
2407 StringRef Component,
2408 bool Shared = false) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002409 return Args.MakeArgString(TC.getCompilerRT(Args, Component, Shared));
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00002410}
2411
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002412// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002413// FIXME: Make sure we can also emit shared objects if they're requested
2414// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002415static void addClangRT(const ToolChain &TC, const ArgList &Args,
2416 ArgStringList &CmdArgs) {
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00002417 CmdArgs.push_back(getCompilerRTArgString(TC, Args, "builtins"));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002418}
2419
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002420static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2421 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002422 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2423 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002424 Args.hasArg(options::OPT_fprofile_generate) ||
Diego Novillo578caf52015-07-09 17:23:53 +00002425 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002426 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002427 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002428 Args.hasArg(options::OPT_fcreate_profile) ||
2429 Args.hasArg(options::OPT_coverage)))
2430 return;
2431
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00002432 CmdArgs.push_back(getCompilerRTArgString(TC, Args, "profile"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002433}
2434
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002435namespace {
2436enum OpenMPRuntimeKind {
2437 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2438 /// without knowing what runtime to target.
2439 OMPRT_Unknown,
2440
2441 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2442 /// the default for Clang.
2443 OMPRT_OMP,
2444
2445 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2446 /// this runtime but can swallow the pragmas, and find and link against the
2447 /// runtime library itself.
2448 OMPRT_GOMP,
2449
Chandler Carruthc6625c62015-05-28 21:10:31 +00002450 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002451 /// OpenMP runtime. We support this mode for users with existing dependencies
2452 /// on this runtime library name.
2453 OMPRT_IOMP5
2454};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002455}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002456
2457/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002458static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2459 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002460 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2461
2462 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2463 if (A)
2464 RuntimeName = A->getValue();
2465
2466 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002467 .Case("libomp", OMPRT_OMP)
2468 .Case("libgomp", OMPRT_GOMP)
2469 .Case("libiomp5", OMPRT_IOMP5)
2470 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002471
2472 if (RT == OMPRT_Unknown) {
2473 if (A)
2474 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002475 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002476 else
2477 // FIXME: We could use a nicer diagnostic here.
2478 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2479 }
2480
2481 return RT;
2482}
2483
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002484static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2485 const ArgList &Args) {
2486 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2487 options::OPT_fno_openmp, false))
2488 return;
2489
2490 switch (getOpenMPRuntime(TC, Args)) {
2491 case OMPRT_OMP:
2492 CmdArgs.push_back("-lomp");
2493 break;
2494 case OMPRT_GOMP:
2495 CmdArgs.push_back("-lgomp");
2496 break;
2497 case OMPRT_IOMP5:
2498 CmdArgs.push_back("-liomp5");
2499 break;
2500 case OMPRT_Unknown:
2501 // Already diagnosed.
2502 break;
2503 }
2504}
2505
Alexey Samsonov52550342014-09-15 19:58:40 +00002506static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2507 ArgStringList &CmdArgs, StringRef Sanitizer,
2508 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002509 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002510 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002511 if (!IsShared)
2512 CmdArgs.push_back("-whole-archive");
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00002513 CmdArgs.push_back(getCompilerRTArgString(TC, Args, Sanitizer, IsShared));
Alexey Samsonov52550342014-09-15 19:58:40 +00002514 if (!IsShared)
2515 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002516}
2517
Alexey Samsonov52550342014-09-15 19:58:40 +00002518// Tries to use a file with the list of dynamic symbols that need to be exported
2519// from the runtime library. Returns true if the file was found.
2520static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2521 ArgStringList &CmdArgs,
2522 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002523 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002524 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2525 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002526 return true;
2527 }
2528 return false;
2529}
2530
2531static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2532 ArgStringList &CmdArgs) {
2533 // Force linking against the system libraries sanitizers depends on
2534 // (see PR15823 why this is necessary).
2535 CmdArgs.push_back("--no-as-needed");
2536 CmdArgs.push_back("-lpthread");
2537 CmdArgs.push_back("-lrt");
2538 CmdArgs.push_back("-lm");
2539 // There's no libdl on FreeBSD.
2540 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2541 CmdArgs.push_back("-ldl");
2542}
2543
2544static void
2545collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2546 SmallVectorImpl<StringRef> &SharedRuntimes,
2547 SmallVectorImpl<StringRef> &StaticRuntimes,
2548 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2549 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2550 // Collect shared runtimes.
2551 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2552 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002553 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002554
Alexey Samsonov52550342014-09-15 19:58:40 +00002555 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002556 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002557 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2558 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002559 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002560 }
2561 if (SanArgs.needsAsanRt()) {
2562 if (SanArgs.needsSharedAsanRt()) {
2563 HelperStaticRuntimes.push_back("asan-preinit");
2564 } else {
2565 StaticRuntimes.push_back("asan");
2566 if (SanArgs.linkCXXRuntimes())
2567 StaticRuntimes.push_back("asan_cxx");
2568 }
2569 }
2570 if (SanArgs.needsDfsanRt())
2571 StaticRuntimes.push_back("dfsan");
2572 if (SanArgs.needsLsanRt())
2573 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002574 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002575 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002576 if (SanArgs.linkCXXRuntimes())
2577 StaticRuntimes.push_back("msan_cxx");
2578 }
2579 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002580 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002581 if (SanArgs.linkCXXRuntimes())
2582 StaticRuntimes.push_back("tsan_cxx");
2583 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002584 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002585 StaticRuntimes.push_back("ubsan_standalone");
2586 if (SanArgs.linkCXXRuntimes())
2587 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002588 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002589 if (SanArgs.needsSafeStackRt())
2590 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002591}
2592
Alexey Samsonov52550342014-09-15 19:58:40 +00002593// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2594// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2595static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002596 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002597 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2598 HelperStaticRuntimes;
2599 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2600 HelperStaticRuntimes);
2601 for (auto RT : SharedRuntimes)
2602 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2603 for (auto RT : HelperStaticRuntimes)
2604 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2605 bool AddExportDynamic = false;
2606 for (auto RT : StaticRuntimes) {
2607 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2608 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2609 }
2610 // If there is a static runtime with no dynamic list, force all the symbols
2611 // to be dynamic to be sure we export sanitizer interface functions.
2612 if (AddExportDynamic)
2613 CmdArgs.push_back("-export-dynamic");
2614 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002615}
2616
Reid Kleckner86ea7702015-02-04 23:45:07 +00002617static bool areOptimizationsEnabled(const ArgList &Args) {
2618 // Find the last -O arg and see if it is non-zero.
2619 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2620 return !A->getOption().matches(options::OPT_O0);
2621 // Defaults to -O0.
2622 return false;
2623}
2624
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002625static bool shouldUseFramePointerForTarget(const ArgList &Args,
2626 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002627 switch (Triple.getArch()) {
2628 case llvm::Triple::xcore:
2629 case llvm::Triple::wasm32:
2630 case llvm::Triple::wasm64:
2631 // XCore never wants frame pointers, regardless of OS.
2632 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002633 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002634 default:
2635 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002636 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002637
2638 if (Triple.isOSLinux()) {
2639 switch (Triple.getArch()) {
2640 // Don't use a frame pointer on linux if optimizing for certain targets.
2641 case llvm::Triple::mips64:
2642 case llvm::Triple::mips64el:
2643 case llvm::Triple::mips:
2644 case llvm::Triple::mipsel:
2645 case llvm::Triple::systemz:
2646 case llvm::Triple::x86:
2647 case llvm::Triple::x86_64:
2648 return !areOptimizationsEnabled(Args);
2649 default:
2650 return true;
2651 }
2652 }
2653
2654 if (Triple.isOSWindows()) {
2655 switch (Triple.getArch()) {
2656 case llvm::Triple::x86:
2657 return !areOptimizationsEnabled(Args);
2658 default:
2659 // All other supported Windows ISAs use xdata unwind information, so frame
2660 // pointers are not generally useful.
2661 return false;
2662 }
2663 }
2664
2665 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002666}
2667
Rafael Espindola224dd632011-12-14 21:02:23 +00002668static bool shouldUseFramePointer(const ArgList &Args,
2669 const llvm::Triple &Triple) {
2670 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2671 options::OPT_fomit_frame_pointer))
2672 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2673
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002674 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002675}
2676
Eric Christopherb7d97e92013-04-03 01:58:53 +00002677static bool shouldUseLeafFramePointer(const ArgList &Args,
2678 const llvm::Triple &Triple) {
2679 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2680 options::OPT_momit_leaf_frame_pointer))
2681 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2682
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002683 if (Triple.isPS4CPU())
2684 return false;
2685
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002686 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002687}
2688
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002689/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002690static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002691 SmallString<128> cwd;
2692 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002693 CmdArgs.push_back("-fdebug-compilation-dir");
2694 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002695 }
2696}
2697
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002698static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002699 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2700 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2701 SmallString<128> T(FinalOutput->getValue());
2702 llvm::sys::path::replace_extension(T, "dwo");
2703 return Args.MakeArgString(T);
2704 } else {
2705 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002706 SmallString<128> T(
2707 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002708 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002709 llvm::sys::path::replace_extension(F, "dwo");
2710 T += F;
2711 return Args.MakeArgString(F);
2712 }
2713}
2714
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002715static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2716 const JobAction &JA, const ArgList &Args,
2717 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002718 ArgStringList ExtractArgs;
2719 ExtractArgs.push_back("--extract-dwo");
2720
2721 ArgStringList StripArgs;
2722 StripArgs.push_back("--strip-dwo");
2723
2724 // Grabbing the output of the earlier compile step.
2725 StripArgs.push_back(Output.getFilename());
2726 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002727 ExtractArgs.push_back(OutFile);
2728
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002729 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002730 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002731
2732 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002733 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002734
2735 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002736 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002737}
2738
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002739/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002740/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2741static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002742 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002743 if (A->getOption().matches(options::OPT_O4) ||
2744 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002745 return true;
2746
2747 if (A->getOption().matches(options::OPT_O0))
2748 return false;
2749
2750 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2751
Rafael Espindola91780de2013-08-26 14:05:41 +00002752 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002753 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002754 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002755 return true;
2756
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002757 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002758 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002759 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002760
2761 unsigned OptLevel = 0;
2762 if (S.getAsInteger(10, OptLevel))
2763 return false;
2764
2765 return OptLevel > 1;
2766 }
2767
2768 return false;
2769}
2770
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002771/// Add -x lang to \p CmdArgs for \p Input.
2772static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2773 ArgStringList &CmdArgs) {
2774 // When using -verify-pch, we don't want to provide the type
2775 // 'precompiled-header' if it was inferred from the file extension
2776 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2777 return;
2778
2779 CmdArgs.push_back("-x");
2780 if (Args.hasArg(options::OPT_rewrite_objc))
2781 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2782 else
2783 CmdArgs.push_back(types::getTypeName(Input.getType()));
2784}
2785
David Majnemerc371ff02015-03-22 08:39:22 +00002786static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002787 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002788 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002789
2790 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002791 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002792
2793 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002794 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002795 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002796 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002797}
2798
Rafael Espindola577637a2015-01-03 00:06:04 +00002799// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002800// options that build systems might add but are unused when assembling or only
2801// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002802static void claimNoWarnArgs(const ArgList &Args) {
2803 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002804 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002805 Args.ClaimAllArgs(options::OPT_flto);
2806 Args.ClaimAllArgs(options::OPT_fno_lto);
2807}
2808
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002809static void appendUserToPath(SmallVectorImpl<char> &Result) {
2810#ifdef LLVM_ON_UNIX
2811 const char *Username = getenv("LOGNAME");
2812#else
2813 const char *Username = getenv("USERNAME");
2814#endif
2815 if (Username) {
2816 // Validate that LoginName can be used in a path, and get its length.
2817 size_t Len = 0;
2818 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002819 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002820 Username = nullptr;
2821 break;
2822 }
2823 }
2824
2825 if (Username && Len > 0) {
2826 Result.append(Username, Username + Len);
2827 return;
2828 }
2829 }
2830
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002831// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002832#ifdef LLVM_ON_UNIX
2833 std::string UID = llvm::utostr(getuid());
2834#else
2835 // FIXME: Windows seems to have an 'SID' that might work.
2836 std::string UID = "9999";
2837#endif
2838 Result.append(UID.begin(), UID.end());
2839}
2840
David Majnemere11d3732015-06-08 00:22:46 +00002841VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2842 const llvm::Triple &Triple,
2843 const llvm::opt::ArgList &Args,
2844 bool IsWindowsMSVC) {
2845 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2846 IsWindowsMSVC) ||
2847 Args.hasArg(options::OPT_fmsc_version) ||
2848 Args.hasArg(options::OPT_fms_compatibility_version)) {
2849 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2850 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002851 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002852
2853 if (MSCVersion && MSCompatibilityVersion) {
2854 if (D)
2855 D->Diag(diag::err_drv_argument_not_allowed_with)
2856 << MSCVersion->getAsString(Args)
2857 << MSCompatibilityVersion->getAsString(Args);
2858 return VersionTuple();
2859 }
2860
2861 if (MSCompatibilityVersion) {
2862 VersionTuple MSVT;
2863 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2864 D->Diag(diag::err_drv_invalid_value)
2865 << MSCompatibilityVersion->getAsString(Args)
2866 << MSCompatibilityVersion->getValue();
2867 return MSVT;
2868 }
2869
2870 if (MSCVersion) {
2871 unsigned Version = 0;
2872 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2873 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2874 << MSCVersion->getValue();
2875 return getMSCompatibilityVersion(Version);
2876 }
2877
2878 unsigned Major, Minor, Micro;
2879 Triple.getEnvironmentVersion(Major, Minor, Micro);
2880 if (Major || Minor || Micro)
2881 return VersionTuple(Major, Minor, Micro);
2882
2883 return VersionTuple(18);
2884 }
2885 return VersionTuple();
2886}
2887
Diego Novilloa0545962015-07-10 18:00:07 +00002888static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2889 const InputInfo &Output, const ArgList &Args,
2890 ArgStringList &CmdArgs) {
2891 auto *ProfileGenerateArg = Args.getLastArg(
2892 options::OPT_fprofile_instr_generate,
2893 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00002894 options::OPT_fprofile_generate_EQ,
2895 options::OPT_fno_profile_instr_generate);
2896 if (ProfileGenerateArg &&
2897 ProfileGenerateArg->getOption().matches(
2898 options::OPT_fno_profile_instr_generate))
2899 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002900
2901 auto *ProfileUseArg = Args.getLastArg(
2902 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00002903 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2904 options::OPT_fno_profile_instr_use);
2905 if (ProfileUseArg &&
2906 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2907 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002908
2909 if (ProfileGenerateArg && ProfileUseArg)
2910 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00002911 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00002912
Diego Novillo758f3f52015-08-05 21:49:51 +00002913 if (ProfileGenerateArg) {
2914 if (ProfileGenerateArg->getOption().matches(
2915 options::OPT_fprofile_instr_generate_EQ))
2916 ProfileGenerateArg->render(Args, CmdArgs);
2917 else if (ProfileGenerateArg->getOption().matches(
2918 options::OPT_fprofile_generate_EQ)) {
2919 SmallString<128> Path(ProfileGenerateArg->getValue());
2920 llvm::sys::path::append(Path, "default.profraw");
2921 CmdArgs.push_back(
2922 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
2923 } else
2924 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2925 }
Diego Novilloa0545962015-07-10 18:00:07 +00002926
Diego Novillo758f3f52015-08-05 21:49:51 +00002927 if (ProfileUseArg) {
2928 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
2929 ProfileUseArg->render(Args, CmdArgs);
2930 else if ((ProfileUseArg->getOption().matches(
2931 options::OPT_fprofile_use_EQ) ||
2932 ProfileUseArg->getOption().matches(
2933 options::OPT_fprofile_instr_use))) {
2934 SmallString<128> Path(
2935 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
2936 if (Path.empty() || llvm::sys::fs::is_directory(Path))
2937 llvm::sys::path::append(Path, "default.profdata");
2938 CmdArgs.push_back(
2939 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
2940 }
Diego Novilloa0545962015-07-10 18:00:07 +00002941 }
2942
2943 if (Args.hasArg(options::OPT_ftest_coverage) ||
2944 Args.hasArg(options::OPT_coverage))
2945 CmdArgs.push_back("-femit-coverage-notes");
2946 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2947 false) ||
2948 Args.hasArg(options::OPT_coverage))
2949 CmdArgs.push_back("-femit-coverage-data");
2950
Diego Novilloc4b94da2015-08-05 23:27:40 +00002951 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2952 options::OPT_fno_coverage_mapping, false) &&
2953 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00002954 D.Diag(diag::err_drv_argument_only_allowed_with)
2955 << "-fcoverage-mapping"
2956 << "-fprofile-instr-generate";
2957
Diego Novilloc4b94da2015-08-05 23:27:40 +00002958 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2959 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00002960 CmdArgs.push_back("-fcoverage-mapping");
2961
2962 if (C.getArgs().hasArg(options::OPT_c) ||
2963 C.getArgs().hasArg(options::OPT_S)) {
2964 if (Output.isFilename()) {
2965 CmdArgs.push_back("-coverage-file");
2966 SmallString<128> CoverageFilename;
2967 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
2968 CoverageFilename = FinalOutput->getValue();
2969 } else {
2970 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
2971 }
2972 if (llvm::sys::path::is_relative(CoverageFilename)) {
2973 SmallString<128> Pwd;
2974 if (!llvm::sys::fs::current_path(Pwd)) {
2975 llvm::sys::path::append(Pwd, CoverageFilename);
2976 CoverageFilename.swap(Pwd);
2977 }
2978 }
2979 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
2980 }
2981 }
2982}
2983
James Y Knight5bdf7ab2015-08-19 15:12:02 +00002984/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
2985/// smooshes them together with platform defaults, to decide whether
2986/// this compile should be using PIC mode or not. Returns a tuple of
2987/// (RelocationModel, PICLevel, IsPIE).
2988static std::tuple<llvm::Reloc::Model, unsigned, bool>
2989ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
2990 const ArgList &Args) {
2991 // FIXME: why does this code...and so much everywhere else, use both
2992 // ToolChain.getTriple() and Triple?
2993 bool PIE = ToolChain.isPIEDefault();
2994 bool PIC = PIE || ToolChain.isPICDefault();
2995 bool IsPICLevelTwo = PIC;
2996
2997 bool KernelOrKext =
2998 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
2999
3000 // Android-specific defaults for PIC/PIE
3001 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
3002 switch (ToolChain.getArch()) {
3003 case llvm::Triple::arm:
3004 case llvm::Triple::armeb:
3005 case llvm::Triple::thumb:
3006 case llvm::Triple::thumbeb:
3007 case llvm::Triple::aarch64:
3008 case llvm::Triple::mips:
3009 case llvm::Triple::mipsel:
3010 case llvm::Triple::mips64:
3011 case llvm::Triple::mips64el:
3012 PIC = true; // "-fpic"
3013 break;
3014
3015 case llvm::Triple::x86:
3016 case llvm::Triple::x86_64:
3017 PIC = true; // "-fPIC"
3018 IsPICLevelTwo = true;
3019 break;
3020
3021 default:
3022 break;
3023 }
3024 }
3025
3026 // OpenBSD-specific defaults for PIE
3027 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3028 switch (ToolChain.getArch()) {
3029 case llvm::Triple::mips64:
3030 case llvm::Triple::mips64el:
3031 case llvm::Triple::sparcel:
3032 case llvm::Triple::x86:
3033 case llvm::Triple::x86_64:
3034 IsPICLevelTwo = false; // "-fpie"
3035 break;
3036
3037 case llvm::Triple::ppc:
3038 case llvm::Triple::sparc:
3039 case llvm::Triple::sparcv9:
3040 IsPICLevelTwo = true; // "-fPIE"
3041 break;
3042
3043 default:
3044 break;
3045 }
3046 }
3047
3048 // The last argument relating to either PIC or PIE wins, and no
3049 // other argument is used. If the last argument is any flavor of the
3050 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3051 // option implicitly enables PIC at the same level.
3052 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3053 options::OPT_fpic, options::OPT_fno_pic,
3054 options::OPT_fPIE, options::OPT_fno_PIE,
3055 options::OPT_fpie, options::OPT_fno_pie);
3056 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3057 // is forced, then neither PIC nor PIE flags will have no effect.
3058 if (!ToolChain.isPICDefaultForced()) {
3059 if (LastPICArg) {
3060 Option O = LastPICArg->getOption();
3061 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3062 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3063 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3064 PIC =
3065 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3066 IsPICLevelTwo =
3067 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3068 } else {
3069 PIE = PIC = false;
3070 }
3071 }
3072 }
3073
Greg Bedwell80b325c2015-09-25 16:11:00 +00003074 // Introduce a Darwin-specific hack. If the default is PIC, but the
3075 // PIC level would've been set to level 1, force it back to level 2
3076 // PIC instead. This matches the behavior of Darwin GCC (based on
3077 // chandlerc's informal testing in 2012).
3078 if (PIC && ToolChain.getTriple().isOSDarwin())
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003079 IsPICLevelTwo |= ToolChain.isPICDefault();
3080
James Y Knightc4015d32015-08-21 04:14:55 +00003081 // This kernel flags are a trump-card: they will disable PIC/PIE
3082 // generation, independent of the argument order.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003083 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
3084 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003085
3086 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3087 // This is a very special mode. It trumps the other modes, almost no one
3088 // uses it, and it isn't even valid on any OS but Darwin.
3089 if (!ToolChain.getTriple().isOSDarwin())
3090 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3091 << A->getSpelling() << ToolChain.getTriple().str();
3092
3093 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3094
3095 // Only a forced PIC mode can cause the actual compile to have PIC defines
3096 // etc., no flags are sufficient. This behavior was selected to closely
3097 // match that of llvm-gcc and Apple GCC before that.
3098 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3099
3100 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3101 }
3102
3103 if (PIC)
3104 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3105
3106 return std::make_tuple(llvm::Reloc::Static, 0, false);
3107}
3108
3109static const char *RelocationModelName(llvm::Reloc::Model Model) {
3110 switch (Model) {
3111 case llvm::Reloc::Default:
3112 return nullptr;
3113 case llvm::Reloc::Static:
3114 return "static";
3115 case llvm::Reloc::PIC_:
3116 return "pic";
3117 case llvm::Reloc::DynamicNoPIC:
3118 return "dynamic-no-pic";
3119 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003120 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003121}
3122
3123static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3124 ArgStringList &CmdArgs) {
3125 llvm::Reloc::Model RelocationModel;
3126 unsigned PICLevel;
3127 bool IsPIE;
3128 std::tie(RelocationModel, PICLevel, IsPIE) =
3129 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3130
3131 if (RelocationModel != llvm::Reloc::Static)
3132 CmdArgs.push_back("-KPIC");
3133}
3134
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003135void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003136 const InputInfo &Output, const InputInfoList &Inputs,
3137 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003138 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3139 const llvm::Triple Triple(TripleStr);
3140
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003141 bool KernelOrKext =
3142 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003143 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003144 ArgStringList CmdArgs;
3145
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003146 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003147 bool IsWindowsCygnus =
3148 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003149 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
3150
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003151 // Check number of inputs for sanity. We need at least one input.
3152 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003153 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003154 // CUDA compilation may have multiple inputs (source file + results of
3155 // device-side compilations). All other jobs are expected to have exactly one
3156 // input.
3157 bool IsCuda = types::isCuda(Input.getType());
3158 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003159
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003160 // Invoke ourselves in -cc1 mode.
3161 //
3162 // FIXME: Implement custom jobs for internal actions.
3163 CmdArgs.push_back("-cc1");
3164
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003165 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003166 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003167 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003168
James Y Knight2db38f32015-08-15 03:45:25 +00003169 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3170 Triple.getArch() == llvm::Triple::thumb)) {
3171 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003172 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003173 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003174 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003175 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003176 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003177 }
3178
Tim Northover336f1892014-03-29 13:16:12 +00003179 // Push all default warning arguments that are specific to
3180 // the given target. These come before user provided warning options
3181 // are provided.
3182 getToolChain().addClangWarningOptions(CmdArgs);
3183
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003184 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003185 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003186
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003187 if (isa<AnalyzeJobAction>(JA)) {
3188 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3189 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003190 } else if (isa<MigrateJobAction>(JA)) {
3191 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003192 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003193 if (Output.getType() == types::TY_Dependencies)
3194 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003195 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003196 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003197 if (Args.hasArg(options::OPT_rewrite_objc) &&
3198 !Args.hasArg(options::OPT_g_Group))
3199 CmdArgs.push_back("-P");
3200 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003201 } else if (isa<AssembleJobAction>(JA)) {
3202 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003203
David Blaikie9260ed62013-07-25 21:19:01 +00003204 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003205
3206 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003207 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003208 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003209 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003210 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003211
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003212 if (JA.getType() == types::TY_Nothing)
3213 CmdArgs.push_back("-fsyntax-only");
3214 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003215 CmdArgs.push_back("-emit-pch");
3216 else
3217 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003218 } else if (isa<VerifyPCHJobAction>(JA)) {
3219 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003220 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003221 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3222 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003223
Renato Golin7c542b42015-07-27 23:44:45 +00003224 if (JA.getType() == types::TY_LTO_IR || JA.getType() == types::TY_LTO_BC) {
Teresa Johnson8749d8042015-07-06 16:23:00 +00003225 CmdArgs.push_back("-flto");
3226 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003227 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003228 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003229 } else if (JA.getType() == types::TY_LLVM_IR ||
3230 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003231 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003232 } else if (JA.getType() == types::TY_LLVM_BC ||
3233 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003234 CmdArgs.push_back("-emit-llvm-bc");
3235 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003236 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003237 } else if (JA.getType() == types::TY_AST) {
3238 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003239 } else if (JA.getType() == types::TY_ModuleFile) {
3240 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003241 } else if (JA.getType() == types::TY_RewrittenObjC) {
3242 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003243 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003244 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3245 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003246 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003247 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003248 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003249 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003250
3251 // Preserve use-list order by default when emitting bitcode, so that
3252 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3253 // same result as running passes here. For LTO, we don't need to preserve
3254 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003255 if (JA.getType() == types::TY_LLVM_BC)
3256 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003257 }
3258
Justin Bognera88f0122014-06-20 22:59:50 +00003259 // We normally speed up the clang process a bit by skipping destructors at
3260 // exit, but when we're generating diagnostics we can rely on some of the
3261 // cleanup.
3262 if (!C.isForDiagnostics())
3263 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003264
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003265// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003266#ifdef NDEBUG
3267 CmdArgs.push_back("-disable-llvm-verifier");
3268#endif
3269
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003270 // Set the main file name, so that debug info works even with
3271 // -save-temps.
3272 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003273 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003274
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003275 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003276 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003277 if (Args.hasArg(options::OPT_static))
3278 CmdArgs.push_back("-static-define");
3279
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003280 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003281 // Enable region store model by default.
3282 CmdArgs.push_back("-analyzer-store=region");
3283
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003284 // Treat blocks as analysis entry points.
3285 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3286
Ted Kremenek49c79792011-03-24 00:28:47 +00003287 CmdArgs.push_back("-analyzer-eagerly-assume");
3288
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003289 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003290 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003291 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003292
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003293 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003294 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003295
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003296 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003297 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003298
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003299 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003300
Artem Belevichba558952015-05-06 18:20:23 +00003301 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003302 CmdArgs.push_back("-analyzer-checker=cplusplus");
3303
Nico Webere8e53112014-05-11 01:04:02 +00003304 // Enable the following experimental checkers for testing.
3305 CmdArgs.push_back(
3306 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003307 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3308 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003309 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003310 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3311 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003312
3313 // Default nullability checks.
3314 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3315 CmdArgs.push_back(
3316 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003317 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003318
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003319 // Set the output format. The default is plist, for (lame) historical
3320 // reasons.
3321 CmdArgs.push_back("-analyzer-output");
3322 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003323 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003324 else
3325 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003326
Ted Kremenekfe449a22010-03-22 22:32:05 +00003327 // Disable the presentation of standard compiler warnings when
3328 // using --analyze. We only want to show static analyzer diagnostics
3329 // or frontend errors.
3330 CmdArgs.push_back("-w");
3331
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003332 // Add -Xanalyzer arguments when running as analyzer.
3333 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003334 }
3335
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003336 CheckCodeGenerationOptions(D, Args);
3337
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003338 llvm::Reloc::Model RelocationModel;
3339 unsigned PICLevel;
3340 bool IsPIE;
3341 std::tie(RelocationModel, PICLevel, IsPIE) =
3342 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003343
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003344 const char *RMName = RelocationModelName(RelocationModel);
3345 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003346 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003347 CmdArgs.push_back(RMName);
3348 }
3349 if (PICLevel > 0) {
3350 CmdArgs.push_back("-pic-level");
3351 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3352 if (IsPIE) {
3353 CmdArgs.push_back("-pie-level");
3354 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003355 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003356 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003357
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003358 CmdArgs.push_back("-mthread-model");
3359 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3360 CmdArgs.push_back(A->getValue());
3361 else
3362 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3363
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003364 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3365
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003366 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3367 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003368 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003369
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003370 // LLVM Code Generator Options.
3371
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003372 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3373 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003374 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3375 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003376 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003377 CmdArgs.push_back(A->getValue());
3378 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003379 }
3380 }
3381
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003382 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3383 StringRef v = A->getValue();
3384 CmdArgs.push_back("-mllvm");
3385 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3386 A->claim();
3387 }
3388
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003389 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3390 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003391 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003392 }
3393
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003394 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3395 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003396 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003397 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003398 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003399 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3400 CmdArgs.push_back("-fpcc-struct-return");
3401 } else {
3402 assert(A->getOption().matches(options::OPT_freg_struct_return));
3403 CmdArgs.push_back("-freg-struct-return");
3404 }
3405 }
3406
Roman Divacky65b88cd2011-03-01 17:40:53 +00003407 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3408 CmdArgs.push_back("-mrtd");
3409
Rafael Espindola224dd632011-12-14 21:02:23 +00003410 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003411 CmdArgs.push_back("-mdisable-fp-elim");
3412 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3413 options::OPT_fno_zero_initialized_in_bss))
3414 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003415
3416 bool OFastEnabled = isOptimizationLevelFast(Args);
3417 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3418 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003419 OptSpecifier StrictAliasingAliasOption =
3420 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003421 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3422 // doesn't do any TBAA.
3423 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003424 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003425 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003426 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003427 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3428 options::OPT_fno_struct_path_tbaa))
3429 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003430 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3431 false))
3432 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003433 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3434 options::OPT_fno_strict_vtable_pointers,
3435 false))
3436 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003437 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3438 options::OPT_fno_optimize_sibling_calls))
3439 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003440
Eric Christopher006208c2013-04-04 06:29:47 +00003441 // Handle segmented stacks.
3442 if (Args.hasArg(options::OPT_fsplit_stack))
3443 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003444
3445 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3446 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003447 OptSpecifier FastMathAliasOption =
3448 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3449
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003450 // Handle various floating point optimization flags, mapping them to the
3451 // appropriate LLVM code generation flags. The pattern for all of these is to
3452 // default off the codegen optimizations, and if any flag enables them and no
3453 // flag disables them after the flag enabling them, enable the codegen
3454 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003455 if (Arg *A = Args.getLastArg(
3456 options::OPT_ffast_math, FastMathAliasOption,
3457 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3458 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3459 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003460 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3461 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003462 A->getOption().getID() != options::OPT_fhonor_infinities)
3463 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003464 if (Arg *A = Args.getLastArg(
3465 options::OPT_ffast_math, FastMathAliasOption,
3466 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3467 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3468 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003469 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3470 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003471 A->getOption().getID() != options::OPT_fhonor_nans)
3472 CmdArgs.push_back("-menable-no-nans");
3473
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003474 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3475 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003476 if (Arg *A =
3477 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3478 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3479 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003480 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3481 // However, turning *off* -ffast_math merely restores the toolchain default
3482 // (which may be false).
3483 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3484 A->getOption().getID() == options::OPT_ffast_math ||
3485 A->getOption().getID() == options::OPT_Ofast)
3486 MathErrno = false;
3487 else if (A->getOption().getID() == options::OPT_fmath_errno)
3488 MathErrno = true;
3489 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003490 if (MathErrno)
3491 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003492
3493 // There are several flags which require disabling very specific
3494 // optimizations. Any of these being disabled forces us to turn off the
3495 // entire set of LLVM optimizations, so collect them through all the flag
3496 // madness.
3497 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003498 if (Arg *A = Args.getLastArg(
3499 options::OPT_ffast_math, FastMathAliasOption,
3500 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3501 options::OPT_fno_unsafe_math_optimizations,
3502 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003503 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3504 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003505 A->getOption().getID() != options::OPT_fno_associative_math)
3506 AssociativeMath = true;
3507 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003508 if (Arg *A = Args.getLastArg(
3509 options::OPT_ffast_math, FastMathAliasOption,
3510 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3511 options::OPT_fno_unsafe_math_optimizations,
3512 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003513 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3514 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003515 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3516 ReciprocalMath = true;
3517 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003518 if (Arg *A = Args.getLastArg(
3519 options::OPT_ffast_math, FastMathAliasOption,
3520 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3521 options::OPT_fno_unsafe_math_optimizations,
3522 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003523 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3524 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003525 A->getOption().getID() != options::OPT_fsigned_zeros)
3526 SignedZeros = false;
3527 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003528 if (Arg *A = Args.getLastArg(
3529 options::OPT_ffast_math, FastMathAliasOption,
3530 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3531 options::OPT_fno_unsafe_math_optimizations,
3532 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003533 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3534 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003535 A->getOption().getID() != options::OPT_ftrapping_math)
3536 TrappingMath = false;
3537 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3538 !TrappingMath)
3539 CmdArgs.push_back("-menable-unsafe-fp-math");
3540
Sanjay Patel76c9e092015-01-23 16:40:50 +00003541 if (!SignedZeros)
3542 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003543
Sanjay Patel359b1052015-04-09 15:03:23 +00003544 if (ReciprocalMath)
3545 CmdArgs.push_back("-freciprocal-math");
3546
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003547 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003548 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003549 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003550 options::OPT_ffp_contract)) {
3551 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003552 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003553 if (Val == "fast" || Val == "on" || Val == "off") {
3554 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3555 } else {
3556 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003557 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003558 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003559 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3560 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003561 // If fast-math is set then set the fp-contract mode to fast.
3562 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3563 }
3564 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003565
Sanjay Patel2987c292015-06-11 14:53:41 +00003566 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003567
Bob Wilson6a039162012-07-19 03:52:53 +00003568 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3569 // and if we find them, tell the frontend to provide the appropriate
3570 // preprocessor macros. This is distinct from enabling any optimizations as
3571 // these options induce language changes which must survive serialization
3572 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003573 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3574 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003575 if (!A->getOption().matches(options::OPT_fno_fast_math))
3576 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003577 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3578 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003579 if (A->getOption().matches(options::OPT_ffinite_math_only))
3580 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003581
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003582 // Decide whether to use verbose asm. Verbose assembly is the default on
3583 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003584 bool IsIntegratedAssemblerDefault =
3585 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003586 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003587 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003588 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003589 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003590
Rafael Espindolab8a12932015-05-22 20:44:03 +00003591 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3592 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003593 CmdArgs.push_back("-no-integrated-as");
3594
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003595 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3596 CmdArgs.push_back("-mdebug-pass");
3597 CmdArgs.push_back("Structure");
3598 }
3599 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3600 CmdArgs.push_back("-mdebug-pass");
3601 CmdArgs.push_back("Arguments");
3602 }
3603
John McCall8517abc2010-02-19 02:45:38 +00003604 // Enable -mconstructor-aliases except on darwin, where we have to
3605 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003606 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003607 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003608
John McCall7ef5cb32011-03-18 02:56:14 +00003609 // Darwin's kernel doesn't support guard variables; just die if we
3610 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003611 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003612 CmdArgs.push_back("-fforbid-guard-variables");
3613
Douglas Gregordbe39272011-02-01 15:15:22 +00003614 if (Args.hasArg(options::OPT_mms_bitfields)) {
3615 CmdArgs.push_back("-mms-bitfields");
3616 }
John McCall8517abc2010-02-19 02:45:38 +00003617
Daniel Dunbar306945d2009-09-16 06:17:29 +00003618 // This is a coarse approximation of what llvm-gcc actually does, both
3619 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3620 // complicated ways.
3621 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003622 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3623 options::OPT_fno_asynchronous_unwind_tables,
3624 (getToolChain().IsUnwindTablesDefault() ||
3625 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3626 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003627 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3628 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003629 CmdArgs.push_back("-munwind-tables");
3630
Chandler Carruth05fb5852012-11-21 23:40:23 +00003631 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003632
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003633 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3634 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003635 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003636 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003637
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003638 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003639 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003640
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003641 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003642 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003643 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003644 }
3645
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003646 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003647 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003648 if (!CPU.empty()) {
3649 CmdArgs.push_back("-target-cpu");
3650 CmdArgs.push_back(Args.MakeArgString(CPU));
3651 }
3652
Rafael Espindolaeb265472013-08-21 21:59:03 +00003653 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3654 CmdArgs.push_back("-mfpmath");
3655 CmdArgs.push_back(A->getValue());
3656 }
3657
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003658 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003659 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003660
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003661 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003662 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003663 default:
3664 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003665
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003666 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003667 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003668 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003669 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003670 // Use the effective triple, which takes into account the deployment target.
3671 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003672 break;
3673
Tim Northover573cbee2014-05-24 12:52:07 +00003674 case llvm::Triple::aarch64:
3675 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003676 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003677 break;
3678
Eric Christopher0b26a612010-03-02 02:41:08 +00003679 case llvm::Triple::mips:
3680 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003681 case llvm::Triple::mips64:
3682 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003683 AddMIPSTargetArgs(Args, CmdArgs);
3684 break;
3685
Ulrich Weigand8afad612014-07-28 13:17:52 +00003686 case llvm::Triple::ppc:
3687 case llvm::Triple::ppc64:
3688 case llvm::Triple::ppc64le:
3689 AddPPCTargetArgs(Args, CmdArgs);
3690 break;
3691
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003692 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003693 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003694 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003695 AddSparcTargetArgs(Args, CmdArgs);
3696 break;
3697
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003698 case llvm::Triple::x86:
3699 case llvm::Triple::x86_64:
3700 AddX86TargetArgs(Args, CmdArgs);
3701 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003702
3703 case llvm::Triple::hexagon:
3704 AddHexagonTargetArgs(Args, CmdArgs);
3705 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003706 }
3707
Hans Wennborg75958c42013-08-08 00:17:41 +00003708 // Add clang-cl arguments.
3709 if (getToolChain().getDriver().IsCLMode())
3710 AddClangCLArgs(Args, CmdArgs);
3711
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003712 // Pass the linker version in use.
3713 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3714 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003715 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003716 }
3717
Eric Christopherb7d97e92013-04-03 01:58:53 +00003718 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003719 CmdArgs.push_back("-momit-leaf-frame-pointer");
3720
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003721 // Explicitly error on some things we know we don't support and can't just
3722 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003723 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003724 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3725 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003726 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003727 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003728 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3729 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003730 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003731 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003732 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003733 }
3734
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003735 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003736 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003737 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003738 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003739 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3740 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003741 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003742 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003743 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003744
Chad Rosierbe10f982011-08-02 17:58:04 +00003745 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003746 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003747 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3748 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003749 }
3750
Manman Ren17bdb0f2013-11-20 20:22:14 +00003751 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3752 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003753 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003754 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003755 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003756 if (A->getOption().matches(options::OPT_gline_tables_only) &&
David Blaikiece3e7a62015-07-30 21:42:22 +00003757 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003758 // FIXME: we should support specifying dwarf version with
3759 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003760 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003761 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003762 const llvm::Triple &Triple = getToolChain().getTriple();
3763 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003764 Triple.getOS() == llvm::Triple::FreeBSD ||
3765 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003766 CmdArgs.push_back("-gdwarf-2");
David Blaikiece3e7a62015-07-30 21:42:22 +00003767 SplitDwarfArg = nullptr;
Douglas Katzman553927a2015-09-14 20:31:28 +00003768 } else if (A->getOption().matches(options::OPT_gdwarf_2) ||
3769 A->getOption().matches(options::OPT_gdwarf_3) ||
3770 A->getOption().matches(options::OPT_gdwarf_4)) {
3771 A->render(Args, CmdArgs);
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003772 } else if (!A->getOption().matches(options::OPT_g0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003773 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003774 const llvm::Triple &Triple = getToolChain().getTriple();
3775 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003776 Triple.getOS() == llvm::Triple::FreeBSD ||
3777 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003778 CmdArgs.push_back("-gdwarf-2");
3779 else
3780 CmdArgs.push_back("-g");
3781 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003782 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003783
Reid Kleckner124955a2015-08-05 18:51:13 +00003784 // Forward -gcodeview.
3785 Args.AddLastArg(CmdArgs, options::OPT_gcodeview);
3786
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003787 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3788 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003789 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Greg Bedwell80b325c2015-09-25 16:11:00 +00003790 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003791 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003792
Eric Christopher138c32b2013-09-13 22:37:55 +00003793 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003794 if (Args.hasArg(options::OPT_gmodules)) {
3795 CmdArgs.push_back("-g");
3796 CmdArgs.push_back("-dwarf-ext-refs");
3797 CmdArgs.push_back("-fmodule-format=obj");
3798 }
3799
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003800 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3801 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003802 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003803 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003804 CmdArgs.push_back("-g");
3805 CmdArgs.push_back("-backend-option");
3806 CmdArgs.push_back("-split-dwarf=Enable");
3807 }
3808
Eric Christopher138c32b2013-09-13 22:37:55 +00003809 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3810 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3811 CmdArgs.push_back("-backend-option");
3812 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3813 }
Eric Christophereec89c22013-06-18 00:03:50 +00003814
Eric Christopher0d403d22014-02-14 01:27:03 +00003815 // -gdwarf-aranges turns on the emission of the aranges section in the
3816 // backend.
Greg Bedwell80b325c2015-09-25 16:11:00 +00003817 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
Eric Christopher0d403d22014-02-14 01:27:03 +00003818 CmdArgs.push_back("-backend-option");
3819 CmdArgs.push_back("-generate-arange-section");
3820 }
3821
David Blaikief36d9ba2014-01-27 18:52:43 +00003822 if (Args.hasFlag(options::OPT_fdebug_types_section,
3823 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003824 CmdArgs.push_back("-backend-option");
3825 CmdArgs.push_back("-generate-type-units");
3826 }
Eric Christophereec89c22013-06-18 00:03:50 +00003827
Ed Schouten6e576152015-03-26 17:50:28 +00003828 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3829 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3830
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003831 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003832 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003833 CmdArgs.push_back("-ffunction-sections");
3834 }
3835
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003836 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3837 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003838 CmdArgs.push_back("-fdata-sections");
3839 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003840
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003841 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003842 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003843 CmdArgs.push_back("-fno-unique-section-names");
3844
Chris Lattner3c77a352010-06-22 00:03:40 +00003845 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3846
Diego Novilloa0545962015-07-10 18:00:07 +00003847 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003848
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003849 // Pass options for controlling the default header search paths.
3850 if (Args.hasArg(options::OPT_nostdinc)) {
3851 CmdArgs.push_back("-nostdsysteminc");
3852 CmdArgs.push_back("-nobuiltininc");
3853 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003854 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003855 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003856 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3857 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3858 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003859
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003860 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003861 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003862 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003863
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003864 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3865
Ted Kremenekf7639e12012-03-06 20:06:33 +00003866 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003867 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003868 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003869 options::OPT_ccc_arcmt_modify,
3870 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003871 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003872 switch (A->getOption().getID()) {
3873 default:
3874 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003875 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003876 CmdArgs.push_back("-arcmt-check");
3877 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003878 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003879 CmdArgs.push_back("-arcmt-modify");
3880 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003881 case options::OPT_ccc_arcmt_migrate:
3882 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003883 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003884 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003885
3886 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3887 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003888 break;
John McCalld70fb982011-06-15 23:25:17 +00003889 }
3890 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003891 } else {
3892 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3893 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3894 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003895 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003896
Ted Kremenekf7639e12012-03-06 20:06:33 +00003897 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3898 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003899 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3900 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003901 }
3902 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003903 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003904
3905 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003906 options::OPT_objcmt_migrate_subscripting,
3907 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003908 // None specified, means enable them all.
3909 CmdArgs.push_back("-objcmt-migrate-literals");
3910 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003911 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003912 } else {
3913 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3914 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003915 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003916 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003917 } else {
3918 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3919 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3920 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3921 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3922 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3923 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003924 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003925 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3926 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3927 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3928 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3929 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3930 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3931 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003932 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003933 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003934 }
3935
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003936 // Add preprocessing options like -I, -D, etc. if we are using the
3937 // preprocessor.
3938 //
3939 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003940 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003941 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003942
Rafael Espindolaa7431922011-07-21 23:40:37 +00003943 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3944 // that "The compiler can only warn and ignore the option if not recognized".
3945 // When building with ccache, it will pass -D options to clang even on
3946 // preprocessed inputs and configure concludes that -fPIC is not supported.
3947 Args.ClaimAllArgs(options::OPT_D);
3948
Alp Toker7874bdc2013-11-15 20:40:58 +00003949 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003950 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3951 if (A->getOption().matches(options::OPT_O4)) {
3952 CmdArgs.push_back("-O3");
3953 D.Diag(diag::warn_O4_is_O3);
3954 } else {
3955 A->render(Args, CmdArgs);
3956 }
3957 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003958
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003959 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003960 for (const Arg *A :
3961 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3962 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00003963 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003964 }
3965
Rafael Espindola577637a2015-01-03 00:06:04 +00003966 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003967
Richard Smith3be1cb22014-08-07 00:24:21 +00003968 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003969 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003970 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3971 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003972 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003973 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003974
3975 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003976 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003977 //
3978 // If a std is supplied, only add -trigraphs if it follows the
3979 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003980 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003981 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3982 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003983 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003984 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003985 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003986 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003987 else
3988 Std->render(Args, CmdArgs);
3989
Nico Weber00721502014-12-23 22:32:37 +00003990 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003991 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003992 options::OPT_ftrigraphs,
3993 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003994 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003995 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003996 } else {
3997 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003998 //
3999 // FIXME: Clang doesn't correctly handle -std= when the input language
4000 // doesn't match. For the time being just ignore this for C++ inputs;
4001 // eventually we want to do all the standard defaulting here instead of
4002 // splitting it between the driver and clang -cc1.
4003 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004004 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4005 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004006 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004007 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004008
Nico Weber00721502014-12-23 22:32:37 +00004009 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4010 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004011 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004012
Richard Smith282b4492013-09-04 22:50:31 +00004013 // GCC's behavior for -Wwrite-strings is a bit strange:
4014 // * In C, this "warning flag" changes the types of string literals from
4015 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4016 // for the discarded qualifier.
4017 // * In C++, this is just a normal warning flag.
4018 //
4019 // Implementing this warning correctly in C is hard, so we follow GCC's
4020 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4021 // a non-const char* in C, rather than using this crude hack.
4022 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004023 // FIXME: This should behave just like a warning flag, and thus should also
4024 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4025 Arg *WriteStrings =
4026 Args.getLastArg(options::OPT_Wwrite_strings,
4027 options::OPT_Wno_write_strings, options::OPT_w);
4028 if (WriteStrings &&
4029 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004030 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004031 }
4032
Chandler Carruth61fbf622011-04-23 09:27:53 +00004033 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004034 // during C++ compilation, which it is by default. GCC keeps this define even
4035 // in the presence of '-w', match this behavior bug-for-bug.
4036 if (types::isCXX(InputType) &&
4037 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4038 true)) {
4039 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004040 }
4041
Chandler Carruthe0391482010-05-22 02:21:53 +00004042 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4043 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4044 if (Asm->getOption().matches(options::OPT_fasm))
4045 CmdArgs.push_back("-fgnu-keywords");
4046 else
4047 CmdArgs.push_back("-fno-gnu-keywords");
4048 }
4049
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004050 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4051 CmdArgs.push_back("-fno-dwarf-directory-asm");
4052
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004053 if (ShouldDisableAutolink(Args, getToolChain()))
4054 CmdArgs.push_back("-fno-autolink");
4055
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004056 // Add in -fdebug-compilation-dir if necessary.
4057 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004058
Richard Smith9a568822011-11-21 19:36:32 +00004059 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4060 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004061 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004062 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004063 }
4064
Richard Smith79c927b2013-11-06 19:31:51 +00004065 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4066 CmdArgs.push_back("-foperator-arrow-depth");
4067 CmdArgs.push_back(A->getValue());
4068 }
4069
Richard Smith9a568822011-11-21 19:36:32 +00004070 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4071 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004072 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004073 }
4074
Richard Smitha3d3bd22013-05-08 02:12:03 +00004075 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4076 CmdArgs.push_back("-fconstexpr-steps");
4077 CmdArgs.push_back(A->getValue());
4078 }
4079
Richard Smithb3a14522013-02-22 01:59:51 +00004080 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4081 CmdArgs.push_back("-fbracket-depth");
4082 CmdArgs.push_back(A->getValue());
4083 }
4084
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004085 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4086 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004087 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004088 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004089 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4090 } else
4091 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004092 }
4093
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004094 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004095 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004096
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004097 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4098 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004099 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004100 }
David Chisnall5778fce2009-08-31 16:41:57 +00004101
Chris Lattnere23003d2010-01-09 21:54:33 +00004102 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4103 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004104 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004105 }
4106
Chris Lattnerb35583d2010-04-07 20:49:23 +00004107 CmdArgs.push_back("-ferror-limit");
4108 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004109 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004110 else
4111 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004112
Chandler Carrutha77a7272010-05-06 04:55:18 +00004113 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4114 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004115 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004116 }
4117
4118 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4119 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004120 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004121 }
4122
Richard Smithf6f003a2011-12-16 19:06:07 +00004123 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4124 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004125 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004126 }
4127
Nick Lewycky24653262014-12-16 21:39:02 +00004128 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4129 CmdArgs.push_back("-fspell-checking-limit");
4130 CmdArgs.push_back(A->getValue());
4131 }
4132
Daniel Dunbar2c978472009-11-04 06:24:47 +00004133 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004134 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004135 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004136 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004137 } else {
4138 // If -fmessage-length=N was not specified, determine whether this is a
4139 // terminal and, if so, implicitly define -fmessage-length appropriately.
4140 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004141 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004142 }
4143
John McCallb4a99d32013-02-19 01:57:35 +00004144 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4145 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4146 options::OPT_fvisibility_ms_compat)) {
4147 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4148 CmdArgs.push_back("-fvisibility");
4149 CmdArgs.push_back(A->getValue());
4150 } else {
4151 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4152 CmdArgs.push_back("-fvisibility");
4153 CmdArgs.push_back("hidden");
4154 CmdArgs.push_back("-ftype-visibility");
4155 CmdArgs.push_back("default");
4156 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004157 }
4158
Douglas Gregor08329632010-06-15 17:05:35 +00004159 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004160
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004161 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4162
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004163 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004164 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4165 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004166 CmdArgs.push_back("-ffreestanding");
4167
Daniel Dunbare357d562009-12-03 18:42:11 +00004168 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004169 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004170 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00004171 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
4172 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00004173 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004174 // Emulated TLS is enabled by default on Android, and can be enabled manually
4175 // with -femulated-tls.
4176 bool EmulatedTLSDefault = Triple.getEnvironment() == llvm::Triple::Android;
4177 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4178 EmulatedTLSDefault))
4179 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004180 // AltiVec-like language extensions aren't relevant for assembling.
4181 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004182 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004183 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4184 }
Richard Trieu91844232012-06-26 18:18:47 +00004185 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4186 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004187
Alexey Bataevdb390212015-05-20 04:24:19 +00004188 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004189 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4190 options::OPT_fno_openmp, false))
4191 switch (getOpenMPRuntime(getToolChain(), Args)) {
4192 case OMPRT_OMP:
4193 case OMPRT_IOMP5:
4194 // Clang can generate useful OpenMP code for these two runtime libraries.
4195 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004196
4197 // If no option regarding the use of TLS in OpenMP codegeneration is
4198 // given, decide a default based on the target. Otherwise rely on the
4199 // options and pass the right information to the frontend.
4200 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004201 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004202 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004203 break;
4204 default:
4205 // By default, if Clang doesn't know how to generate useful OpenMP code
4206 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4207 // down to the actual compilation.
4208 // FIXME: It would be better to have a mode which *only* omits IR
4209 // generation based on the OpenMP support so that we get consistent
4210 // semantic analysis, etc.
4211 break;
4212 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004213
Peter Collingbourne32701642013-11-01 18:16:25 +00004214 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004215 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004216
Eric Christopher459d2712013-02-19 06:16:53 +00004217 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004218 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4219 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4220 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4221 Arch == llvm::Triple::ppc64le))
4222 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4223 << "ppc/ppc64/ppc64le";
4224 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004225
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004226 // -fzvector is incompatible with -faltivec.
4227 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4228 if (Args.hasArg(options::OPT_faltivec))
4229 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4230 << "-faltivec";
4231
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004232 if (getToolChain().SupportsProfiling())
4233 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004234
4235 // -flax-vector-conversions is default.
4236 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4237 options::OPT_fno_lax_vector_conversions))
4238 CmdArgs.push_back("-fno-lax-vector-conversions");
4239
John Brawna7b4ec02015-08-10 11:11:28 +00004240 if (Args.getLastArg(options::OPT_fapple_kext) ||
4241 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004242 CmdArgs.push_back("-fapple-kext");
4243
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004244 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004245 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004246 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004247 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4248 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004249
4250 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4251 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004252 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004253 }
4254
Bob Wilson14adb362012-02-03 06:27:22 +00004255 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004256
Chandler Carruth6e501032011-03-27 00:04:55 +00004257 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4258 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004259 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004260 if (A->getOption().matches(options::OPT_fwrapv))
4261 CmdArgs.push_back("-fwrapv");
4262 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4263 options::OPT_fno_strict_overflow)) {
4264 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4265 CmdArgs.push_back("-fwrapv");
4266 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004267
4268 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4269 options::OPT_fno_reroll_loops))
4270 if (A->getOption().matches(options::OPT_freroll_loops))
4271 CmdArgs.push_back("-freroll-loops");
4272
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004273 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004274 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4275 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004276
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004277 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4278
Daniel Dunbar4930e332009-11-17 08:07:36 +00004279 // -stack-protector=0 is default.
4280 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004281 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4282 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4283 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4284 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4285 Args.ClaimAllArgs(options::OPT_fstack_protector);
4286 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004287 options::OPT_fstack_protector_all,
4288 options::OPT_fstack_protector_strong,
4289 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004290 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004291 StackProtectorLevel = std::max<unsigned>(
4292 LangOptions::SSPOn,
4293 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004294 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004295 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004296 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004297 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004298 } else {
4299 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004300 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004301 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004302 if (StackProtectorLevel) {
4303 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004304 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004305 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004306
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004307 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004308 for (const Arg *A : Args.filtered(options::OPT__param)) {
4309 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004310 if (Str.startswith("ssp-buffer-size=")) {
4311 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004312 CmdArgs.push_back("-stack-protector-buffer-size");
4313 // FIXME: Verify the argument is a valid integer.
4314 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004315 }
Sean Silva14facf32015-06-09 01:57:17 +00004316 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004317 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004318 }
4319
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004320 // Translate -mstackrealign
4321 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004322 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004323 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004324
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004325 if (Args.hasArg(options::OPT_mstack_alignment)) {
4326 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4327 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004328 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004329
Hans Wennborg77dc2362015-01-20 19:45:50 +00004330 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4331 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4332
4333 if (!Size.empty())
4334 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4335 else
4336 CmdArgs.push_back("-mstack-probe-size=0");
4337 }
4338
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004339 switch (getToolChain().getArch()) {
4340 case llvm::Triple::aarch64:
4341 case llvm::Triple::aarch64_be:
4342 case llvm::Triple::arm:
4343 case llvm::Triple::armeb:
4344 case llvm::Triple::thumb:
4345 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004346 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004347 break;
4348
4349 default:
4350 break;
4351 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004352
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004353 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4354 options::OPT_mno_restrict_it)) {
4355 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4356 CmdArgs.push_back("-backend-option");
4357 CmdArgs.push_back("-arm-restrict-it");
4358 } else {
4359 CmdArgs.push_back("-backend-option");
4360 CmdArgs.push_back("-arm-no-restrict-it");
4361 }
James Y Knight2db38f32015-08-15 03:45:25 +00004362 } else if (Triple.isOSWindows() &&
4363 (Triple.getArch() == llvm::Triple::arm ||
4364 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004365 // Windows on ARM expects restricted IT blocks
4366 CmdArgs.push_back("-backend-option");
4367 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004368 }
4369
Daniel Dunbard18049a2009-04-07 21:16:11 +00004370 // Forward -f options with positive and negative forms; we translate
4371 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004372 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4373 StringRef fname = A->getValue();
4374 if (!llvm::sys::fs::exists(fname))
4375 D.Diag(diag::err_drv_no_such_file) << fname;
4376 else
4377 A->render(Args, CmdArgs);
4378 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004379
John Brawna7b4ec02015-08-10 11:11:28 +00004380 // -fbuiltin is default unless -mkernel is used
4381 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4382 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004383 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004384
Nuno Lopes13c88c72009-12-16 16:59:22 +00004385 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4386 options::OPT_fno_assume_sane_operator_new))
4387 CmdArgs.push_back("-fno-assume-sane-operator-new");
4388
Daniel Dunbar4930e332009-11-17 08:07:36 +00004389 // -fblocks=0 is default.
4390 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004391 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004392 (Args.hasArg(options::OPT_fgnu_runtime) &&
4393 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4394 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004395 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004396
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004397 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004398 !getToolChain().hasBlocksRuntime())
4399 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004400 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004401
Richard Smith47972af2015-06-16 00:08:24 +00004402 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004403 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004404 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004405 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004406 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004407 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4408 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004409 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004410 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004411 HaveModules = true;
4412 }
4413 }
4414
Richard Smith47972af2015-06-16 00:08:24 +00004415 // -fmodule-maps enables implicit reading of module map files. By default,
4416 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004417 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4418 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004419 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004420 }
4421
Daniel Jasperac42b752013-10-21 06:34:34 +00004422 // -fmodules-decluse checks that modules used are declared so (off by
4423 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004424 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004425 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004426 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004427 }
4428
Daniel Jasper962b38e2014-04-11 11:47:45 +00004429 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4430 // all #included headers are part of modules.
4431 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004432 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004433 CmdArgs.push_back("-fmodules-strict-decluse");
4434 }
4435
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004436 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4437 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4438 options::OPT_fno_implicit_modules)) {
4439 CmdArgs.push_back("-fno-implicit-modules");
4440 }
4441
Daniel Jasperac42b752013-10-21 06:34:34 +00004442 // -fmodule-name specifies the module that is currently being built (or
4443 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004444 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004445
Richard Smith9887d792014-10-17 01:42:53 +00004446 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004447 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004448 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004449
Richard Smithe842a472014-10-22 02:05:46 +00004450 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004451 if (HaveModules)
4452 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4453 else
4454 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004455
4456 // -fmodule-cache-path specifies where our implicitly-built module files
4457 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004458 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004459 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004460 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004461 if (HaveModules) {
4462 if (C.isForDiagnostics()) {
4463 // When generating crash reports, we want to emit the modules along with
4464 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004465 Path = Output.getFilename();
4466 llvm::sys::path::replace_extension(Path, ".cache");
4467 llvm::sys::path::append(Path, "modules");
4468 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004469 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004470 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004471 llvm::sys::path::append(Path, "org.llvm.clang.");
4472 appendUserToPath(Path);
4473 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004474 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004475 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004476 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4477 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004478 }
4479
4480 // When building modules and generating crashdumps, we need to dump a module
4481 // dependency VFS alongside the output.
4482 if (HaveModules && C.isForDiagnostics()) {
4483 SmallString<128> VFSDir(Output.getFilename());
4484 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004485 // Add the cache directory as a temp so the crash diagnostics pick it up.
4486 C.addTempFile(Args.MakeArgString(VFSDir));
4487
Justin Bognera88f0122014-06-20 22:59:50 +00004488 llvm::sys::path::append(VFSDir, "vfs");
4489 CmdArgs.push_back("-module-dependency-dir");
4490 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004491 }
4492
Richard Smith9887d792014-10-17 01:42:53 +00004493 if (HaveModules)
4494 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004495
Douglas Gregor35b04d62013-02-07 19:01:24 +00004496 // Pass through all -fmodules-ignore-macro arguments.
4497 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004498 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4499 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004500
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004501 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4502
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004503 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4504 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4505 D.Diag(diag::err_drv_argument_not_allowed_with)
4506 << A->getAsString(Args) << "-fbuild-session-timestamp";
4507
4508 llvm::sys::fs::file_status Status;
4509 if (llvm::sys::fs::status(A->getValue(), Status))
4510 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004511 CmdArgs.push_back(Args.MakeArgString(
4512 "-fbuild-session-timestamp=" +
4513 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004514 }
4515
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004516 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004517 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4518 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004519 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4520
4521 Args.AddLastArg(CmdArgs,
4522 options::OPT_fmodules_validate_once_per_build_session);
4523 }
4524
Ben Langmuirdcf73862014-03-12 00:06:17 +00004525 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4526
John McCalldfea9982010-04-09 19:12:06 +00004527 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004528 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004529 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004530 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004531
Anders Carlssond470fef2010-11-21 00:09:52 +00004532 // -felide-constructors is the default.
4533 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004534 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004535 CmdArgs.push_back("-fno-elide-constructors");
4536
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004537 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004538
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004539 if (KernelOrKext || (types::isCXX(InputType) &&
4540 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4541 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004542 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004543
Tony Linthicum76329bf2011-12-12 21:14:55 +00004544 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004545 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4546 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004547 CmdArgs.push_back("-fshort-enums");
4548
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004549 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004550 if (Arg *A = Args.getLastArg(
4551 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4552 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4553 if (A->getOption().matches(options::OPT_funsigned_char) ||
4554 A->getOption().matches(options::OPT_fno_signed_char)) {
4555 CmdArgs.push_back("-fno-signed-char");
4556 }
4557 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004558 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004559 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004560
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004561 // -fuse-cxa-atexit is default.
Vasileios Kalintirisddb517d2015-10-02 15:00:55 +00004562 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4563 options::OPT_fno_use_cxa_atexit,
4564 !IsWindowsCygnus && !IsWindowsGNU &&
4565 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4566 getToolChain().getArch() != llvm::Triple::hexagon &&
4567 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004568 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004569 CmdArgs.push_back("-fno-use-cxa-atexit");
4570
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004571 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004572 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004573 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004574 CmdArgs.push_back("-fms-extensions");
4575
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004576 // -fno-use-line-directives is default.
4577 if (Args.hasFlag(options::OPT_fuse_line_directives,
4578 options::OPT_fno_use_line_directives, false))
4579 CmdArgs.push_back("-fuse-line-directives");
4580
Francois Pichet1b4f1632011-09-17 04:32:15 +00004581 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004582 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004583 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004584 (IsWindowsMSVC &&
4585 Args.hasFlag(options::OPT_fms_extensions,
4586 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004587 CmdArgs.push_back("-fms-compatibility");
4588
David Majnemerc371ff02015-03-22 08:39:22 +00004589 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004590 VersionTuple MSVT = visualstudio::getMSVCVersion(
4591 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4592 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004593 CmdArgs.push_back(
4594 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004595
David Majnemer8db91762015-05-18 04:49:30 +00004596 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4597 if (ImplyVCPPCXXVer) {
4598 if (IsMSVC2015Compatible)
4599 CmdArgs.push_back("-std=c++14");
4600 else
4601 CmdArgs.push_back("-std=c++11");
4602 }
4603
Eric Christopher5ecce122013-02-18 00:38:31 +00004604 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004605 if (Args.hasFlag(options::OPT_fborland_extensions,
4606 options::OPT_fno_borland_extensions, false))
4607 CmdArgs.push_back("-fborland-extensions");
4608
David Majnemerc371ff02015-03-22 08:39:22 +00004609 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4610 // than 19.
4611 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4612 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004613 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004614 CmdArgs.push_back("-fno-threadsafe-statics");
4615
Francois Pichet02744872011-09-01 16:38:08 +00004616 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4617 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004618 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004619 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004620 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004621
Chandler Carruthe03aa552010-04-17 20:17:31 +00004622 // -fgnu-keywords default varies depending on language; only pass if
4623 // specified.
4624 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004625 options::OPT_fno_gnu_keywords))
4626 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004627
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004628 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004629 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004630 CmdArgs.push_back("-fgnu89-inline");
4631
Chad Rosier9c76d242012-03-15 22:31:42 +00004632 if (Args.hasArg(options::OPT_fno_inline))
4633 CmdArgs.push_back("-fno-inline");
4634
Chad Rosier64d6be92012-03-06 21:17:19 +00004635 if (Args.hasArg(options::OPT_fno_inline_functions))
4636 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004637
John McCall5fb5df92012-06-20 06:18:46 +00004638 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004639
John McCall5fb5df92012-06-20 06:18:46 +00004640 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004641 // legacy is the default. Except for deployment taget of 10.5,
4642 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4643 // gets ignored silently.
4644 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004645 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4646 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004647 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004648 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004649 if (getToolChain().UseObjCMixedDispatch())
4650 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4651 else
4652 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4653 }
4654 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004655
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004656 // When ObjectiveC legacy runtime is in effect on MacOSX,
4657 // turn on the option to do Array/Dictionary subscripting
4658 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004659 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004660 getToolChain().getTriple().isMacOSX() &&
4661 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4662 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004663 objcRuntime.isNeXTFamily())
4664 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004665
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004666 // -fencode-extended-block-signature=1 is default.
4667 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4668 CmdArgs.push_back("-fencode-extended-block-signature");
4669 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004670
John McCall24fc0de2011-07-06 00:26:06 +00004671 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4672 // NOTE: This logic is duplicated in ToolChains.cpp.
4673 bool ARC = isObjCAutoRefCount(Args);
4674 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004675 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004676
John McCall24fc0de2011-07-06 00:26:06 +00004677 CmdArgs.push_back("-fobjc-arc");
4678
Chandler Carruth491db322011-11-04 07:34:47 +00004679 // FIXME: It seems like this entire block, and several around it should be
4680 // wrapped in isObjC, but for now we just use it here as this is where it
4681 // was being used previously.
4682 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4683 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4684 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4685 else
4686 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4687 }
4688
John McCall24fc0de2011-07-06 00:26:06 +00004689 // Allow the user to enable full exceptions code emission.
4690 // We define off for Objective-CC, on for Objective-C++.
4691 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4692 options::OPT_fno_objc_arc_exceptions,
4693 /*default*/ types::isCXX(InputType)))
4694 CmdArgs.push_back("-fobjc-arc-exceptions");
4695 }
4696
4697 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4698 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004699 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004700 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004701
John McCall24fc0de2011-07-06 00:26:06 +00004702 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4703 // takes precedence.
4704 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4705 if (!GCArg)
4706 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4707 if (GCArg) {
4708 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004709 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004710 } else if (getToolChain().SupportsObjCGC()) {
4711 GCArg->render(Args, CmdArgs);
4712 } else {
4713 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004714 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004715 }
4716 }
4717
Bob Wilsonb111ec92015-03-02 19:01:14 +00004718 if (Args.hasFlag(options::OPT_fapplication_extension,
4719 options::OPT_fno_application_extension, false))
4720 CmdArgs.push_back("-fapplication-extension");
4721
Reid Klecknerc542d372014-06-27 17:02:02 +00004722 // Handle GCC-style exception args.
4723 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004724 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4725 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004726
4727 if (getToolChain().UseSjLjExceptions())
4728 CmdArgs.push_back("-fsjlj-exceptions");
4729
4730 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004731 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4732 options::OPT_fno_assume_sane_operator_new))
4733 CmdArgs.push_back("-fno-assume-sane-operator-new");
4734
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004735 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4736 // most platforms.
4737 if (Args.hasFlag(options::OPT_fsized_deallocation,
4738 options::OPT_fno_sized_deallocation, false))
4739 CmdArgs.push_back("-fsized-deallocation");
4740
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004741 // -fconstant-cfstrings is default, and may be subject to argument translation
4742 // on Darwin.
4743 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4744 options::OPT_fno_constant_cfstrings) ||
4745 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4746 options::OPT_mno_constant_cfstrings))
4747 CmdArgs.push_back("-fno-constant-cfstrings");
4748
John Thompsoned4e2952009-11-05 20:14:16 +00004749 // -fshort-wchar default varies depending on platform; only
4750 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004751 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4752 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004753 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004754
Hans Wennborg28c96312013-07-31 23:39:13 +00004755 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004756 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004757 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004758 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004759
Daniel Dunbar096ed292011-10-05 21:04:55 +00004760 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4761 // -fno-pack-struct doesn't apply to -fpack-struct=.
4762 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004763 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004764 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004765 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004766 } else if (Args.hasFlag(options::OPT_fpack_struct,
4767 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004768 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004769 }
4770
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004771 // Handle -fmax-type-align=N and -fno-type-align
4772 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4773 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4774 if (!SkipMaxTypeAlign) {
4775 std::string MaxTypeAlignStr = "-fmax-type-align=";
4776 MaxTypeAlignStr += A->getValue();
4777 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4778 }
4779 } else if (getToolChain().getTriple().isOSDarwin()) {
4780 if (!SkipMaxTypeAlign) {
4781 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4782 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4783 }
4784 }
4785
John Brawna7b4ec02015-08-10 11:11:28 +00004786 // -fcommon is the default unless compiling kernel code or the target says so
4787 bool NoCommonDefault =
4788 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
4789 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
4790 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004791 CmdArgs.push_back("-fno-common");
4792
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004793 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004794 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004795 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004796 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004797 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004798 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004799
Daniel Dunbar6358d682010-10-15 22:30:42 +00004800 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004801 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004802 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004803 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004804
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004805 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004806 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4807 StringRef value = inputCharset->getValue();
4808 if (value != "UTF-8")
4809 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4810 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004811 }
4812
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004813 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004814 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4815 StringRef value = execCharset->getValue();
4816 if (value != "UTF-8")
4817 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4818 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004819 }
4820
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004821 // -fcaret-diagnostics is default.
4822 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4823 options::OPT_fno_caret_diagnostics, true))
4824 CmdArgs.push_back("-fno-caret-diagnostics");
4825
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004826 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004827 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004828 options::OPT_fno_diagnostics_fixit_info))
4829 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004830
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004831 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004832 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004833 options::OPT_fno_diagnostics_show_option))
4834 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004835
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004836 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004837 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004838 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004839 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004840 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004841
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004842 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004843 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004844 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004845 }
4846
Chandler Carruthb6766f02011-03-27 01:50:55 +00004847 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004848 options::OPT_fdiagnostics_show_note_include_stack,
4849 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004850 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004851 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004852 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4853 else
4854 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4855 }
4856
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004857 // Color diagnostics are the default, unless the terminal doesn't support
4858 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004859 // Support both clang's -f[no-]color-diagnostics and gcc's
4860 // -f[no-]diagnostics-colors[=never|always|auto].
4861 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004862 for (const auto &Arg : Args) {
4863 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004864 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4865 !O.matches(options::OPT_fdiagnostics_color) &&
4866 !O.matches(options::OPT_fno_color_diagnostics) &&
4867 !O.matches(options::OPT_fno_diagnostics_color) &&
4868 !O.matches(options::OPT_fdiagnostics_color_EQ))
4869 continue;
4870
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004871 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004872 if (O.matches(options::OPT_fcolor_diagnostics) ||
4873 O.matches(options::OPT_fdiagnostics_color)) {
4874 ShowColors = Colors_On;
4875 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4876 O.matches(options::OPT_fno_diagnostics_color)) {
4877 ShowColors = Colors_Off;
4878 } else {
4879 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004880 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004881 if (value == "always")
4882 ShowColors = Colors_On;
4883 else if (value == "never")
4884 ShowColors = Colors_Off;
4885 else if (value == "auto")
4886 ShowColors = Colors_Auto;
4887 else
4888 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004889 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004890 }
4891 }
4892 if (ShowColors == Colors_On ||
4893 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004894 CmdArgs.push_back("-fcolor-diagnostics");
4895
Nico Rieck7857d462013-09-11 00:38:02 +00004896 if (Args.hasArg(options::OPT_fansi_escape_codes))
4897 CmdArgs.push_back("-fansi-escape-codes");
4898
Daniel Dunbardb097022009-06-08 21:13:54 +00004899 if (!Args.hasFlag(options::OPT_fshow_source_location,
4900 options::OPT_fno_show_source_location))
4901 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004902
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004903 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004904 true))
4905 CmdArgs.push_back("-fno-show-column");
4906
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004907 if (!Args.hasFlag(options::OPT_fspell_checking,
4908 options::OPT_fno_spell_checking))
4909 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004910
Chad Rosierc8e56e82012-12-05 21:08:21 +00004911 // -fno-asm-blocks is default.
4912 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4913 false))
4914 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004915
Steven Wucb0d13f2015-01-16 23:05:28 +00004916 // -fgnu-inline-asm is default.
4917 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4918 options::OPT_fno_gnu_inline_asm, true))
4919 CmdArgs.push_back("-fno-gnu-inline-asm");
4920
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004921 // Enable vectorization per default according to the optimization level
4922 // selected. For optimization levels that want vectorization we use the alias
4923 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004924 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004925 OptSpecifier VectorizeAliasOption =
4926 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004927 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004928 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004929 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004930
Chad Rosier136d67d2014-04-28 19:30:57 +00004931 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004932 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004933 OptSpecifier SLPVectAliasOption =
4934 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00004935 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004936 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004937 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004938
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004939 // -fno-slp-vectorize-aggressive is default.
4940 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004941 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004942 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004943
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004944 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4945 A->render(Args, CmdArgs);
4946
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004947 // -fdollars-in-identifiers default varies depending on platform and
4948 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004949 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004950 options::OPT_fno_dollars_in_identifiers)) {
4951 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004952 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004953 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004954 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004955 }
4956
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004957 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4958 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004959 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004960 options::OPT_fno_unit_at_a_time)) {
4961 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004962 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004963 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004964
Eli Friedman055c9702011-11-02 01:53:16 +00004965 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4966 options::OPT_fno_apple_pragma_pack, false))
4967 CmdArgs.push_back("-fapple-pragma-pack");
4968
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004969 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004970 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4971 // by default.
4972 if (getToolChain().getArch() == llvm::Triple::le32) {
4973 CmdArgs.push_back("-fno-math-builtin");
4974 }
4975
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004976// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4977//
4978// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004979#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004980 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004981 (getToolChain().getArch() == llvm::Triple::arm ||
4982 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004983 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4984 CmdArgs.push_back("-fno-builtin-strcat");
4985 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4986 CmdArgs.push_back("-fno-builtin-strcpy");
4987 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004988#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004989
Justin Bognera88f0122014-06-20 22:59:50 +00004990 // Enable rewrite includes if the user's asked for it or if we're generating
4991 // diagnostics.
4992 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4993 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004994 if (Args.hasFlag(options::OPT_frewrite_includes,
4995 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004996 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004997 CmdArgs.push_back("-frewrite-includes");
4998
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004999 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005000 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005001 options::OPT_traditional_cpp)) {
5002 if (isa<PreprocessJobAction>(JA))
5003 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005004 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005005 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005006 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005007
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005008 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005009 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005010
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005011 // Handle serialized diagnostics.
5012 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5013 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005014 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005015 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005016
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005017 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5018 CmdArgs.push_back("-fretain-comments-from-system-headers");
5019
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005020 // Forward -fcomment-block-commands to -cc1.
5021 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005022 // Forward -fparse-all-comments to -cc1.
5023 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005024
John Brawnad31ace2015-09-23 13:55:40 +00005025 // Turn -fplugin=name.so into -load name.so
5026 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5027 CmdArgs.push_back("-load");
5028 CmdArgs.push_back(A->getValue());
5029 A->claim();
5030 }
5031
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005032 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5033 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005034 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005035 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5036 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005037
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005038 // We translate this by hand to the -cc1 argument, since nightly test uses
5039 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005040 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005041 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005042 } else
Sean Silva14facf32015-06-09 01:57:17 +00005043 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005044 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005045
Bob Wilson23a55f12014-12-21 07:00:00 +00005046 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005047 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5048 // by the frontend.
5049 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5050 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005051
Daniel Dunbard67a3222009-03-30 06:36:42 +00005052 if (Output.getType() == types::TY_Dependencies) {
5053 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005054 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005055 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005056 CmdArgs.push_back(Output.getFilename());
5057 } else {
5058 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005059 }
5060
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005061 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005062
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005063 if (Input.isFilename())
5064 CmdArgs.push_back(Input.getFilename());
5065 else
5066 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005067
Chris Lattnere9d7d782009-11-03 19:50:27 +00005068 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5069
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005070 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005071
5072 // Optionally embed the -cc1 level arguments into the debug info, for build
5073 // analysis.
5074 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005075 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005076 for (const auto &Arg : Args)
5077 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005078
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005079 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005080 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005081 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005082 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005083 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005084 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005085 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005086 }
5087 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005088 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005089 }
5090
Eric Christopherd3804002013-02-22 20:12:52 +00005091 // Add the split debug info name to the command lines here so we
5092 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005093 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005094 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5095 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005096 const char *SplitDwarfOut;
5097 if (SplitDwarf) {
5098 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005099 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005100 CmdArgs.push_back(SplitDwarfOut);
5101 }
5102
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005103 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5104 // Include them with -fcuda-include-gpubinary.
5105 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005106 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005107 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005108 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005109 }
5110
Eric Christopherd3804002013-02-22 20:12:52 +00005111 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005112 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005113 Output.getType() == types::TY_Object &&
5114 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005115 auto CLCommand =
5116 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005117 C.addCommand(llvm::make_unique<FallbackCommand>(
5118 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005119 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005120 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005121 }
5122
Eric Christopherf1545832013-02-22 23:50:16 +00005123 // Handle the debug info splitting at object creation time if we're
5124 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005125 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005126 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005127 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005128
Roman Divacky178e01602011-02-10 16:52:03 +00005129 if (Arg *A = Args.getLastArg(options::OPT_pg))
5130 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005131 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5132 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005133
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005134 // Claim some arguments which clang supports automatically.
5135
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005136 // -fpch-preprocess is used with gcc to add a special marker in the output to
5137 // include the PCH file. Clang's PTH solution is completely transparent, so we
5138 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005139 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005140
Daniel Dunbar17731772009-03-23 19:03:36 +00005141 // Claim some arguments which clang doesn't support, but we don't
5142 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005143 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5144 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005145
Rafael Espindolab0092d72013-09-04 19:37:35 +00005146 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005147 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005148}
5149
John McCall5fb5df92012-06-20 06:18:46 +00005150/// Add options related to the Objective-C runtime/ABI.
5151///
5152/// Returns true if the runtime is non-fragile.
5153ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5154 ArgStringList &cmdArgs,
5155 RewriteKind rewriteKind) const {
5156 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005157 Arg *runtimeArg =
5158 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5159 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005160
5161 // Just forward -fobjc-runtime= to the frontend. This supercedes
5162 // options about fragility.
5163 if (runtimeArg &&
5164 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5165 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005166 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005167 if (runtime.tryParse(value)) {
5168 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005169 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005170 }
5171
5172 runtimeArg->render(args, cmdArgs);
5173 return runtime;
5174 }
5175
5176 // Otherwise, we'll need the ABI "version". Version numbers are
5177 // slightly confusing for historical reasons:
5178 // 1 - Traditional "fragile" ABI
5179 // 2 - Non-fragile ABI, version 1
5180 // 3 - Non-fragile ABI, version 2
5181 unsigned objcABIVersion = 1;
5182 // If -fobjc-abi-version= is present, use that to set the version.
5183 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005184 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005185 if (value == "1")
5186 objcABIVersion = 1;
5187 else if (value == "2")
5188 objcABIVersion = 2;
5189 else if (value == "3")
5190 objcABIVersion = 3;
5191 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005192 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005193 } else {
5194 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005195 bool nonFragileABIIsDefault =
5196 (rewriteKind == RK_NonFragile ||
5197 (rewriteKind == RK_None &&
5198 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005199 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5200 options::OPT_fno_objc_nonfragile_abi,
5201 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005202// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005203#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5204 unsigned nonFragileABIVersion = 1;
5205#else
5206 unsigned nonFragileABIVersion = 2;
5207#endif
5208
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005209 if (Arg *abiArg =
5210 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005211 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005212 if (value == "1")
5213 nonFragileABIVersion = 1;
5214 else if (value == "2")
5215 nonFragileABIVersion = 2;
5216 else
5217 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005218 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005219 }
5220
5221 objcABIVersion = 1 + nonFragileABIVersion;
5222 } else {
5223 objcABIVersion = 1;
5224 }
5225 }
5226
5227 // We don't actually care about the ABI version other than whether
5228 // it's non-fragile.
5229 bool isNonFragile = objcABIVersion != 1;
5230
5231 // If we have no runtime argument, ask the toolchain for its default runtime.
5232 // However, the rewriter only really supports the Mac runtime, so assume that.
5233 ObjCRuntime runtime;
5234 if (!runtimeArg) {
5235 switch (rewriteKind) {
5236 case RK_None:
5237 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5238 break;
5239 case RK_Fragile:
5240 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5241 break;
5242 case RK_NonFragile:
5243 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5244 break;
5245 }
5246
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005247 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005248 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5249 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005250 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005251 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5252
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005253 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005254 } else {
5255 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5256 }
5257
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005258 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005259 } else {
5260 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005261 // Legacy behaviour is to target the gnustep runtime if we are i
5262 // non-fragile mode or the GCC runtime in fragile mode.
5263 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005264 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005265 else
5266 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005267 }
5268
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005269 cmdArgs.push_back(
5270 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005271 return runtime;
5272}
5273
Reid Klecknerc542d372014-06-27 17:02:02 +00005274static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5275 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5276 I += HaveDash;
5277 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005278}
Reid Klecknerc542d372014-06-27 17:02:02 +00005279
5280struct EHFlags {
5281 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5282 bool Synch;
5283 bool Asynch;
5284 bool NoExceptC;
5285};
5286
5287/// /EH controls whether to run destructor cleanups when exceptions are
5288/// thrown. There are three modifiers:
5289/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5290/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5291/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5292/// - c: Assume that extern "C" functions are implicitly noexcept. This
5293/// modifier is an optimization, so we ignore it for now.
5294/// The default is /EHs-c-, meaning cleanups are disabled.
5295static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5296 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005297
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005298 std::vector<std::string> EHArgs =
5299 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005300 for (auto EHVal : EHArgs) {
5301 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5302 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005303 case 'a':
5304 EH.Asynch = maybeConsumeDash(EHVal, I);
5305 continue;
5306 case 'c':
5307 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5308 continue;
5309 case 's':
5310 EH.Synch = maybeConsumeDash(EHVal, I);
5311 continue;
5312 default:
5313 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005314 }
5315 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5316 break;
5317 }
5318 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005319
Reid Kleckner5c6efed2015-07-14 18:16:48 +00005320 // FIXME: Disable C++ EH completely, until it becomes more reliable. Users
5321 // can use -Xclang to manually enable C++ EH until then.
5322 EH = EHFlags();
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005323
Reid Klecknerc542d372014-06-27 17:02:02 +00005324 return EH;
5325}
5326
Hans Wennborg75958c42013-08-08 00:17:41 +00005327void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5328 unsigned RTOptionID = options::OPT__SLASH_MT;
5329
Hans Wennborgf1a74252013-09-10 20:18:04 +00005330 if (Args.hasArg(options::OPT__SLASH_LDd))
5331 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5332 // but defining _DEBUG is sticky.
5333 RTOptionID = options::OPT__SLASH_MTd;
5334
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005335 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005336 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005337
David Majnemere2afb472015-07-24 06:49:13 +00005338 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005339 switch (RTOptionID) {
5340 case options::OPT__SLASH_MD:
5341 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005342 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005343 CmdArgs.push_back("-D_MT");
5344 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005345 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005346 break;
5347 case options::OPT__SLASH_MDd:
5348 CmdArgs.push_back("-D_DEBUG");
5349 CmdArgs.push_back("-D_MT");
5350 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005351 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005352 break;
5353 case options::OPT__SLASH_MT:
5354 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005355 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005356 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005357 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005358 break;
5359 case options::OPT__SLASH_MTd:
5360 CmdArgs.push_back("-D_DEBUG");
5361 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005362 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005363 break;
5364 default:
5365 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005366 }
5367
David Majnemere2afb472015-07-24 06:49:13 +00005368 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5369 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5370 } else {
5371 CmdArgs.push_back(FlagForCRT.data());
5372
5373 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5374 // users want. The /Za flag to cl.exe turns this off, but it's not
5375 // implemented in clang.
5376 CmdArgs.push_back("--dependent-lib=oldnames");
5377 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005378
Hans Wennborg8858a032014-07-21 23:42:07 +00005379 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5380 // would produce interleaved output, so ignore /showIncludes in such cases.
5381 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5382 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5383 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005384
David Majnemerf6072342014-07-01 22:24:56 +00005385 // This controls whether or not we emit RTTI data for polymorphic types.
5386 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5387 /*default=*/false))
5388 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005389
Reid Kleckner124955a2015-08-05 18:51:13 +00005390 // Emit CodeView if -Z7 is present.
5391 bool EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
5392 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5393 // If we are emitting CV but not DWARF, don't build information that LLVM
5394 // can't yet process.
5395 if (EmitCodeView && !EmitDwarf)
5396 CmdArgs.push_back("-gline-tables-only");
5397 if (EmitCodeView)
5398 CmdArgs.push_back("-gcodeview");
5399
Reid Klecknerc542d372014-06-27 17:02:02 +00005400 const Driver &D = getToolChain().getDriver();
5401 EHFlags EH = parseClangCLEHFlags(D, Args);
5402 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005403 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005404 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005405 CmdArgs.push_back("-fexceptions");
5406 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005407
Hans Wennborge50cec32014-06-13 20:59:54 +00005408 // /EP should expand to -E -P.
5409 if (Args.hasArg(options::OPT__SLASH_EP)) {
5410 CmdArgs.push_back("-E");
5411 CmdArgs.push_back("-P");
5412 }
5413
David Majnemera5b195a2015-02-14 01:35:12 +00005414 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005415 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5416 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005417 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5418 else
5419 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5420
5421 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5422 VolatileOptionID = A->getOption().getID();
5423
5424 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5425 CmdArgs.push_back("-fms-volatile");
5426
David Majnemer86c318f2014-02-11 21:05:00 +00005427 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5428 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5429 if (MostGeneralArg && BestCaseArg)
5430 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5431 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5432
5433 if (MostGeneralArg) {
5434 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5435 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5436 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5437
5438 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5439 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5440 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5441 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5442 << FirstConflict->getAsString(Args)
5443 << SecondConflict->getAsString(Args);
5444
5445 if (SingleArg)
5446 CmdArgs.push_back("-fms-memptr-rep=single");
5447 else if (MultipleArg)
5448 CmdArgs.push_back("-fms-memptr-rep=multiple");
5449 else
5450 CmdArgs.push_back("-fms-memptr-rep=virtual");
5451 }
5452
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005453 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5454 A->render(Args, CmdArgs);
5455
Hans Wennborg81f74482013-09-10 01:07:07 +00005456 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5457 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005458 if (Args.hasArg(options::OPT__SLASH_fallback))
5459 CmdArgs.push_back("msvc-fallback");
5460 else
5461 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005462 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005463}
5464
Douglas Katzman95354292015-06-23 20:42:09 +00005465visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005466 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005467 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005468 return CLFallback.get();
5469}
5470
Daniel Sanders7f933f42015-01-30 17:35:23 +00005471void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5472 ArgStringList &CmdArgs) const {
5473 StringRef CPUName;
5474 StringRef ABIName;
5475 const llvm::Triple &Triple = getToolChain().getTriple();
5476 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5477
5478 CmdArgs.push_back("-target-abi");
5479 CmdArgs.push_back(ABIName.data());
5480}
5481
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005482void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005483 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005484 const ArgList &Args,
5485 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005486 ArgStringList CmdArgs;
5487
5488 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5489 const InputInfo &Input = Inputs[0];
5490
James Y Knight2db38f32015-08-15 03:45:25 +00005491 std::string TripleStr =
5492 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5493 const llvm::Triple Triple(TripleStr);
5494
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005495 // Don't warn about "clang -w -c foo.s"
5496 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005497 // and "clang -emit-llvm -c foo.s"
5498 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005499
Rafael Espindola577637a2015-01-03 00:06:04 +00005500 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005501
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005502 // Invoke ourselves in -cc1as mode.
5503 //
5504 // FIXME: Implement custom jobs for internal actions.
5505 CmdArgs.push_back("-cc1as");
5506
5507 // Add the "effective" target triple.
5508 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005509 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5510
5511 // Set the output mode, we currently only expect to be used as a real
5512 // assembler.
5513 CmdArgs.push_back("-filetype");
5514 CmdArgs.push_back("obj");
5515
Eric Christopher45f2e712012-12-18 00:31:10 +00005516 // Set the main file name, so that debug info works even with
5517 // -save-temps or preprocessed assembly.
5518 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005519 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005520
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005521 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005522 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005523 if (!CPU.empty()) {
5524 CmdArgs.push_back("-target-cpu");
5525 CmdArgs.push_back(Args.MakeArgString(CPU));
5526 }
5527
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005528 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005529 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005530
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005531 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005532 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005533
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005534 // Pass along any -I options so we get proper .include search paths.
5535 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5536
Eric Christopherfc3ee562012-01-10 00:38:01 +00005537 // Determine the original source input.
5538 const Action *SourceAction = &JA;
5539 while (SourceAction->getKind() != Action::InputClass) {
5540 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5541 SourceAction = SourceAction->getInputs()[0];
5542 }
5543
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005544 // Forward -g and handle debug info related flags, assuming we are dealing
5545 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005546 if (SourceAction->getType() == types::TY_Asm ||
5547 SourceAction->getType() == types::TY_PP_Asm) {
5548 Args.ClaimAllArgs(options::OPT_g_Group);
5549 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5550 if (!A->getOption().matches(options::OPT_g0))
5551 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005552
Douglas Katzman553927a2015-09-14 20:31:28 +00005553 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
5554 options::OPT_gdwarf_4))
5555 A->render(Args, CmdArgs);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005556
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005557 // Add the -fdebug-compilation-dir flag if needed.
5558 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005559
5560 // Set the AT_producer to the clang version when using the integrated
5561 // assembler on assembly source files.
5562 CmdArgs.push_back("-dwarf-debug-producer");
5563 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005564
5565 // And pass along -I options
5566 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005567 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005568
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005569 // Handle -fPIC et al -- the relocation-model affects the assembler
5570 // for some targets.
5571 llvm::Reloc::Model RelocationModel;
5572 unsigned PICLevel;
5573 bool IsPIE;
5574 std::tie(RelocationModel, PICLevel, IsPIE) =
5575 ParsePICArgs(getToolChain(), Triple, Args);
5576
5577 const char *RMName = RelocationModelName(RelocationModel);
5578 if (RMName) {
5579 CmdArgs.push_back("-mrelocation-model");
5580 CmdArgs.push_back(RMName);
5581 }
5582
Kevin Enderby292dc082011-12-22 19:31:58 +00005583 // Optionally embed the -cc1as level arguments into the debug info, for build
5584 // analysis.
5585 if (getToolChain().UseDwarfDebugFlags()) {
5586 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005587 for (const auto &Arg : Args)
5588 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005589
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005590 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005591 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5592 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005593 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005594 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005595 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005596 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005597 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005598 }
5599 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005600 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005601 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005602
5603 // FIXME: Add -static support, once we have it.
5604
Daniel Sanders7f933f42015-01-30 17:35:23 +00005605 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005606 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005607 default:
5608 break;
5609
5610 case llvm::Triple::mips:
5611 case llvm::Triple::mipsel:
5612 case llvm::Triple::mips64:
5613 case llvm::Triple::mips64el:
5614 AddMIPSTargetArgs(Args, CmdArgs);
5615 break;
5616 }
5617
David Blaikie372d9502014-01-17 03:17:40 +00005618 // Consume all the warning flags. Usually this would be handled more
5619 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5620 // doesn't handle that so rather than warning about unused flags that are
5621 // actually used, we'll lie by omission instead.
5622 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005623 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5624 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005625
David Blaikie9260ed62013-07-25 21:19:01 +00005626 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5627 getToolChain().getDriver());
5628
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005629 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005630
5631 assert(Output.isFilename() && "Unexpected lipo output.");
5632 CmdArgs.push_back("-o");
5633 CmdArgs.push_back(Output.getFilename());
5634
Daniel Dunbarb440f562010-08-02 02:38:21 +00005635 assert(Input.isFilename() && "Invalid input.");
5636 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005637
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005638 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005639 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005640
5641 // Handle the debug info splitting at object creation time if we're
5642 // creating an object.
5643 // TODO: Currently only works on linux with newer objcopy.
5644 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005645 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005646 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005647 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005648}
5649
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005650void GnuTool::anchor() {}
5651
Daniel Dunbara3246a02009-03-18 08:07:30 +00005652void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005653 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005654 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005655 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005656 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005657 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005658
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005659 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005660 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005661 // Don't forward any -g arguments to assembly steps.
5662 if (isa<AssembleJobAction>(JA) &&
5663 A->getOption().matches(options::OPT_g_Group))
5664 continue;
5665
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005666 // Don't forward any -W arguments to assembly and link steps.
5667 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5668 A->getOption().matches(options::OPT_W_Group))
5669 continue;
5670
Daniel Dunbar2da02722009-03-19 07:55:12 +00005671 // It is unfortunate that we have to claim here, as this means
5672 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005673 // platforms using a generic gcc, even if we are just using gcc
5674 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005675 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005676 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005677 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005678 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005679
Daniel Dunbar4e295052010-01-25 22:35:08 +00005680 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005681
5682 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005683 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005684 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005685 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005686 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005687 }
5688
Daniel Dunbar5716d872009-05-02 21:41:52 +00005689 // Try to force gcc to match the tool chain we want, if we recognize
5690 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005691 //
5692 // FIXME: The triple class should directly provide the information we want
5693 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005694 switch (getToolChain().getArch()) {
5695 default:
5696 break;
5697 case llvm::Triple::x86:
5698 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005699 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005700 break;
5701 case llvm::Triple::x86_64:
5702 case llvm::Triple::ppc64:
5703 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005704 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005705 break;
5706 case llvm::Triple::sparcel:
5707 CmdArgs.push_back("-EL");
5708 break;
5709 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005710
Daniel Dunbarb440f562010-08-02 02:38:21 +00005711 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005712 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005713 CmdArgs.push_back(Output.getFilename());
5714 } else {
5715 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005716 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005717 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005718
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005719 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005720
5721 // Only pass -x if gcc will understand it; otherwise hope gcc
5722 // understands the suffix correctly. The main use case this would go
5723 // wrong in is for linker inputs if they happened to have an odd
5724 // suffix; really the only way to get this to happen is a command
5725 // like '-x foobar a.c' which will treat a.c like a linker input.
5726 //
5727 // FIXME: For the linker case specifically, can we safely convert
5728 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005729 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005730 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005731 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5732 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005733 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005734 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005735 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005736 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005737 else if (II.getType() == types::TY_ModuleFile)
5738 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005739 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005740
Daniel Dunbara3246a02009-03-18 08:07:30 +00005741 if (types::canTypeBeUserSpecified(II.getType())) {
5742 CmdArgs.push_back("-x");
5743 CmdArgs.push_back(types::getTypeName(II.getType()));
5744 }
5745
Daniel Dunbarb440f562010-08-02 02:38:21 +00005746 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005747 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005748 else {
5749 const Arg &A = II.getInputArg();
5750
5751 // Reverse translate some rewritten options.
5752 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5753 CmdArgs.push_back("-lstdc++");
5754 continue;
5755 }
5756
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005757 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005758 A.render(Args, CmdArgs);
5759 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005760 }
5761
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005762 const std::string customGCCName = D.getCCCGenericGCCName();
5763 const char *GCCName;
5764 if (!customGCCName.empty())
5765 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005766 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005767 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005768 } else
5769 GCCName = "gcc";
5770
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005771 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005772 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005773}
5774
Douglas Katzman95354292015-06-23 20:42:09 +00005775void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5776 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005777 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005778}
5779
Douglas Katzman95354292015-06-23 20:42:09 +00005780void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5781 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005782 const Driver &D = getToolChain().getDriver();
5783
Eric Christophercc7ff502015-01-29 00:56:17 +00005784 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005785 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005786 case types::TY_LLVM_IR:
5787 case types::TY_LTO_IR:
5788 case types::TY_LLVM_BC:
5789 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005790 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005791 break;
5792 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005793 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005794 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005795 case types::TY_Nothing:
5796 CmdArgs.push_back("-fsyntax-only");
5797 break;
5798 default:
5799 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005800 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005801}
5802
Douglas Katzman95354292015-06-23 20:42:09 +00005803void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5804 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005805 // The types are (hopefully) good enough.
5806}
5807
Tony Linthicum76329bf2011-12-12 21:14:55 +00005808// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005809void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5810 ArgStringList &CmdArgs) const {}
5811void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5812 const InputInfo &Output,
5813 const InputInfoList &Inputs,
5814 const ArgList &Args,
5815 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005816 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005817
5818 const Driver &D = getToolChain().getDriver();
5819 ArgStringList CmdArgs;
5820
5821 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005822 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005823 CmdArgs.push_back(Args.MakeArgString(MarchString));
5824
5825 RenderExtraToolArgs(JA, CmdArgs);
5826
5827 if (Output.isFilename()) {
5828 CmdArgs.push_back("-o");
5829 CmdArgs.push_back(Output.getFilename());
5830 } else {
5831 assert(Output.isNothing() && "Unexpected output");
5832 CmdArgs.push_back("-fsyntax-only");
5833 }
5834
Douglas Katzman54366072015-07-27 16:53:08 +00005835 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005836 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005837
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005838 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005839
Tony Linthicum76329bf2011-12-12 21:14:55 +00005840 // Only pass -x if gcc will understand it; otherwise hope gcc
5841 // understands the suffix correctly. The main use case this would go
5842 // wrong in is for linker inputs if they happened to have an odd
5843 // suffix; really the only way to get this to happen is a command
5844 // like '-x foobar a.c' which will treat a.c like a linker input.
5845 //
5846 // FIXME: For the linker case specifically, can we safely convert
5847 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005848 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005849 // Don't try to pass LLVM or AST inputs to a generic gcc.
5850 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5851 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5852 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005853 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005854 else if (II.getType() == types::TY_AST)
5855 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005856 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005857 else if (II.getType() == types::TY_ModuleFile)
5858 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005859 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005860
5861 if (II.isFilename())
5862 CmdArgs.push_back(II.getFilename());
5863 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005864 // Don't render as input, we need gcc to do the translations.
5865 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005866 II.getInputArg().render(Args, CmdArgs);
5867 }
5868
5869 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005870 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005871 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005872}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005873
Douglas Katzman95354292015-06-23 20:42:09 +00005874void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5875 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005876 // The types are (hopefully) good enough.
5877}
5878
Douglas Katzman54366072015-07-27 16:53:08 +00005879static void
5880constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5881 const toolchains::HexagonToolChain &ToolChain,
5882 const InputInfo &Output, const InputInfoList &Inputs,
5883 const ArgList &Args, ArgStringList &CmdArgs,
5884 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005885
Matthew Curtise689b052012-12-06 15:46:07 +00005886 const Driver &D = ToolChain.getDriver();
5887
Matthew Curtise689b052012-12-06 15:46:07 +00005888 //----------------------------------------------------------------------------
5889 //
5890 //----------------------------------------------------------------------------
5891 bool hasStaticArg = Args.hasArg(options::OPT_static);
5892 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005893 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005894 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5895 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5896 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005897 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005898 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005899
Matthew Curtise689b052012-12-06 15:46:07 +00005900 //----------------------------------------------------------------------------
5901 // Silence warnings for various options
5902 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005903
Matthew Curtise689b052012-12-06 15:46:07 +00005904 Args.ClaimAllArgs(options::OPT_g_Group);
5905 Args.ClaimAllArgs(options::OPT_emit_llvm);
5906 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5907 // handled somewhere else.
5908 Args.ClaimAllArgs(options::OPT_static_libgcc);
5909
5910 //----------------------------------------------------------------------------
5911 //
5912 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005913 for (const auto &Opt : ToolChain.ExtraOpts)
5914 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005915
Douglas Katzman54366072015-07-27 16:53:08 +00005916 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00005917 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005918
Matthew Curtise689b052012-12-06 15:46:07 +00005919 if (buildingLib) {
5920 CmdArgs.push_back("-shared");
5921 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5922 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005923 }
5924
Matthew Curtise689b052012-12-06 15:46:07 +00005925 if (hasStaticArg)
5926 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005927
Matthew Curtise8f80a12012-12-06 17:49:03 +00005928 if (buildPIE && !buildingLib)
5929 CmdArgs.push_back("-pie");
5930
Douglas Katzman54366072015-07-27 16:53:08 +00005931 if (const char *v =
5932 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005933 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00005934 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005935 }
5936
Matthew Curtise689b052012-12-06 15:46:07 +00005937 //----------------------------------------------------------------------------
5938 //
5939 //----------------------------------------------------------------------------
5940 CmdArgs.push_back("-o");
5941 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005942
Matthew Curtise689b052012-12-06 15:46:07 +00005943 const std::string MarchSuffix = "/" + MarchString;
5944 const std::string G0Suffix = "/G0";
5945 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005946 const std::string RootDir =
Douglas Katzman54366072015-07-27 16:53:08 +00005947 toolchains::HexagonToolChain::GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005948 const std::string StartFilesDir =
5949 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005950
5951 //----------------------------------------------------------------------------
5952 // moslib
5953 //----------------------------------------------------------------------------
5954 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005955 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005956
Sean Silva14facf32015-06-09 01:57:17 +00005957 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5958 A->claim();
5959 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005960 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005961 }
Matthew Curtise689b052012-12-06 15:46:07 +00005962 if (oslibs.empty()) {
5963 oslibs.push_back("standalone");
5964 hasStandalone = true;
5965 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005966
Matthew Curtise689b052012-12-06 15:46:07 +00005967 //----------------------------------------------------------------------------
5968 // Start Files
5969 //----------------------------------------------------------------------------
5970 if (incStdLib && incStartFiles) {
5971
5972 if (!buildingLib) {
5973 if (hasStandalone) {
5974 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005975 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00005976 }
5977 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5978 }
5979 std::string initObj = useShared ? "/initS.o" : "/init.o";
5980 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5981 }
5982
5983 //----------------------------------------------------------------------------
5984 // Library Search Paths
5985 //----------------------------------------------------------------------------
5986 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005987 for (const auto &LibPath : LibPaths)
5988 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005989
5990 //----------------------------------------------------------------------------
5991 //
5992 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00005993 Args.AddAllArgs(CmdArgs,
5994 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
5995 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00005996
5997 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5998
5999 //----------------------------------------------------------------------------
6000 // Libraries
6001 //----------------------------------------------------------------------------
6002 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006003 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00006004 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6005 CmdArgs.push_back("-lm");
6006 }
6007
6008 CmdArgs.push_back("--start-group");
6009
6010 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00006011 for (const std::string &Lib : oslibs)
6012 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006013 CmdArgs.push_back("-lc");
6014 }
6015 CmdArgs.push_back("-lgcc");
6016
6017 CmdArgs.push_back("--end-group");
6018 }
6019
6020 //----------------------------------------------------------------------------
6021 // End files
6022 //----------------------------------------------------------------------------
6023 if (incStdLib && incStartFiles) {
6024 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
6025 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
6026 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006027}
6028
Douglas Katzman95354292015-06-23 20:42:09 +00006029void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6030 const InputInfo &Output,
6031 const InputInfoList &Inputs,
6032 const ArgList &Args,
6033 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006034
Douglas Katzman54366072015-07-27 16:53:08 +00006035 const toolchains::HexagonToolChain &ToolChain =
6036 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006037
6038 ArgStringList CmdArgs;
6039 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
6040 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006041
6042 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00006043 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006044 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006045}
6046// Hexagon tools end.
6047
Tom Stellard8fa33092015-07-18 01:49:05 +00006048void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6049 const InputInfo &Output,
6050 const InputInfoList &Inputs,
6051 const ArgList &Args,
6052 const char *LinkingOutput) const {
6053
6054 std::string Linker = getToolChain().GetProgramPath(getShortName());
6055 ArgStringList CmdArgs;
6056 CmdArgs.push_back("-flavor");
6057 CmdArgs.push_back("gnu");
6058 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006059 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006060 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6061 CmdArgs.push_back("-o");
6062 CmdArgs.push_back(Output.getFilename());
6063 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6064 CmdArgs, Inputs));
6065}
6066// AMDGPU tools end.
6067
Renato Golin7c542b42015-07-27 23:44:45 +00006068const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006069 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006070 if (!Arch.empty())
6071 MArch = Arch;
6072 else
Bernard Ogden31561762013-12-12 13:27:11 +00006073 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006074 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00006075
6076 // Handle -march=native.
6077 if (MArch == "native") {
6078 std::string CPU = llvm::sys::getHostCPUName();
6079 if (CPU != "generic") {
6080 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006081 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006082 // If there is no valid architecture suffix for this CPU we don't know how
6083 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006084 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006085 MArch = "";
6086 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006087 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006088 }
6089 }
6090
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006091 return MArch;
6092}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006093
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006094/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006095StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006096 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006097 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6098 // here means an -march=native that we can't handle, so instead return no CPU.
6099 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006100 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006101
John Brawna95c1a82015-05-08 12:52:18 +00006102 // We need to return an empty string here on invalid MArch values as the
6103 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006104 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006105}
6106
6107/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006108std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006109 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006110 // FIXME: Warn on inconsistent use of -mcpu and -march.
6111 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006112 if (!CPU.empty()) {
6113 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006114 // Handle -mcpu=native.
6115 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006116 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006117 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006118 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006119 }
6120
Renato Goline17c5802015-07-27 23:44:42 +00006121 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006122}
6123
6124/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006125/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006126// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006127StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6128 const llvm::Triple &Triple) {
6129 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006130 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006131 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006132 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006133 if (ArchKind == llvm::ARM::AK_INVALID)
6134 // In case of generic Arch, i.e. "arm",
6135 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006136 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006137 } else {
6138 ArchKind = llvm::ARM::parseCPUArch(CPU);
6139 }
Renato Golin3c007252015-05-28 15:05:53 +00006140 if (ArchKind == llvm::ARM::AK_INVALID)
6141 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006142 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006143}
6144
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006145void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006146 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006147 if (Args.hasArg(options::OPT_r))
6148 return;
6149
John Brawn94fd9632015-05-21 12:19:49 +00006150 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6151 // to generate BE-8 executables.
6152 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6153 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006154}
6155
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006156mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006157 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6158 // was first introduced in Release 3. However, other compilers have
6159 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006160 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6161 .Case("mips1", NanLegacy)
6162 .Case("mips2", NanLegacy)
6163 .Case("mips3", NanLegacy)
6164 .Case("mips4", NanLegacy)
6165 .Case("mips5", NanLegacy)
6166 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006167 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006168 .Case("mips32r3", NanLegacy | Nan2008)
6169 .Case("mips32r5", NanLegacy | Nan2008)
6170 .Case("mips32r6", Nan2008)
6171 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006172 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006173 .Case("mips64r3", NanLegacy | Nan2008)
6174 .Case("mips64r5", NanLegacy | Nan2008)
6175 .Case("mips64r6", Nan2008)
6176 .Default(NanLegacy);
6177}
6178
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006179bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6180 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6181 return A && (A->getValue() == StringRef(Value));
6182}
6183
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006184bool mips::isUCLibc(const ArgList &Args) {
6185 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006186 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006187}
6188
Daniel Sanders2bf13662014-07-10 14:40:57 +00006189bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006190 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6191 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006192 .Case("2008", true)
6193 .Case("legacy", false)
6194 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006195
6196 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006197 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006198 .Cases("mips32r6", "mips64r6", true)
6199 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006200
6201 return false;
6202}
6203
Daniel Sanders379d44b2014-07-16 11:52:23 +00006204bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006205 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006206 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006207 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006208 return false;
6209
6210 if (ABIName != "32")
6211 return false;
6212
Toma Tabacu94ea6862015-06-16 13:54:13 +00006213 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6214 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006215 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006216 return false;
6217
Daniel Sanders379d44b2014-07-16 11:52:23 +00006218 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006219 .Cases("mips2", "mips3", "mips4", "mips5", true)
6220 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6221 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6222 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006223}
6224
Toma Tabacu94ea6862015-06-16 13:54:13 +00006225bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6226 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006227 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006228 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6229
6230 // FPXX shouldn't be used if -msingle-float is present.
6231 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6232 options::OPT_mdouble_float))
6233 if (A->getOption().matches(options::OPT_msingle_float))
6234 UseFPXX = false;
6235
6236 return UseFPXX;
6237}
6238
Tim Northover157d9112014-01-16 08:48:16 +00006239llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006240 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6241 // archs which Darwin doesn't use.
6242
6243 // The matching this routine does is fairly pointless, since it is neither the
6244 // complete architecture list, nor a reasonable subset. The problem is that
6245 // historically the driver driver accepts this and also ties its -march=
6246 // handling to the architecture name, so we need to be careful before removing
6247 // support for it.
6248
6249 // This code must be kept in sync with Clang's Darwin specific argument
6250 // translation.
6251
6252 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006253 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6254 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6255 .Case("ppc64", llvm::Triple::ppc64)
6256 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6257 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6258 llvm::Triple::x86)
6259 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6260 // This is derived from the driver driver.
6261 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6262 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6263 .Cases("armv7s", "xscale", llvm::Triple::arm)
6264 .Case("arm64", llvm::Triple::aarch64)
6265 .Case("r600", llvm::Triple::r600)
6266 .Case("amdgcn", llvm::Triple::amdgcn)
6267 .Case("nvptx", llvm::Triple::nvptx)
6268 .Case("nvptx64", llvm::Triple::nvptx64)
6269 .Case("amdil", llvm::Triple::amdil)
6270 .Case("spir", llvm::Triple::spir)
6271 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006272}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006273
Tim Northover157d9112014-01-16 08:48:16 +00006274void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006275 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006276 T.setArch(Arch);
6277
6278 if (Str == "x86_64h")
6279 T.setArchName(Str);
6280 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6281 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006282 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006283 }
6284}
6285
Bob Wilsondecc03e2012-11-23 06:14:39 +00006286const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006287 const InputInfo &Input) {
6288 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006289}
6290
Bob Wilsondecc03e2012-11-23 06:14:39 +00006291const char *Clang::getBaseInputStem(const ArgList &Args,
6292 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006293 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006294
Chris Lattner906bb902011-01-16 08:14:11 +00006295 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006296 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006297
6298 return Str;
6299}
6300
Bob Wilsondecc03e2012-11-23 06:14:39 +00006301const char *Clang::getDependencyFileName(const ArgList &Args,
6302 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006303 // FIXME: Think about this more.
6304 std::string Res;
6305
6306 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006307 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006308 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006309 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006310 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006311 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006312 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006313}
6314
Douglas Katzman95354292015-06-23 20:42:09 +00006315void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6316 const InputInfo &Output,
6317 const InputInfoList &Inputs,
6318 const ArgList &Args,
6319 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006320 const ToolChain &ToolChain = getToolChain();
6321 const Driver &D = ToolChain.getDriver();
6322 ArgStringList CmdArgs;
6323
6324 // Silence warning for "clang -g foo.o -o foo"
6325 Args.ClaimAllArgs(options::OPT_g_Group);
6326 // and "clang -emit-llvm foo.o -o foo"
6327 Args.ClaimAllArgs(options::OPT_emit_llvm);
6328 // and for "clang -w foo.o -o foo". Other warning options are already
6329 // handled somewhere else.
6330 Args.ClaimAllArgs(options::OPT_w);
6331
6332 if (!D.SysRoot.empty())
6333 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6334
6335 // CloudABI only supports static linkage.
6336 CmdArgs.push_back("-Bstatic");
6337 CmdArgs.push_back("--eh-frame-hdr");
6338 CmdArgs.push_back("--gc-sections");
6339
6340 if (Output.isFilename()) {
6341 CmdArgs.push_back("-o");
6342 CmdArgs.push_back(Output.getFilename());
6343 } else {
6344 assert(Output.isNothing() && "Invalid output.");
6345 }
6346
6347 if (!Args.hasArg(options::OPT_nostdlib) &&
6348 !Args.hasArg(options::OPT_nostartfiles)) {
6349 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6350 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6351 }
6352
6353 Args.AddAllArgs(CmdArgs, options::OPT_L);
6354 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6355 for (const auto &Path : Paths)
6356 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006357 Args.AddAllArgs(CmdArgs,
6358 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6359 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006360
Alexey Samsonov907880e2015-06-19 19:57:46 +00006361 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006362 AddGoldPlugin(ToolChain, Args, CmdArgs);
6363
6364 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6365
6366 if (!Args.hasArg(options::OPT_nostdlib) &&
6367 !Args.hasArg(options::OPT_nodefaultlibs)) {
6368 if (D.CCCIsCXX())
6369 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6370 CmdArgs.push_back("-lc");
6371 CmdArgs.push_back("-lcompiler_rt");
6372 }
6373
6374 if (!Args.hasArg(options::OPT_nostdlib) &&
6375 !Args.hasArg(options::OPT_nostartfiles))
6376 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6377
6378 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006379 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006380}
6381
Douglas Katzman95354292015-06-23 20:42:09 +00006382void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6383 const InputInfo &Output,
6384 const InputInfoList &Inputs,
6385 const ArgList &Args,
6386 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006387 ArgStringList CmdArgs;
6388
6389 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6390 const InputInfo &Input = Inputs[0];
6391
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006392 // Determine the original source input.
6393 const Action *SourceAction = &JA;
6394 while (SourceAction->getKind() != Action::InputClass) {
6395 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6396 SourceAction = SourceAction->getInputs()[0];
6397 }
6398
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006399 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006400 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006401 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6402 // FIXME: at run-time detect assembler capabilities or rely on version
6403 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006404 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006405 const llvm::Triple &T(getToolChain().getTriple());
6406 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006407 CmdArgs.push_back("-Q");
6408 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006409
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006410 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006411 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006412 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006413 if (Args.hasArg(options::OPT_gstabs))
6414 CmdArgs.push_back("--gstabs");
6415 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006416 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006417 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006418
Daniel Dunbarbe220842009-03-20 16:06:39 +00006419 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006420 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006421
Daniel Dunbar6d484762010-07-22 01:47:22 +00006422 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006423 if (getToolChain().getArch() == llvm::Triple::x86 ||
6424 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006425 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6426 CmdArgs.push_back("-force_cpusubtype_ALL");
6427
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006428 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006429 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006430 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006431 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006432 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006433 CmdArgs.push_back("-static");
6434
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006435 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006436
6437 assert(Output.isFilename() && "Unexpected lipo output.");
6438 CmdArgs.push_back("-o");
6439 CmdArgs.push_back(Output.getFilename());
6440
Daniel Dunbarb440f562010-08-02 02:38:21 +00006441 assert(Input.isFilename() && "Invalid input.");
6442 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006443
6444 // asm_final spec is empty.
6445
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006446 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006447 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006448}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006449
Tim Northover157d9112014-01-16 08:48:16 +00006450void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006451
Tim Northover157d9112014-01-16 08:48:16 +00006452void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6453 ArgStringList &CmdArgs) const {
6454 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006455
Daniel Dunbarc1964212009-03-26 16:23:12 +00006456 // Derived from darwin_arch spec.
6457 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006458 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006459
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006460 // FIXME: Is this needed anymore?
6461 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006462 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006463}
6464
Douglas Katzman95354292015-06-23 20:42:09 +00006465bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006466 // We only need to generate a temp path for LTO if we aren't compiling object
6467 // files. When compiling source files, we run 'dsymutil' after linking. We
6468 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006469 for (const auto &Input : Inputs)
6470 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006471 return true;
6472
6473 return false;
6474}
6475
Douglas Katzman95354292015-06-23 20:42:09 +00006476void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6477 ArgStringList &CmdArgs,
6478 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006479 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006480 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006481
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006482 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006483 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6484 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006485 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6486 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006487 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006488 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006489 }
6490
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006491 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006492 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006493 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6494 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006495
Bob Wilson3d27dad2013-08-02 22:25:34 +00006496 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6497 CmdArgs.push_back("-export_dynamic");
6498
Bob Wilsonb111ec92015-03-02 19:01:14 +00006499 // If we are using App Extension restrictions, pass a flag to the linker
6500 // telling it that the compiled code has been audited.
6501 if (Args.hasFlag(options::OPT_fapplication_extension,
6502 options::OPT_fno_application_extension, false))
6503 CmdArgs.push_back("-application_extension");
6504
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00006505 if (D.IsUsingLTO(Args)) {
6506 // If we are using LTO, then automatically create a temporary file path for
6507 // the linker to use, so that it's lifetime will extend past a possible
6508 // dsymutil step.
6509 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6510 const char *TmpPath = C.getArgs().MakeArgString(
6511 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6512 C.addTempFile(TmpPath);
6513 CmdArgs.push_back("-object_path_lto");
6514 CmdArgs.push_back(TmpPath);
6515 }
6516
6517 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6518 // it in clang installed libraries. If not found, the option is not used
6519 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6520 if (Version[0] >= 133) {
6521 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6522 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6523 SmallString<128> LibLTOPath(P);
6524 llvm::sys::path::append(LibLTOPath, "lib");
6525 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
6526 if (llvm::sys::fs::exists(LibLTOPath)) {
6527 CmdArgs.push_back("-lto_library");
6528 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
6529 } else {
6530 D.Diag(diag::warn_drv_lto_libpath);
6531 }
6532 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00006533 }
6534
Daniel Dunbarc1964212009-03-26 16:23:12 +00006535 // Derived from the "link" spec.
6536 Args.AddAllArgs(CmdArgs, options::OPT_static);
6537 if (!Args.hasArg(options::OPT_static))
6538 CmdArgs.push_back("-dynamic");
6539 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6540 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6541 // here. How do we wish to handle such things?
6542 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006543
Daniel Dunbarc1964212009-03-26 16:23:12 +00006544 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006545 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006546 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006547 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006548
6549 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6550 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6551 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6552
6553 Arg *A;
6554 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6555 (A = Args.getLastArg(options::OPT_current__version)) ||
6556 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006557 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6558 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006559
6560 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6561 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6562 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6563 } else {
6564 CmdArgs.push_back("-dylib");
6565
6566 Arg *A;
6567 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6568 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6569 (A = Args.getLastArg(options::OPT_client__name)) ||
6570 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6571 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6572 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006573 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6574 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006575
Daniel Dunbarc1964212009-03-26 16:23:12 +00006576 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6577 "-dylib_compatibility_version");
6578 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6579 "-dylib_current_version");
6580
Tim Northover157d9112014-01-16 08:48:16 +00006581 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006582
6583 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6584 "-dylib_install_name");
6585 }
6586
6587 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6588 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6589 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006590 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006591 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006592 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6593 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6594 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6595 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6596 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6597 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006598 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006599 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6600 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6601 Args.AddAllArgs(CmdArgs, options::OPT_init);
6602
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006603 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006604 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006605
Daniel Dunbarc1964212009-03-26 16:23:12 +00006606 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6607 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6608 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6609 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6610 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006611
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006612 if (const Arg *A =
6613 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6614 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006615 if (A->getOption().matches(options::OPT_fpie) ||
6616 A->getOption().matches(options::OPT_fPIE))
6617 CmdArgs.push_back("-pie");
6618 else
6619 CmdArgs.push_back("-no_pie");
6620 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006621
6622 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6623 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6624 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6625 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6626 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6627 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6628 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6629 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6630 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6631 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6632 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6633 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6634 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6635 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6636 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6637 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006638
Daniel Dunbar84384642011-05-02 21:03:47 +00006639 // Give --sysroot= preference, over the Apple specific behavior to also use
6640 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006641 StringRef sysroot = C.getSysRoot();
6642 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006643 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006644 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006645 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6646 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006647 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006648 }
6649
Daniel Dunbarc1964212009-03-26 16:23:12 +00006650 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6651 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6652 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6653 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6654 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006655 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006656 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6657 Args.AddAllArgs(CmdArgs, options::OPT_y);
6658 Args.AddLastArg(CmdArgs, options::OPT_w);
6659 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6660 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6661 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6662 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6663 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6664 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6665 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6666 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6667 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6668 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6669 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6670 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6671}
6672
Douglas Katzman95354292015-06-23 20:42:09 +00006673void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6674 const InputInfo &Output,
6675 const InputInfoList &Inputs,
6676 const ArgList &Args,
6677 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006678 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006679
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006680 // If the number of arguments surpasses the system limits, we will encode the
6681 // input files in a separate file, shortening the command line. To this end,
6682 // build a list of input file names that can be passed via a file with the
6683 // -filelist linker option.
6684 llvm::opt::ArgStringList InputFileList;
6685
Daniel Dunbarc1964212009-03-26 16:23:12 +00006686 // The logic here is derived from gcc's behavior; most of which
6687 // comes from specs (starting with link_command). Consult gcc for
6688 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006689 ArgStringList CmdArgs;
6690
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006691 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6692 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6693 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006694 for (const auto &Arg : Args)
6695 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006696 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006697 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006698 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006699 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006700 return;
6701 }
6702
Daniel Dunbarc1964212009-03-26 16:23:12 +00006703 // I'm not sure why this particular decomposition exists in gcc, but
6704 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006705 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006706
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006707 // It seems that the 'e' option is completely ignored for dynamic executables
6708 // (the default), and with static executables, the last one wins, as expected.
6709 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6710 options::OPT_Z_Flag, options::OPT_u_Group,
6711 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006712
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006713 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6714 // members of static archive libraries which implement Objective-C classes or
6715 // categories.
6716 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6717 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006718
Daniel Dunbarc1964212009-03-26 16:23:12 +00006719 CmdArgs.push_back("-o");
6720 CmdArgs.push_back(Output.getFilename());
6721
Chad Rosier06fd3c62012-05-16 23:45:12 +00006722 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006723 !Args.hasArg(options::OPT_nostartfiles))
6724 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006725
Peter Collingbournec4122c12015-06-15 21:08:13 +00006726 // SafeStack requires its own runtime libraries
6727 // These libraries should be linked first, to make sure the
6728 // __safestack_init constructor executes before everything else
6729 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6730 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6731 "libclang_rt.safestack_osx.a",
6732 /*AlwaysLink=*/true);
6733 }
6734
Daniel Dunbarc1964212009-03-26 16:23:12 +00006735 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006736
Douglas Gregor9295df02012-05-15 21:00:27 +00006737 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006738 // Build the input file for -filelist (list of linker input files) in case we
6739 // need it later
6740 for (const auto &II : Inputs) {
6741 if (!II.isFilename()) {
6742 // This is a linker input argument.
6743 // We cannot mix input arguments and file names in a -filelist input, thus
6744 // we prematurely stop our list (remaining files shall be passed as
6745 // arguments).
6746 if (InputFileList.size() > 0)
6747 break;
6748
6749 continue;
6750 }
6751
6752 InputFileList.push_back(II.getFilename());
6753 }
6754
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00006755 if (!Args.hasArg(options::OPT_nostdlib) &&
6756 !Args.hasArg(options::OPT_nodefaultlibs))
6757 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
6758
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006759 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006760 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006761 // We use arclite library for both ARC and subscripting support.
6762 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6763
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006764 CmdArgs.push_back("-framework");
6765 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006766 // Link libobj.
6767 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006768 }
John McCall31168b02011-06-15 23:02:42 +00006769
Daniel Dunbarc1964212009-03-26 16:23:12 +00006770 if (LinkingOutput) {
6771 CmdArgs.push_back("-arch_multiple");
6772 CmdArgs.push_back("-final_output");
6773 CmdArgs.push_back(LinkingOutput);
6774 }
6775
Daniel Dunbarc1964212009-03-26 16:23:12 +00006776 if (Args.hasArg(options::OPT_fnested_functions))
6777 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006778
Justin Bognerc7701242015-05-12 05:44:36 +00006779 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6780 // paths are different enough from other toolchains that this needs a fair
6781 // amount of refactoring done first.
6782 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6783
Daniel Dunbarc1964212009-03-26 16:23:12 +00006784 if (!Args.hasArg(options::OPT_nostdlib) &&
6785 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006786 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006787 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006788
Daniel Dunbarc1964212009-03-26 16:23:12 +00006789 // link_ssp spec is empty.
6790
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006791 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006792 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006793 }
6794
Chad Rosier06fd3c62012-05-16 23:45:12 +00006795 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006796 !Args.hasArg(options::OPT_nostartfiles)) {
6797 // endfile_spec is empty.
6798 }
6799
6800 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6801 Args.AddAllArgs(CmdArgs, options::OPT_F);
6802
Steven Wu3ffb61b2015-02-06 18:08:29 +00006803 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006804 for (const Arg *A : Args.filtered(options::OPT_iframework))
6805 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006806
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006807 if (!Args.hasArg(options::OPT_nostdlib) &&
6808 !Args.hasArg(options::OPT_nodefaultlibs)) {
6809 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6810 if (A->getValue() == StringRef("Accelerate")) {
6811 CmdArgs.push_back("-framework");
6812 CmdArgs.push_back("Accelerate");
6813 }
6814 }
6815 }
6816
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006817 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006818 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006819 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006820 Cmd->setInputFileList(std::move(InputFileList));
6821 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006822}
6823
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006824void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006825 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006826 const InputInfoList &Inputs,
6827 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006828 const char *LinkingOutput) const {
6829 ArgStringList CmdArgs;
6830
6831 CmdArgs.push_back("-create");
6832 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006833
6834 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006835 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006836
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006837 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006838 assert(II.isFilename() && "Unexpected lipo input.");
6839 CmdArgs.push_back(II.getFilename());
6840 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006841
6842 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006843 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006844}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006845
Daniel Dunbar88299622010-06-04 18:28:36 +00006846void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006847 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006848 const InputInfoList &Inputs,
6849 const ArgList &Args,
6850 const char *LinkingOutput) const {
6851 ArgStringList CmdArgs;
6852
Daniel Dunbareb86b042011-05-09 17:23:16 +00006853 CmdArgs.push_back("-o");
6854 CmdArgs.push_back(Output.getFilename());
6855
Daniel Dunbar88299622010-06-04 18:28:36 +00006856 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6857 const InputInfo &Input = Inputs[0];
6858 assert(Input.isFilename() && "Unexpected dsymutil input.");
6859 CmdArgs.push_back(Input.getFilename());
6860
Daniel Dunbar88299622010-06-04 18:28:36 +00006861 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006862 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006863 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006864}
6865
Eric Christopher551ef452011-08-23 17:56:55 +00006866void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006867 const InputInfo &Output,
6868 const InputInfoList &Inputs,
6869 const ArgList &Args,
6870 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006871 ArgStringList CmdArgs;
6872 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006873 CmdArgs.push_back("--debug-info");
6874 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006875 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006876
6877 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6878 const InputInfo &Input = Inputs[0];
6879 assert(Input.isFilename() && "Unexpected verify input");
6880
6881 // Grabbing the output of the earlier dsymutil run.
6882 CmdArgs.push_back(Input.getFilename());
6883
6884 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006885 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006886 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00006887}
6888
Douglas Katzman95354292015-06-23 20:42:09 +00006889void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006890 const InputInfo &Output,
6891 const InputInfoList &Inputs,
6892 const ArgList &Args,
6893 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006894 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006895 ArgStringList CmdArgs;
6896
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006897 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006898
6899 CmdArgs.push_back("-o");
6900 CmdArgs.push_back(Output.getFilename());
6901
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006902 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006903 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006904
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006905 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006906 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006907}
6908
Douglas Katzman95354292015-06-23 20:42:09 +00006909void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6910 const InputInfo &Output,
6911 const InputInfoList &Inputs,
6912 const ArgList &Args,
6913 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006914 ArgStringList CmdArgs;
6915
David Chisnall272a0712012-02-29 15:06:12 +00006916 // Demangle C++ names in errors
6917 CmdArgs.push_back("-C");
6918
David Chisnallf571cde2012-02-15 13:39:01 +00006919 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6920 (!Args.hasArg(options::OPT_shared))) {
6921 CmdArgs.push_back("-e");
6922 CmdArgs.push_back("_start");
6923 }
6924
6925 if (Args.hasArg(options::OPT_static)) {
6926 CmdArgs.push_back("-Bstatic");
6927 CmdArgs.push_back("-dn");
6928 } else {
6929 CmdArgs.push_back("-Bdynamic");
6930 if (Args.hasArg(options::OPT_shared)) {
6931 CmdArgs.push_back("-shared");
6932 } else {
6933 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006934 CmdArgs.push_back(
6935 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00006936 }
6937 }
6938
6939 if (Output.isFilename()) {
6940 CmdArgs.push_back("-o");
6941 CmdArgs.push_back(Output.getFilename());
6942 } else {
6943 assert(Output.isNothing() && "Invalid output.");
6944 }
6945
6946 if (!Args.hasArg(options::OPT_nostdlib) &&
6947 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006948 if (!Args.hasArg(options::OPT_shared))
6949 CmdArgs.push_back(
6950 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6951
6952 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6953 CmdArgs.push_back(
6954 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
6955 CmdArgs.push_back(
6956 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006957 }
6958
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006959 const ToolChain::path_list &Paths = getToolChain().getFilePaths();
6960 for (const auto &Path : Paths)
6961 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
David Chisnallf571cde2012-02-15 13:39:01 +00006962
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006963 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
6964 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00006965
6966 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6967
6968 if (!Args.hasArg(options::OPT_nostdlib) &&
6969 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006970 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006971 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006972 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00006973 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006974 if (!Args.hasArg(options::OPT_shared)) {
6975 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00006976 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006977 }
David Chisnallf571cde2012-02-15 13:39:01 +00006978 }
6979
6980 if (!Args.hasArg(options::OPT_nostdlib) &&
6981 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006982 CmdArgs.push_back(
6983 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006984 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006985 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006986
Alexey Samsonov7811d192014-02-20 13:57:37 +00006987 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006988
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006989 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006990 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006991}
6992
Douglas Katzman95354292015-06-23 20:42:09 +00006993void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6994 const InputInfo &Output,
6995 const InputInfoList &Inputs,
6996 const ArgList &Args,
6997 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006998 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006999 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00007000 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007001
Rafael Espindolacc126272014-02-28 01:55:21 +00007002 switch (getToolChain().getArch()) {
7003 case llvm::Triple::x86:
7004 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7005 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007006 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007007 break;
7008
7009 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007010 CmdArgs.push_back("-mppc");
7011 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007012 break;
7013
7014 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007015 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00007016 CmdArgs.push_back("-32");
7017 NeedsKPIC = true;
7018 break;
7019
7020 case llvm::Triple::sparcv9:
7021 CmdArgs.push_back("-64");
7022 CmdArgs.push_back("-Av9a");
7023 NeedsKPIC = true;
7024 break;
7025
7026 case llvm::Triple::mips64:
7027 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007028 StringRef CPUName;
7029 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007030 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007031
7032 CmdArgs.push_back("-mabi");
7033 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7034
7035 if (getToolChain().getArch() == llvm::Triple::mips64)
7036 CmdArgs.push_back("-EB");
7037 else
7038 CmdArgs.push_back("-EL");
7039
Rafael Espindolacc126272014-02-28 01:55:21 +00007040 NeedsKPIC = true;
7041 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007042 }
7043
Rafael Espindolacc126272014-02-28 01:55:21 +00007044 default:
7045 break;
7046 }
7047
7048 if (NeedsKPIC)
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007049 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007050
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007051 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007052
7053 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007054 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007055
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007056 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007057 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007058
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007059 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007060 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007061}
7062
Douglas Katzman95354292015-06-23 20:42:09 +00007063void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7064 const InputInfo &Output,
7065 const InputInfoList &Inputs,
7066 const ArgList &Args,
7067 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007068 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007069 ArgStringList CmdArgs;
7070
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007071 // Silence warning for "clang -g foo.o -o foo"
7072 Args.ClaimAllArgs(options::OPT_g_Group);
7073 // and "clang -emit-llvm foo.o -o foo"
7074 Args.ClaimAllArgs(options::OPT_emit_llvm);
7075 // and for "clang -w foo.o -o foo". Other warning options are already
7076 // handled somewhere else.
7077 Args.ClaimAllArgs(options::OPT_w);
7078
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007079 if (getToolChain().getArch() == llvm::Triple::mips64)
7080 CmdArgs.push_back("-EB");
7081 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7082 CmdArgs.push_back("-EL");
7083
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007084 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007085 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007086 CmdArgs.push_back("-e");
7087 CmdArgs.push_back("__start");
7088 }
7089
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007090 if (Args.hasArg(options::OPT_static)) {
7091 CmdArgs.push_back("-Bstatic");
7092 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007093 if (Args.hasArg(options::OPT_rdynamic))
7094 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007095 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007096 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007097 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007098 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007099 } else {
7100 CmdArgs.push_back("-dynamic-linker");
7101 CmdArgs.push_back("/usr/libexec/ld.so");
7102 }
7103 }
7104
Rafael Espindola044f7832013-06-05 04:28:55 +00007105 if (Args.hasArg(options::OPT_nopie))
7106 CmdArgs.push_back("-nopie");
7107
Daniel Dunbarb440f562010-08-02 02:38:21 +00007108 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007109 CmdArgs.push_back("-o");
7110 CmdArgs.push_back(Output.getFilename());
7111 } else {
7112 assert(Output.isNothing() && "Invalid output.");
7113 }
7114
7115 if (!Args.hasArg(options::OPT_nostdlib) &&
7116 !Args.hasArg(options::OPT_nostartfiles)) {
7117 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007118 if (Args.hasArg(options::OPT_pg))
7119 CmdArgs.push_back(
7120 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007121 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007122 CmdArgs.push_back(
7123 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7124 CmdArgs.push_back(
7125 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007126 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007127 CmdArgs.push_back(
7128 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007129 }
7130 }
7131
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007132 std::string Triple = getToolChain().getTripleString();
7133 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007134 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007135 CmdArgs.push_back(
7136 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007137
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007138 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7139 options::OPT_e, options::OPT_s, options::OPT_t,
7140 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007141
Daniel Dunbar54423b22010-09-17 00:24:54 +00007142 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007143
7144 if (!Args.hasArg(options::OPT_nostdlib) &&
7145 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007146 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007147 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007148 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007149 CmdArgs.push_back("-lm_p");
7150 else
7151 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007152 }
7153
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007154 // FIXME: For some reason GCC passes -lgcc before adding
7155 // the default system libraries. Just mimic this for now.
7156 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007157
Eric Christopher17674ec2012-09-13 06:32:34 +00007158 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007159 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7160 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007161 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007162 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007163 }
7164
Chandler Carruth45661652011-12-17 22:32:42 +00007165 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007166 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007167 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007168 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007169 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007170 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007171
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007172 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007173 }
7174
7175 if (!Args.hasArg(options::OPT_nostdlib) &&
7176 !Args.hasArg(options::OPT_nostartfiles)) {
7177 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007178 CmdArgs.push_back(
7179 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007180 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007181 CmdArgs.push_back(
7182 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007183 }
7184
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007185 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007186 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007187}
Ed Schoutene33194b2009-04-02 19:13:12 +00007188
Douglas Katzman95354292015-06-23 20:42:09 +00007189void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7190 const InputInfo &Output,
7191 const InputInfoList &Inputs,
7192 const ArgList &Args,
7193 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007194 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007195 ArgStringList CmdArgs;
7196
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007197 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007198
7199 CmdArgs.push_back("-o");
7200 CmdArgs.push_back(Output.getFilename());
7201
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007202 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007203 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007204
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007205 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007206 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007207}
7208
Douglas Katzman95354292015-06-23 20:42:09 +00007209void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7210 const InputInfo &Output,
7211 const InputInfoList &Inputs,
7212 const ArgList &Args,
7213 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007214 const Driver &D = getToolChain().getDriver();
7215 ArgStringList CmdArgs;
7216
7217 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7218 (!Args.hasArg(options::OPT_shared))) {
7219 CmdArgs.push_back("-e");
7220 CmdArgs.push_back("__start");
7221 }
7222
7223 if (Args.hasArg(options::OPT_static)) {
7224 CmdArgs.push_back("-Bstatic");
7225 } else {
7226 if (Args.hasArg(options::OPT_rdynamic))
7227 CmdArgs.push_back("-export-dynamic");
7228 CmdArgs.push_back("--eh-frame-hdr");
7229 CmdArgs.push_back("-Bdynamic");
7230 if (Args.hasArg(options::OPT_shared)) {
7231 CmdArgs.push_back("-shared");
7232 } else {
7233 CmdArgs.push_back("-dynamic-linker");
7234 CmdArgs.push_back("/usr/libexec/ld.so");
7235 }
7236 }
7237
7238 if (Output.isFilename()) {
7239 CmdArgs.push_back("-o");
7240 CmdArgs.push_back(Output.getFilename());
7241 } else {
7242 assert(Output.isNothing() && "Invalid output.");
7243 }
7244
7245 if (!Args.hasArg(options::OPT_nostdlib) &&
7246 !Args.hasArg(options::OPT_nostartfiles)) {
7247 if (!Args.hasArg(options::OPT_shared)) {
7248 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007249 CmdArgs.push_back(
7250 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007251 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007252 CmdArgs.push_back(
7253 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7254 CmdArgs.push_back(
7255 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007256 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007257 CmdArgs.push_back(
7258 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007259 }
7260 }
7261
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007262 Args.AddAllArgs(CmdArgs,
7263 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007264
7265 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7266
7267 if (!Args.hasArg(options::OPT_nostdlib) &&
7268 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007269 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007270 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7271 if (Args.hasArg(options::OPT_pg))
7272 CmdArgs.push_back("-lm_p");
7273 else
7274 CmdArgs.push_back("-lm");
7275 }
7276
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007277 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007278 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007279 CmdArgs.push_back("-lpthread_p");
7280 else
7281 CmdArgs.push_back("-lpthread");
7282 }
7283
Eli Friedman9fa28852012-08-08 23:57:20 +00007284 if (!Args.hasArg(options::OPT_shared)) {
7285 if (Args.hasArg(options::OPT_pg))
7286 CmdArgs.push_back("-lc_p");
7287 else
7288 CmdArgs.push_back("-lc");
7289 }
7290
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007291 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007292 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007293 case llvm::Triple::arm:
7294 MyArch = "arm";
7295 break;
7296 case llvm::Triple::x86:
7297 MyArch = "i386";
7298 break;
7299 case llvm::Triple::x86_64:
7300 MyArch = "amd64";
7301 break;
7302 default:
7303 llvm_unreachable("Unsupported architecture");
7304 }
7305 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007306 }
7307
7308 if (!Args.hasArg(options::OPT_nostdlib) &&
7309 !Args.hasArg(options::OPT_nostartfiles)) {
7310 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007311 CmdArgs.push_back(
7312 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007313 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007314 CmdArgs.push_back(
7315 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007316 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007317
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007318 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007319 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007320}
7321
Douglas Katzman95354292015-06-23 20:42:09 +00007322void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7323 const InputInfo &Output,
7324 const InputInfoList &Inputs,
7325 const ArgList &Args,
7326 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007327 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007328 ArgStringList CmdArgs;
7329
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007330 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7331 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007332 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007333 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007334 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007335 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007336 else if (getToolChain().getArch() == llvm::Triple::mips ||
7337 getToolChain().getArch() == llvm::Triple::mipsel ||
7338 getToolChain().getArch() == llvm::Triple::mips64 ||
7339 getToolChain().getArch() == llvm::Triple::mips64el) {
7340 StringRef CPUName;
7341 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007342 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007343
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007344 CmdArgs.push_back("-march");
7345 CmdArgs.push_back(CPUName.data());
7346
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007347 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007348 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007349
7350 if (getToolChain().getArch() == llvm::Triple::mips ||
7351 getToolChain().getArch() == llvm::Triple::mips64)
7352 CmdArgs.push_back("-EB");
7353 else
7354 CmdArgs.push_back("-EL");
7355
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007356 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007357 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007358 getToolChain().getArch() == llvm::Triple::armeb ||
7359 getToolChain().getArch() == llvm::Triple::thumb ||
7360 getToolChain().getArch() == llvm::Triple::thumbeb) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007361 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007362
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007363 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007364 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007365 else
Renato Golinf4421f72014-02-19 10:44:07 +00007366 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007367
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007368 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007369 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007370 case llvm::Triple::GNUEABI:
7371 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007372 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007373 break;
7374
7375 default:
7376 CmdArgs.push_back("-matpcs");
7377 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007378 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007379 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007380 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007381 if (getToolChain().getArch() == llvm::Triple::sparc)
7382 CmdArgs.push_back("-Av8plusa");
7383 else
7384 CmdArgs.push_back("-Av9a");
7385
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007386 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007387 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007388
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007389 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007390
7391 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007392 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007393
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007394 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007395 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007396
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007397 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007398 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007399}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007400
Douglas Katzman95354292015-06-23 20:42:09 +00007401void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7402 const InputInfo &Output,
7403 const InputInfoList &Inputs,
7404 const ArgList &Args,
7405 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007406 const toolchains::FreeBSD &ToolChain =
7407 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007408 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007409 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007410 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007411 !Args.hasArg(options::OPT_shared) &&
7412 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007413 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007414
7415 // Silence warning for "clang -g foo.o -o foo"
7416 Args.ClaimAllArgs(options::OPT_g_Group);
7417 // and "clang -emit-llvm foo.o -o foo"
7418 Args.ClaimAllArgs(options::OPT_emit_llvm);
7419 // and for "clang -w foo.o -o foo". Other warning options are already
7420 // handled somewhere else.
7421 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007422
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007423 if (!D.SysRoot.empty())
7424 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7425
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007426 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007427 CmdArgs.push_back("-pie");
7428
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007429 if (Args.hasArg(options::OPT_static)) {
7430 CmdArgs.push_back("-Bstatic");
7431 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007432 if (Args.hasArg(options::OPT_rdynamic))
7433 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007434 CmdArgs.push_back("--eh-frame-hdr");
7435 if (Args.hasArg(options::OPT_shared)) {
7436 CmdArgs.push_back("-Bshareable");
7437 } else {
7438 CmdArgs.push_back("-dynamic-linker");
7439 CmdArgs.push_back("/libexec/ld-elf.so.1");
7440 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007441 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007442 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7443 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7444 CmdArgs.push_back("--hash-style=both");
7445 }
7446 }
7447 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007448 }
7449
7450 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7451 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007452 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007453 CmdArgs.push_back("-m");
7454 CmdArgs.push_back("elf_i386_fbsd");
7455 }
7456
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007457 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007458 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007459 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007460 }
7461
Daniel Dunbarb440f562010-08-02 02:38:21 +00007462 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007463 CmdArgs.push_back("-o");
7464 CmdArgs.push_back(Output.getFilename());
7465 } else {
7466 assert(Output.isNothing() && "Invalid output.");
7467 }
7468
7469 if (!Args.hasArg(options::OPT_nostdlib) &&
7470 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007471 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007472 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007473 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007474 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007475 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007476 crt1 = "Scrt1.o";
7477 else
7478 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007479 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007480 if (crt1)
7481 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7482
7483 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7484
Craig Topper92fc2df2014-05-17 16:56:41 +00007485 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007486 if (Args.hasArg(options::OPT_static))
7487 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007488 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007489 crtbegin = "crtbeginS.o";
7490 else
7491 crtbegin = "crtbegin.o";
7492
7493 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007494 }
7495
7496 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007497 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007498 for (const auto &Path : Paths)
7499 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007500 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7501 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007502 Args.AddAllArgs(CmdArgs, options::OPT_s);
7503 Args.AddAllArgs(CmdArgs, options::OPT_t);
7504 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7505 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007506
Alexey Samsonov907880e2015-06-19 19:57:46 +00007507 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007508 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007509
Alexey Samsonov52550342014-09-15 19:58:40 +00007510 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007511 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007512
7513 if (!Args.hasArg(options::OPT_nostdlib) &&
7514 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007515 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007516 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007517 if (Args.hasArg(options::OPT_pg))
7518 CmdArgs.push_back("-lm_p");
7519 else
7520 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007521 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007522 if (NeedsSanitizerDeps)
7523 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007524 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7525 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007526 if (Args.hasArg(options::OPT_pg))
7527 CmdArgs.push_back("-lgcc_p");
7528 else
7529 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007530 if (Args.hasArg(options::OPT_static)) {
7531 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007532 } else if (Args.hasArg(options::OPT_pg)) {
7533 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007534 } else {
7535 CmdArgs.push_back("--as-needed");
7536 CmdArgs.push_back("-lgcc_s");
7537 CmdArgs.push_back("--no-as-needed");
7538 }
7539
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007540 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007541 if (Args.hasArg(options::OPT_pg))
7542 CmdArgs.push_back("-lpthread_p");
7543 else
7544 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007545 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007546
Roman Divacky66f22762011-02-10 16:59:40 +00007547 if (Args.hasArg(options::OPT_pg)) {
7548 if (Args.hasArg(options::OPT_shared))
7549 CmdArgs.push_back("-lc");
7550 else
7551 CmdArgs.push_back("-lc_p");
7552 CmdArgs.push_back("-lgcc_p");
7553 } else {
7554 CmdArgs.push_back("-lc");
7555 CmdArgs.push_back("-lgcc");
7556 }
7557
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007558 if (Args.hasArg(options::OPT_static)) {
7559 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007560 } else if (Args.hasArg(options::OPT_pg)) {
7561 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007562 } else {
7563 CmdArgs.push_back("--as-needed");
7564 CmdArgs.push_back("-lgcc_s");
7565 CmdArgs.push_back("--no-as-needed");
7566 }
7567 }
7568
7569 if (!Args.hasArg(options::OPT_nostdlib) &&
7570 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007571 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007572 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007573 else
7574 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007575 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007576 }
7577
Alexey Samsonov7811d192014-02-20 13:57:37 +00007578 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007579
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007580 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007581 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007582}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007583
Douglas Katzman95354292015-06-23 20:42:09 +00007584void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007585 const InputInfo &Output,
7586 const InputInfoList &Inputs,
7587 const ArgList &Args,
7588 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007589 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007590 ArgStringList CmdArgs;
7591
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007592 // GNU as needs different flags for creating the correct output format
7593 // on architectures with different ABIs or optional feature sets.
7594 switch (getToolChain().getArch()) {
7595 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007596 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007597 break;
7598 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007599 case llvm::Triple::armeb:
7600 case llvm::Triple::thumb:
7601 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007602 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007603 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7604 std::string Arch =
7605 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007606 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007607 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007608 }
7609
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007610 case llvm::Triple::mips:
7611 case llvm::Triple::mipsel:
7612 case llvm::Triple::mips64:
7613 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007614 StringRef CPUName;
7615 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007616 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007617
7618 CmdArgs.push_back("-march");
7619 CmdArgs.push_back(CPUName.data());
7620
7621 CmdArgs.push_back("-mabi");
7622 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7623
7624 if (getToolChain().getArch() == llvm::Triple::mips ||
7625 getToolChain().getArch() == llvm::Triple::mips64)
7626 CmdArgs.push_back("-EB");
7627 else
7628 CmdArgs.push_back("-EL");
7629
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007630 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007631 break;
7632 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007633
7634 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007635 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007636 CmdArgs.push_back("-32");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007637 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007638 break;
7639
7640 case llvm::Triple::sparcv9:
7641 CmdArgs.push_back("-64");
7642 CmdArgs.push_back("-Av9");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007643 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007644 break;
7645
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007646 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007647 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007648 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007649
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007650 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007651
7652 CmdArgs.push_back("-o");
7653 CmdArgs.push_back(Output.getFilename());
7654
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007655 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007656 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007657
David Chisnallddbd68f2011-09-27 22:03:18 +00007658 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007659 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007660}
7661
Douglas Katzman95354292015-06-23 20:42:09 +00007662void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7663 const InputInfo &Output,
7664 const InputInfoList &Inputs,
7665 const ArgList &Args,
7666 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007667 const Driver &D = getToolChain().getDriver();
7668 ArgStringList CmdArgs;
7669
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007670 if (!D.SysRoot.empty())
7671 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7672
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007673 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007674 if (Args.hasArg(options::OPT_static)) {
7675 CmdArgs.push_back("-Bstatic");
7676 } else {
7677 if (Args.hasArg(options::OPT_rdynamic))
7678 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007679 if (Args.hasArg(options::OPT_shared)) {
7680 CmdArgs.push_back("-Bshareable");
7681 } else {
7682 CmdArgs.push_back("-dynamic-linker");
7683 CmdArgs.push_back("/libexec/ld.elf_so");
7684 }
7685 }
7686
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007687 // Many NetBSD architectures support more than one ABI.
7688 // Determine the correct emulation for ld.
7689 switch (getToolChain().getArch()) {
7690 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007691 CmdArgs.push_back("-m");
7692 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007693 break;
7694 case llvm::Triple::arm:
7695 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007696 CmdArgs.push_back("-m");
7697 switch (getToolChain().getTriple().getEnvironment()) {
7698 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007699 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007700 CmdArgs.push_back("armelf_nbsd_eabi");
7701 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007702 case llvm::Triple::EABIHF:
7703 case llvm::Triple::GNUEABIHF:
7704 CmdArgs.push_back("armelf_nbsd_eabihf");
7705 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007706 default:
7707 CmdArgs.push_back("armelf_nbsd");
7708 break;
7709 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007710 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007711 case llvm::Triple::armeb:
7712 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007713 arm::appendEBLinkFlags(
7714 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007715 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007716 CmdArgs.push_back("-m");
7717 switch (getToolChain().getTriple().getEnvironment()) {
7718 case llvm::Triple::EABI:
7719 case llvm::Triple::GNUEABI:
7720 CmdArgs.push_back("armelfb_nbsd_eabi");
7721 break;
7722 case llvm::Triple::EABIHF:
7723 case llvm::Triple::GNUEABIHF:
7724 CmdArgs.push_back("armelfb_nbsd_eabihf");
7725 break;
7726 default:
7727 CmdArgs.push_back("armelfb_nbsd");
7728 break;
7729 }
7730 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007731 case llvm::Triple::mips64:
7732 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007733 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007734 CmdArgs.push_back("-m");
7735 if (getToolChain().getArch() == llvm::Triple::mips64)
7736 CmdArgs.push_back("elf32btsmip");
7737 else
7738 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007739 } else if (mips::hasMipsAbiArg(Args, "64")) {
7740 CmdArgs.push_back("-m");
7741 if (getToolChain().getArch() == llvm::Triple::mips64)
7742 CmdArgs.push_back("elf64btsmip");
7743 else
7744 CmdArgs.push_back("elf64ltsmip");
7745 }
7746 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007747 case llvm::Triple::ppc:
7748 CmdArgs.push_back("-m");
7749 CmdArgs.push_back("elf32ppc_nbsd");
7750 break;
7751
7752 case llvm::Triple::ppc64:
7753 case llvm::Triple::ppc64le:
7754 CmdArgs.push_back("-m");
7755 CmdArgs.push_back("elf64ppc");
7756 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007757
7758 case llvm::Triple::sparc:
7759 CmdArgs.push_back("-m");
7760 CmdArgs.push_back("elf32_sparc");
7761 break;
7762
7763 case llvm::Triple::sparcv9:
7764 CmdArgs.push_back("-m");
7765 CmdArgs.push_back("elf64_sparc");
7766 break;
7767
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007768 default:
7769 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007770 }
7771
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007772 if (Output.isFilename()) {
7773 CmdArgs.push_back("-o");
7774 CmdArgs.push_back(Output.getFilename());
7775 } else {
7776 assert(Output.isNothing() && "Invalid output.");
7777 }
7778
7779 if (!Args.hasArg(options::OPT_nostdlib) &&
7780 !Args.hasArg(options::OPT_nostartfiles)) {
7781 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007782 CmdArgs.push_back(
7783 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7784 CmdArgs.push_back(
7785 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7786 CmdArgs.push_back(
7787 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007788 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007789 CmdArgs.push_back(
7790 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7791 CmdArgs.push_back(
7792 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007793 }
7794 }
7795
7796 Args.AddAllArgs(CmdArgs, options::OPT_L);
7797 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7798 Args.AddAllArgs(CmdArgs, options::OPT_e);
7799 Args.AddAllArgs(CmdArgs, options::OPT_s);
7800 Args.AddAllArgs(CmdArgs, options::OPT_t);
7801 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7802 Args.AddAllArgs(CmdArgs, options::OPT_r);
7803
7804 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7805
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007806 unsigned Major, Minor, Micro;
7807 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7808 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007809 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007810 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007811 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007812 case llvm::Triple::arm:
7813 case llvm::Triple::armeb:
7814 case llvm::Triple::thumb:
7815 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007816 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007817 case llvm::Triple::ppc64:
7818 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007819 case llvm::Triple::x86:
7820 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007821 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007822 break;
7823 default:
7824 break;
7825 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007826 }
7827
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007828 if (!Args.hasArg(options::OPT_nostdlib) &&
7829 !Args.hasArg(options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00007830 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007831 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007832 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7833 CmdArgs.push_back("-lm");
7834 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007835 if (Args.hasArg(options::OPT_pthread))
7836 CmdArgs.push_back("-lpthread");
7837 CmdArgs.push_back("-lc");
7838
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007839 if (useLibgcc) {
7840 if (Args.hasArg(options::OPT_static)) {
7841 // libgcc_eh depends on libc, so resolve as much as possible,
7842 // pull in any new requirements from libc and then get the rest
7843 // of libgcc.
7844 CmdArgs.push_back("-lgcc_eh");
7845 CmdArgs.push_back("-lc");
7846 CmdArgs.push_back("-lgcc");
7847 } else {
7848 CmdArgs.push_back("-lgcc");
7849 CmdArgs.push_back("--as-needed");
7850 CmdArgs.push_back("-lgcc_s");
7851 CmdArgs.push_back("--no-as-needed");
7852 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007853 }
7854 }
7855
7856 if (!Args.hasArg(options::OPT_nostdlib) &&
7857 !Args.hasArg(options::OPT_nostartfiles)) {
7858 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007859 CmdArgs.push_back(
7860 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007861 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007862 CmdArgs.push_back(
7863 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7864 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007865 }
7866
Alexey Samsonov7811d192014-02-20 13:57:37 +00007867 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007868
Logan Chieneb9162f2014-06-26 14:23:45 +00007869 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007870 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007871}
7872
Douglas Katzman95354292015-06-23 20:42:09 +00007873void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7874 const InputInfo &Output,
7875 const InputInfoList &Inputs,
7876 const ArgList &Args,
7877 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007878 claimNoWarnArgs(Args);
7879
James Y Knight2db38f32015-08-15 03:45:25 +00007880 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
7881 llvm::Triple Triple = llvm::Triple(TripleStr);
7882
Rafael Espindola92b00932010-08-10 00:25:48 +00007883 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007884 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007885
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007886 llvm::Reloc::Model RelocationModel;
7887 unsigned PICLevel;
7888 bool IsPIE;
7889 std::tie(RelocationModel, PICLevel, IsPIE) =
7890 ParsePICArgs(getToolChain(), Triple, Args);
7891
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007892 switch (getToolChain().getArch()) {
7893 default:
7894 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007895 // Add --32/--64 to make sure we get the format we want.
7896 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007897 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007898 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007899 break;
7900 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007901 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7902 CmdArgs.push_back("--x32");
7903 else
7904 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007905 break;
7906 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007907 CmdArgs.push_back("-a32");
7908 CmdArgs.push_back("-mppc");
7909 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007910 break;
7911 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007912 CmdArgs.push_back("-a64");
7913 CmdArgs.push_back("-mppc64");
7914 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007915 break;
7916 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007917 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007918 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007919 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007920 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007921 break;
7922 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007923 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007924 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007925 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007926 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007927 break;
7928 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007929 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007930 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007931 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007932 break;
7933 case llvm::Triple::arm:
7934 case llvm::Triple::armeb:
7935 case llvm::Triple::thumb:
7936 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00007937 const llvm::Triple &Triple2 = getToolChain().getTriple();
7938 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00007939 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007940 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007941 break;
7942 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007943 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007944 break;
7945 default:
7946 break;
7947 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007948
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007949 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007950 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
7951 case arm::FloatABI::Soft:
7952 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
7953 break;
7954 case arm::FloatABI::SoftFP:
7955 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
7956 break;
7957 case arm::FloatABI::Hard:
7958 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
7959 break;
7960 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007961
7962 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007963
7964 // FIXME: remove krait check when GNU tools support krait cpu
7965 // for now replace it with -march=armv7-a to avoid a lower
7966 // march from being picked in the absence of a cpu flag.
7967 Arg *A;
7968 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007969 StringRef(A->getValue()).lower() == "krait")
7970 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00007971 else
7972 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007973 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007974 break;
7975 }
7976 case llvm::Triple::mips:
7977 case llvm::Triple::mipsel:
7978 case llvm::Triple::mips64:
7979 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007980 StringRef CPUName;
7981 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007982 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007983 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007984
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007985 CmdArgs.push_back("-march");
7986 CmdArgs.push_back(CPUName.data());
7987
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007988 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007989 CmdArgs.push_back(ABIName.data());
7990
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007991 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7992 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007993 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007994 CmdArgs.push_back("-mno-shared");
7995
Daniel Sanders379d44b2014-07-16 11:52:23 +00007996 // LLVM doesn't support -mplt yet and acts as if it is always given.
7997 // However, -mplt has no effect with the N64 ABI.
7998 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007999
8000 if (getToolChain().getArch() == llvm::Triple::mips ||
8001 getToolChain().getArch() == llvm::Triple::mips64)
8002 CmdArgs.push_back("-EB");
8003 else
8004 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008005
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008006 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8007 if (StringRef(A->getValue()) == "2008")
8008 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8009 }
8010
Daniel Sanders379d44b2014-07-16 11:52:23 +00008011 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8012 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8013 options::OPT_mfp64)) {
8014 A->claim();
8015 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008016 } else if (mips::shouldUseFPXX(
8017 Args, getToolChain().getTriple(), CPUName, ABIName,
8018 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008019 CmdArgs.push_back("-mfpxx");
8020
8021 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8022 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008023 if (Arg *A =
8024 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008025 if (A->getOption().matches(options::OPT_mips16)) {
8026 A->claim();
8027 A->render(Args, CmdArgs);
8028 } else {
8029 A->claim();
8030 CmdArgs.push_back("-no-mips16");
8031 }
8032 }
8033
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008034 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8035 options::OPT_mno_micromips);
8036 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8037 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8038
Simon Atanasyanbd986632013-11-26 11:58:04 +00008039 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8040 // Do not use AddLastArg because not all versions of MIPS assembler
8041 // support -mmsa / -mno-msa options.
8042 if (A->getOption().matches(options::OPT_mmsa))
8043 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8044 }
8045
Daniel Sanders379d44b2014-07-16 11:52:23 +00008046 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8047 options::OPT_msoft_float);
8048
Toma Tabacub36d6102015-06-11 12:13:18 +00008049 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8050 options::OPT_msingle_float);
8051
Daniel Sanders379d44b2014-07-16 11:52:23 +00008052 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8053 options::OPT_mno_odd_spreg);
8054
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008055 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008056 break;
8057 }
8058 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008059 // Always pass an -march option, since our default of z10 is later
8060 // than the GNU assembler's default.
8061 StringRef CPUName = getSystemZTargetCPU(Args);
8062 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008063 break;
8064 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008065 }
8066
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008067 if (NeedsKPIC) {
8068 if (RelocationModel != llvm::Reloc::Static)
8069 CmdArgs.push_back("-KPIC");
8070 }
Rafael Espindola92b00932010-08-10 00:25:48 +00008071
Renato Golina74bbc72015-07-22 15:32:36 +00008072 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008073 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008074
8075 CmdArgs.push_back("-o");
8076 CmdArgs.push_back(Output.getFilename());
8077
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008078 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008079 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008080
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008081 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008082 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008083
8084 // Handle the debug info splitting at object creation time if we're
8085 // creating an object.
8086 // TODO: Currently only works on linux with newer objcopy.
8087 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008088 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008089 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008090 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008091}
8092
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008093static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008094 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00008095 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Reid Kleckner0213a472015-07-22 16:01:38 +00008096 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008097 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8098 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008099 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008100 CmdArgs.push_back("-lgcc");
8101
Logan Chien3d3373c2012-11-19 12:04:11 +00008102 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008103 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008104 CmdArgs.push_back("-lgcc");
8105 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008106 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008107 CmdArgs.push_back("--as-needed");
8108 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008109 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008110 CmdArgs.push_back("--no-as-needed");
8111 }
8112
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008113 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008114 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008115 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008116 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008117
8118 // According to Android ABI, we have to link with libdl if we are
8119 // linking with non-static libgcc.
8120 //
8121 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8122 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8123 if (isAndroid && !StaticLibgcc)
8124 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008125}
8126
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008127static std::string getLinuxDynamicLinker(const ArgList &Args,
8128 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008129 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8130
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008131 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
8132 if (ToolChain.getTriple().isArch64Bit())
8133 return "/system/bin/linker64";
8134 else
8135 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008136 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8137 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008138 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008139 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008140 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008141 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008142 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008143 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008144 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008145 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008146 return "/lib/ld-linux-armhf.so.3";
8147 else
8148 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008149 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8150 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008151 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008152 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008153 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008154 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008155 return "/lib/ld-linux.so.3";
8156 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8157 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisddb517d2015-10-02 15:00:55 +00008158 StringRef CPUName;
8159 StringRef ABIName;
8160 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
Vasileios Kalintiris712f0882015-10-02 14:38:23 +00008161 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Vasileios Kalintirisddb517d2015-10-02 15:00:55 +00008162
8163 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
8164 .Case("o32", "/lib")
8165 .Case("n32", "/lib32")
8166 .Case("n64", "/lib64")
8167 .Default("/lib");
8168 StringRef LibName;
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008169 if (mips::isUCLibc(Args))
8170 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisddb517d2015-10-02 15:00:55 +00008171 else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008172 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008173
8174 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008175 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008176 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008177 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008178 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8179 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008180 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008181 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008182 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8183 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008184 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008185 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008186 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008187 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008188 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008189 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008190 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8191 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008192 else
8193 return "/lib64/ld-linux-x86-64.so.2";
8194}
8195
Renato Golinc4b49242014-02-13 10:01:16 +00008196static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008197 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008198 // Make use of compiler-rt if --rtlib option is used
8199 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8200
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008201 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008202 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008203 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008204 default:
8205 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008206 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008207 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008208 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008209 break;
8210 }
Renato Golinc4b49242014-02-13 10:01:16 +00008211 break;
8212 case ToolChain::RLT_Libgcc:
8213 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8214 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008215 }
8216}
8217
Rafael Espindola1e085772014-08-15 17:14:35 +00008218static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8219 switch (T.getArch()) {
8220 case llvm::Triple::x86:
8221 return "elf_i386";
8222 case llvm::Triple::aarch64:
8223 return "aarch64linux";
8224 case llvm::Triple::aarch64_be:
8225 return "aarch64_be_linux";
8226 case llvm::Triple::arm:
8227 case llvm::Triple::thumb:
8228 return "armelf_linux_eabi";
8229 case llvm::Triple::armeb:
8230 case llvm::Triple::thumbeb:
8231 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8232 case llvm::Triple::ppc:
8233 return "elf32ppclinux";
8234 case llvm::Triple::ppc64:
8235 return "elf64ppc";
8236 case llvm::Triple::ppc64le:
8237 return "elf64lppc";
8238 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008239 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008240 return "elf32_sparc";
8241 case llvm::Triple::sparcv9:
8242 return "elf64_sparc";
8243 case llvm::Triple::mips:
8244 return "elf32btsmip";
8245 case llvm::Triple::mipsel:
8246 return "elf32ltsmip";
8247 case llvm::Triple::mips64:
8248 if (mips::hasMipsAbiArg(Args, "n32"))
8249 return "elf32btsmipn32";
8250 return "elf64btsmip";
8251 case llvm::Triple::mips64el:
8252 if (mips::hasMipsAbiArg(Args, "n32"))
8253 return "elf32ltsmipn32";
8254 return "elf64ltsmip";
8255 case llvm::Triple::systemz:
8256 return "elf64_s390";
8257 case llvm::Triple::x86_64:
8258 if (T.getEnvironment() == llvm::Triple::GNUX32)
8259 return "elf32_x86_64";
8260 return "elf_x86_64";
8261 default:
8262 llvm_unreachable("Unexpected arch");
8263 }
8264}
8265
Douglas Katzman95354292015-06-23 20:42:09 +00008266void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8267 const InputInfo &Output,
8268 const InputInfoList &Inputs,
8269 const ArgList &Args,
8270 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008271 const toolchains::Linux &ToolChain =
8272 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008273 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008274
8275 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8276 llvm::Triple Triple = llvm::Triple(TripleStr);
8277
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008278 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008279 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008280 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008281 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008282 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8283 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008284
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008285 ArgStringList CmdArgs;
8286
Rafael Espindolad1002f62010-11-15 18:28:16 +00008287 // Silence warning for "clang -g foo.o -o foo"
8288 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008289 // and "clang -emit-llvm foo.o -o foo"
8290 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008291 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008292 // handled somewhere else.
8293 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008294
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008295 if (!D.SysRoot.empty())
8296 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008297
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008298 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008299 CmdArgs.push_back("-pie");
8300
Rafael Espindola1c76c592010-11-07 22:57:16 +00008301 if (Args.hasArg(options::OPT_rdynamic))
8302 CmdArgs.push_back("-export-dynamic");
8303
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008304 if (Args.hasArg(options::OPT_s))
8305 CmdArgs.push_back("-s");
8306
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008307 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008308 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008309
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008310 for (const auto &Opt : ToolChain.ExtraOpts)
8311 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008312
8313 if (!Args.hasArg(options::OPT_static)) {
8314 CmdArgs.push_back("--eh-frame-hdr");
8315 }
8316
8317 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008318 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008319
8320 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008321 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8322 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008323 CmdArgs.push_back("-Bstatic");
8324 else
8325 CmdArgs.push_back("-static");
8326 } else if (Args.hasArg(options::OPT_shared)) {
8327 CmdArgs.push_back("-shared");
8328 }
8329
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008330 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8331 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008332 (!Args.hasArg(options::OPT_static) &&
8333 !Args.hasArg(options::OPT_shared))) {
8334 CmdArgs.push_back("-dynamic-linker");
8335 CmdArgs.push_back(Args.MakeArgString(
8336 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8337 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008338
8339 CmdArgs.push_back("-o");
8340 CmdArgs.push_back(Output.getFilename());
8341
Rafael Espindola81937ec2010-12-01 01:52:43 +00008342 if (!Args.hasArg(options::OPT_nostdlib) &&
8343 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008344 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008345 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008346 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008347 if (Args.hasArg(options::OPT_pg))
8348 crt1 = "gcrt1.o";
8349 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008350 crt1 = "Scrt1.o";
8351 else
8352 crt1 = "crt1.o";
8353 }
8354 if (crt1)
8355 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008356
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008357 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8358 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008359
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008360 const char *crtbegin;
8361 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008362 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008363 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008364 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008365 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008366 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008367 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008368 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisddb517d2015-10-02 15:00:55 +00008369 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008370
8371 // Add crtfastmath.o if available and fast math is enabled.
8372 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008373 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008374
8375 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008376 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008377
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008378 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008379
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008380 for (const auto &Path : Paths)
8381 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008382
Alexey Samsonov907880e2015-06-19 19:57:46 +00008383 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008384 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008385
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008386 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8387 CmdArgs.push_back("--no-demangle");
8388
Alexey Samsonov52550342014-09-15 19:58:40 +00008389 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008390 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008391 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008392 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008393
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008394 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008395 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008396 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008397 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008398 if (OnlyLibstdcxxStatic)
8399 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008400 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008401 if (OnlyLibstdcxxStatic)
8402 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008403 CmdArgs.push_back("-lm");
8404 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008405 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8406 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008407
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008408 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008409 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8410 if (Args.hasArg(options::OPT_static))
8411 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008412
Alexey Samsonov52550342014-09-15 19:58:40 +00008413 if (NeedsSanitizerDeps)
8414 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8415
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008416 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8417 Args.hasArg(options::OPT_pthreads);
8418
8419 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8420 options::OPT_fno_openmp, false)) {
8421 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8422 // FIXME: Does this really make sense for all GNU toolchains?
8423 WantPthread = true;
8424
8425 // Also link the particular OpenMP runtimes.
8426 switch (getOpenMPRuntime(ToolChain, Args)) {
8427 case OMPRT_OMP:
8428 CmdArgs.push_back("-lomp");
8429 break;
8430 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008431 CmdArgs.push_back("-lgomp");
8432
8433 // FIXME: Exclude this for platforms with libgomp that don't require
8434 // librt. Most modern Linux platforms require it, but some may not.
8435 CmdArgs.push_back("-lrt");
8436 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008437 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008438 CmdArgs.push_back("-liomp5");
8439 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008440 case OMPRT_Unknown:
8441 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008442 break;
8443 }
Chandler Carruth01538002013-01-17 13:19:29 +00008444 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008445
Renato Golinc4b49242014-02-13 10:01:16 +00008446 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008447
Richard Smith31d1de22015-05-20 22:48:44 +00008448 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008449 CmdArgs.push_back("-lpthread");
8450
8451 CmdArgs.push_back("-lc");
8452
8453 if (Args.hasArg(options::OPT_static))
8454 CmdArgs.push_back("--end-group");
8455 else
Renato Golinc4b49242014-02-13 10:01:16 +00008456 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008457 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008458
Rafael Espindola81937ec2010-12-01 01:52:43 +00008459 if (!Args.hasArg(options::OPT_nostartfiles)) {
8460 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008461 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008462 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008463 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008464 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008465 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008466 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008467
Vasileios Kalintirisddb517d2015-10-02 15:00:55 +00008468 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008469 if (!isAndroid)
8470 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008471 }
Vasileios Kalintirisddb517d2015-10-02 15:00:55 +00008472 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008473
Justin Bognerd3371d82015-07-17 03:35:54 +00008474 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8475 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008476}
8477
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008478// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8479// for the various SFI requirements like register masking. The assembly tool
8480// inserts the file containing the macros as an input into all the assembly
8481// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008482void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8483 const InputInfo &Output,
8484 const InputInfoList &Inputs,
8485 const ArgList &Args,
8486 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008487 const toolchains::NaClToolChain &ToolChain =
8488 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008489 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8490 "nacl-arm-macros.s");
8491 InputInfoList NewInputs;
8492 NewInputs.push_back(NaClMacros);
8493 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008494 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8495 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008496}
8497
Douglas Katzman750cfc52015-06-29 18:42:16 +00008498// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008499// we use static by default, do not yet support sanitizers or LTO, and a few
8500// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008501// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008502void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8503 const InputInfo &Output,
8504 const InputInfoList &Inputs,
8505 const ArgList &Args,
8506 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008507
Douglas Katzman54366072015-07-27 16:53:08 +00008508 const toolchains::NaClToolChain &ToolChain =
8509 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008510 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008511 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008512 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008513 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008514
8515 ArgStringList CmdArgs;
8516
8517 // Silence warning for "clang -g foo.o -o foo"
8518 Args.ClaimAllArgs(options::OPT_g_Group);
8519 // and "clang -emit-llvm foo.o -o foo"
8520 Args.ClaimAllArgs(options::OPT_emit_llvm);
8521 // and for "clang -w foo.o -o foo". Other warning options are already
8522 // handled somewhere else.
8523 Args.ClaimAllArgs(options::OPT_w);
8524
8525 if (!D.SysRoot.empty())
8526 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8527
8528 if (Args.hasArg(options::OPT_rdynamic))
8529 CmdArgs.push_back("-export-dynamic");
8530
8531 if (Args.hasArg(options::OPT_s))
8532 CmdArgs.push_back("-s");
8533
Douglas Katzman54366072015-07-27 16:53:08 +00008534 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8535 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008536 CmdArgs.push_back("--build-id");
8537
8538 if (!IsStatic)
8539 CmdArgs.push_back("--eh-frame-hdr");
8540
8541 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008542 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008543 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008544 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008545 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008546 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008547 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008548 else if (Arch == llvm::Triple::mipsel)
8549 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008550 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008551 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8552 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008553
8554 if (IsStatic)
8555 CmdArgs.push_back("-static");
8556 else if (Args.hasArg(options::OPT_shared))
8557 CmdArgs.push_back("-shared");
8558
8559 CmdArgs.push_back("-o");
8560 CmdArgs.push_back(Output.getFilename());
8561 if (!Args.hasArg(options::OPT_nostdlib) &&
8562 !Args.hasArg(options::OPT_nostartfiles)) {
8563 if (!Args.hasArg(options::OPT_shared))
8564 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8565 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8566
8567 const char *crtbegin;
8568 if (IsStatic)
8569 crtbegin = "crtbeginT.o";
8570 else if (Args.hasArg(options::OPT_shared))
8571 crtbegin = "crtbeginS.o";
8572 else
8573 crtbegin = "crtbegin.o";
8574 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8575 }
8576
8577 Args.AddAllArgs(CmdArgs, options::OPT_L);
8578 Args.AddAllArgs(CmdArgs, options::OPT_u);
8579
8580 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8581
8582 for (const auto &Path : Paths)
8583 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8584
8585 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8586 CmdArgs.push_back("--no-demangle");
8587
8588 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8589
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008590 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008591 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008592 bool OnlyLibstdcxxStatic =
8593 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008594 if (OnlyLibstdcxxStatic)
8595 CmdArgs.push_back("-Bstatic");
8596 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8597 if (OnlyLibstdcxxStatic)
8598 CmdArgs.push_back("-Bdynamic");
8599 CmdArgs.push_back("-lm");
8600 }
8601
8602 if (!Args.hasArg(options::OPT_nostdlib)) {
8603 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8604 // Always use groups, since it has no effect on dynamic libraries.
8605 CmdArgs.push_back("--start-group");
8606 CmdArgs.push_back("-lc");
8607 // NaCl's libc++ currently requires libpthread, so just always include it
8608 // in the group for C++.
8609 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008610 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008611 // Gold, used by Mips, handles nested groups differently than ld, and
8612 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8613 // which is not a desired behaviour here.
8614 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8615 if (getToolChain().getArch() == llvm::Triple::mipsel)
8616 CmdArgs.push_back("-lnacl");
8617
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008618 CmdArgs.push_back("-lpthread");
8619 }
8620
8621 CmdArgs.push_back("-lgcc");
8622 CmdArgs.push_back("--as-needed");
8623 if (IsStatic)
8624 CmdArgs.push_back("-lgcc_eh");
8625 else
8626 CmdArgs.push_back("-lgcc_s");
8627 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008628
8629 // Mips needs to create and use pnacl_legacy library that contains
8630 // definitions from bitcode/pnaclmm.c and definitions for
8631 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8632 if (getToolChain().getArch() == llvm::Triple::mipsel)
8633 CmdArgs.push_back("-lpnacl_legacy");
8634
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008635 CmdArgs.push_back("--end-group");
8636 }
8637
8638 if (!Args.hasArg(options::OPT_nostartfiles)) {
8639 const char *crtend;
8640 if (Args.hasArg(options::OPT_shared))
8641 crtend = "crtendS.o";
8642 else
8643 crtend = "crtend.o";
8644
8645 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8646 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8647 }
8648 }
8649
Justin Bognerd3371d82015-07-17 03:35:54 +00008650 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8651 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008652}
8653
Douglas Katzman95354292015-06-23 20:42:09 +00008654void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8655 const InputInfo &Output,
8656 const InputInfoList &Inputs,
8657 const ArgList &Args,
8658 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008659 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008660 ArgStringList CmdArgs;
8661
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008662 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008663
8664 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008665 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008666
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008667 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008668 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008669
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008670 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008671 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008672}
8673
Douglas Katzman95354292015-06-23 20:42:09 +00008674void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8675 const InputInfo &Output,
8676 const InputInfoList &Inputs,
8677 const ArgList &Args,
8678 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008679 const Driver &D = getToolChain().getDriver();
8680 ArgStringList CmdArgs;
8681
Daniel Dunbarb440f562010-08-02 02:38:21 +00008682 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008683 CmdArgs.push_back("-o");
8684 CmdArgs.push_back(Output.getFilename());
8685 } else {
8686 assert(Output.isNothing() && "Invalid output.");
8687 }
8688
8689 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008690 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008691 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8692 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8693 CmdArgs.push_back(
8694 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8695 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008696 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008697
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008698 Args.AddAllArgs(CmdArgs,
8699 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008700
Daniel Dunbar54423b22010-09-17 00:24:54 +00008701 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008702
Alexey Samsonov7811d192014-02-20 13:57:37 +00008703 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008704
Chris Lattner3e2ee142010-07-07 16:01:42 +00008705 if (!Args.hasArg(options::OPT_nostdlib) &&
8706 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008707 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008708 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008709 CmdArgs.push_back("-lm");
8710 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008711 }
8712
8713 if (!Args.hasArg(options::OPT_nostdlib) &&
8714 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008715 if (Args.hasArg(options::OPT_pthread))
8716 CmdArgs.push_back("-lpthread");
8717 CmdArgs.push_back("-lc");
8718 CmdArgs.push_back("-lCompilerRT-Generic");
8719 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8720 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008721 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008722 }
8723
Logan Chieneb9162f2014-06-26 14:23:45 +00008724 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008725 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008726}
8727
Daniel Dunbarcc912342009-05-02 18:28:39 +00008728/// DragonFly Tools
8729
8730// For now, DragonFly Assemble does just about the same as for
8731// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008732void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8733 const InputInfo &Output,
8734 const InputInfoList &Inputs,
8735 const ArgList &Args,
8736 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008737 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008738 ArgStringList CmdArgs;
8739
8740 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8741 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008742 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008743 CmdArgs.push_back("--32");
8744
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008745 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008746
8747 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008748 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008749
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008750 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008751 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008752
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008753 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008754 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008755}
8756
Douglas Katzman95354292015-06-23 20:42:09 +00008757void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8758 const InputInfo &Output,
8759 const InputInfoList &Inputs,
8760 const ArgList &Args,
8761 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008762 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008763 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008764 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008765
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008766 if (!D.SysRoot.empty())
8767 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8768
John McCall65b8da02013-04-11 22:55:55 +00008769 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008770 if (Args.hasArg(options::OPT_static)) {
8771 CmdArgs.push_back("-Bstatic");
8772 } else {
John McCall65b8da02013-04-11 22:55:55 +00008773 if (Args.hasArg(options::OPT_rdynamic))
8774 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008775 if (Args.hasArg(options::OPT_shared))
8776 CmdArgs.push_back("-Bshareable");
8777 else {
8778 CmdArgs.push_back("-dynamic-linker");
8779 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8780 }
John McCall65b8da02013-04-11 22:55:55 +00008781 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008782 }
8783
8784 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8785 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008786 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008787 CmdArgs.push_back("-m");
8788 CmdArgs.push_back("elf_i386");
8789 }
8790
Daniel Dunbarb440f562010-08-02 02:38:21 +00008791 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008792 CmdArgs.push_back("-o");
8793 CmdArgs.push_back(Output.getFilename());
8794 } else {
8795 assert(Output.isNothing() && "Invalid output.");
8796 }
8797
8798 if (!Args.hasArg(options::OPT_nostdlib) &&
8799 !Args.hasArg(options::OPT_nostartfiles)) {
8800 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008801 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008802 CmdArgs.push_back(
8803 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008804 else {
8805 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008806 CmdArgs.push_back(
8807 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008808 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008809 CmdArgs.push_back(
8810 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008811 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008812 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008813 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008814 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008815 CmdArgs.push_back(
8816 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008817 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008818 CmdArgs.push_back(
8819 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008820 }
8821
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008822 Args.AddAllArgs(CmdArgs,
8823 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00008824
Daniel Dunbar54423b22010-09-17 00:24:54 +00008825 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008826
8827 if (!Args.hasArg(options::OPT_nostdlib) &&
8828 !Args.hasArg(options::OPT_nodefaultlibs)) {
8829 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8830 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008831 if (UseGCC47)
8832 CmdArgs.push_back("-L/usr/lib/gcc47");
8833 else
8834 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008835
8836 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008837 if (UseGCC47) {
8838 CmdArgs.push_back("-rpath");
8839 CmdArgs.push_back("/usr/lib/gcc47");
8840 } else {
8841 CmdArgs.push_back("-rpath");
8842 CmdArgs.push_back("/usr/lib/gcc44");
8843 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008844 }
8845
Hans Wennborg70850d82013-07-18 20:29:38 +00008846 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008847 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008848 CmdArgs.push_back("-lm");
8849 }
8850
Daniel Dunbarcc912342009-05-02 18:28:39 +00008851 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008852 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008853
8854 if (!Args.hasArg(options::OPT_nolibc)) {
8855 CmdArgs.push_back("-lc");
8856 }
8857
John McCall65b8da02013-04-11 22:55:55 +00008858 if (UseGCC47) {
8859 if (Args.hasArg(options::OPT_static) ||
8860 Args.hasArg(options::OPT_static_libgcc)) {
8861 CmdArgs.push_back("-lgcc");
8862 CmdArgs.push_back("-lgcc_eh");
8863 } else {
8864 if (Args.hasArg(options::OPT_shared_libgcc)) {
8865 CmdArgs.push_back("-lgcc_pic");
8866 if (!Args.hasArg(options::OPT_shared))
8867 CmdArgs.push_back("-lgcc");
8868 } else {
8869 CmdArgs.push_back("-lgcc");
8870 CmdArgs.push_back("--as-needed");
8871 CmdArgs.push_back("-lgcc_pic");
8872 CmdArgs.push_back("--no-as-needed");
8873 }
8874 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008875 } else {
John McCall65b8da02013-04-11 22:55:55 +00008876 if (Args.hasArg(options::OPT_shared)) {
8877 CmdArgs.push_back("-lgcc_pic");
8878 } else {
8879 CmdArgs.push_back("-lgcc");
8880 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008881 }
8882 }
8883
8884 if (!Args.hasArg(options::OPT_nostdlib) &&
8885 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008886 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008887 CmdArgs.push_back(
8888 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008889 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008890 CmdArgs.push_back(
8891 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8892 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008893 }
8894
Alexey Samsonov7811d192014-02-20 13:57:37 +00008895 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008896
Logan Chieneb9162f2014-06-26 14:23:45 +00008897 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008898 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008899}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008900
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008901// Try to find Exe from a Visual Studio distribution. This first tries to find
8902// an installed copy of Visual Studio and, failing that, looks in the PATH,
8903// making sure that whatever executable that's found is not a same-named exe
8904// from clang itself to prevent clang from falling back to itself.
8905static std::string FindVisualStudioExecutable(const ToolChain &TC,
8906 const char *Exe,
8907 const char *ClangProgramPath) {
8908 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8909 std::string visualStudioBinDir;
8910 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8911 visualStudioBinDir)) {
8912 SmallString<128> FilePath(visualStudioBinDir);
8913 llvm::sys::path::append(FilePath, Exe);
8914 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8915 return FilePath.str();
8916 }
8917
8918 return Exe;
8919}
8920
Douglas Katzman95354292015-06-23 20:42:09 +00008921void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8922 const InputInfo &Output,
8923 const InputInfoList &Inputs,
8924 const ArgList &Args,
8925 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008926 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008927 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008928
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008929 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8930 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008931 CmdArgs.push_back(
8932 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008933
8934 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008935 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008936 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008937
Zachary Turner10d75b22014-10-22 20:40:43 +00008938 if (!llvm::sys::Process::GetEnv("LIB")) {
8939 // If the VC environment hasn't been configured (perhaps because the user
8940 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008941 // the environment variable is set however, assume the user knows what
8942 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008943 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008944 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008945 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8946 SmallString<128> LibDir(VisualStudioDir);
8947 llvm::sys::path::append(LibDir, "VC", "lib");
8948 switch (MSVC.getArch()) {
8949 case llvm::Triple::x86:
8950 // x86 just puts the libraries directly in lib
8951 break;
8952 case llvm::Triple::x86_64:
8953 llvm::sys::path::append(LibDir, "amd64");
8954 break;
8955 case llvm::Triple::arm:
8956 llvm::sys::path::append(LibDir, "arm");
8957 break;
8958 default:
8959 break;
8960 }
8961 CmdArgs.push_back(
8962 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00008963
8964 if (MSVC.useUniversalCRT(VisualStudioDir)) {
8965 std::string UniversalCRTLibPath;
8966 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
8967 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8968 UniversalCRTLibPath.c_str()));
8969 }
Zachary Turner10d75b22014-10-22 20:40:43 +00008970 }
8971
8972 std::string WindowsSdkLibPath;
8973 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8974 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8975 WindowsSdkLibPath.c_str()));
8976 }
8977
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008978 CmdArgs.push_back("-nologo");
8979
Reid Kleckner124955a2015-08-05 18:51:13 +00008980 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008981 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008982
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008983 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00008984 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008985 if (DLL) {
8986 CmdArgs.push_back(Args.MakeArgString("-dll"));
8987
8988 SmallString<128> ImplibName(Output.getFilename());
8989 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008990 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008991 }
8992
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008993 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008994 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008995 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008996 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008997 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008998 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008999 };
9000 for (const auto &Component : CompilerRTComponents)
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00009001 CmdArgs.push_back(getCompilerRTArgString(TC, Args, Component));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009002 // Make sure the dynamic runtime thunk is not optimized out at link time
9003 // to ensure proper SEH handling.
9004 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009005 } else if (DLL) {
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00009006 CmdArgs.push_back(getCompilerRTArgString(TC, Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009007 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00009008 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009009 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00009010 };
9011 for (const auto &Component : CompilerRTComponents)
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00009012 CmdArgs.push_back(getCompilerRTArgString(TC, Args, Component));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009013 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009014 }
9015
Hans Wennborg2e274592013-08-13 23:38:57 +00009016 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009017
Alexey Bataevc7e84352015-08-19 04:49:01 +00009018 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9019 options::OPT_fno_openmp, false)) {
9020 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9021 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9022 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9023 TC.getDriver().Dir + "/../lib"));
9024 switch (getOpenMPRuntime(getToolChain(), Args)) {
9025 case OMPRT_OMP:
9026 CmdArgs.push_back("-defaultlib:libomp.lib");
9027 break;
9028 case OMPRT_IOMP5:
9029 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9030 break;
9031 case OMPRT_GOMP:
9032 break;
9033 case OMPRT_Unknown:
9034 // Already diagnosed.
9035 break;
9036 }
9037 }
9038
Reid Kleckner337188f2014-09-16 19:22:00 +00009039 // Add filenames, libraries, and other linker inputs.
9040 for (const auto &Input : Inputs) {
9041 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009042 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009043 continue;
9044 }
9045
9046 const Arg &A = Input.getInputArg();
9047
9048 // Render -l options differently for the MSVC linker.
9049 if (A.getOption().matches(options::OPT_l)) {
9050 StringRef Lib = A.getValue();
9051 const char *LinkLibArg;
9052 if (Lib.endswith(".lib"))
9053 LinkLibArg = Args.MakeArgString(Lib);
9054 else
9055 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9056 CmdArgs.push_back(LinkLibArg);
9057 continue;
9058 }
9059
9060 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9061 // or -L. Render it, even if MSVC doesn't understand it.
9062 A.renderAsInput(Args, CmdArgs);
9063 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009064
Zachary Turner719f58c2014-12-01 23:06:47 +00009065 // We need to special case some linker paths. In the case of lld, we need to
9066 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9067 // linker, we need to use a special search algorithm.
9068 llvm::SmallString<128> linkPath;
9069 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9070 if (Linker.equals_lower("lld"))
9071 Linker = "lld-link";
9072
9073 if (Linker.equals_lower("link")) {
9074 // If we're using the MSVC linker, it's not sufficient to just use link
9075 // from the program PATH, because other environments like GnuWin32 install
9076 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009077 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009078 C.getDriver().getClangProgramPath());
9079 } else {
9080 linkPath = Linker;
9081 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009082 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009083 }
9084
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009085 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009086 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009087}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009088
Douglas Katzman95354292015-06-23 20:42:09 +00009089void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9090 const InputInfo &Output,
9091 const InputInfoList &Inputs,
9092 const ArgList &Args,
9093 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009094 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9095}
9096
Douglas Katzman95354292015-06-23 20:42:09 +00009097std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009098 Compilation &C, const JobAction &JA, const InputInfo &Output,
9099 const InputInfoList &Inputs, const ArgList &Args,
9100 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009101 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009102 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009103 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009104 CmdArgs.push_back("/W0"); // No warnings.
9105
9106 // The goal is to be able to invoke this tool correctly based on
9107 // any flag accepted by clang-cl.
9108
9109 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009110 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009111
9112 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009113 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9114 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9115 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009116 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9117 if (A->getOption().getID() == options::OPT_O0) {
9118 CmdArgs.push_back("/Od");
9119 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009120 CmdArgs.push_back("/Og");
9121
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009122 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009123 if (OptLevel == "s" || OptLevel == "z")
9124 CmdArgs.push_back("/Os");
9125 else
9126 CmdArgs.push_back("/Ot");
9127
9128 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009129 }
9130 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009131 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9132 options::OPT_fno_omit_frame_pointer))
9133 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9134 ? "/Oy"
9135 : "/Oy-");
9136 if (!Args.hasArg(options::OPT_fwritable_strings))
9137 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009138
Nico Weber3f8dafb2015-03-12 19:37:10 +00009139 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009140 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9141
David Majnemerf6072342014-07-01 22:24:56 +00009142 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9143 /*default=*/false))
9144 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009145 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9146 options::OPT_fno_function_sections))
9147 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9148 ? "/Gy"
9149 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009150 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9151 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009152 CmdArgs.push_back(
9153 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009154 if (Args.hasArg(options::OPT_fsyntax_only))
9155 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009156 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9157 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009158 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009159
Nico Weber3f8dafb2015-03-12 19:37:10 +00009160 std::vector<std::string> Includes =
9161 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009162 for (const auto &Include : Includes)
9163 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009164
Hans Wennborg87cfa712013-09-19 20:32:16 +00009165 // Flags that can simply be passed through.
9166 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9167 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009168 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009169 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009170
9171 // The order of these flags is relevant, so pick the last one.
9172 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9173 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9174 A->render(Args, CmdArgs);
9175
Hans Wennborg87cfa712013-09-19 20:32:16 +00009176 // Input filename.
9177 assert(Inputs.size() == 1);
9178 const InputInfo &II = Inputs[0];
9179 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9180 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9181 if (II.isFilename())
9182 CmdArgs.push_back(II.getFilename());
9183 else
9184 II.getInputArg().renderAsInput(Args, CmdArgs);
9185
9186 // Output filename.
9187 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009188 const char *Fo =
9189 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009190 CmdArgs.push_back(Fo);
9191
Hans Wennborg188382e2013-09-20 18:16:35 +00009192 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009193 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9194 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009195 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009196 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009197}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009198
Yaron Keren1c0070c2015-07-02 04:45:27 +00009199/// MinGW Tools
9200void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9201 const InputInfo &Output,
9202 const InputInfoList &Inputs,
9203 const ArgList &Args,
9204 const char *LinkingOutput) const {
9205 claimNoWarnArgs(Args);
9206 ArgStringList CmdArgs;
9207
9208 if (getToolChain().getArch() == llvm::Triple::x86) {
9209 CmdArgs.push_back("--32");
9210 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9211 CmdArgs.push_back("--64");
9212 }
9213
9214 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9215
9216 CmdArgs.push_back("-o");
9217 CmdArgs.push_back(Output.getFilename());
9218
9219 for (const auto &II : Inputs)
9220 CmdArgs.push_back(II.getFilename());
9221
9222 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009223 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009224
9225 if (Args.hasArg(options::OPT_gsplit_dwarf))
9226 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9227 SplitDebugName(Args, Inputs[0]));
9228}
9229
9230void MinGW::Linker::AddLibGCC(const ArgList &Args,
9231 ArgStringList &CmdArgs) const {
9232 if (Args.hasArg(options::OPT_mthreads))
9233 CmdArgs.push_back("-lmingwthrd");
9234 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009235
Yaron Kerenaa281332015-08-09 00:24:07 +00009236 // Make use of compiler-rt if --rtlib option is used
9237 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9238 if (RLT == ToolChain::RLT_Libgcc) {
9239 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9240 Args.hasArg(options::OPT_static);
9241 bool Shared = Args.hasArg(options::OPT_shared);
9242 bool CXX = getToolChain().getDriver().CCCIsCXX();
9243
9244 if (Static || (!CXX && !Shared)) {
9245 CmdArgs.push_back("-lgcc");
9246 CmdArgs.push_back("-lgcc_eh");
9247 } else {
9248 CmdArgs.push_back("-lgcc_s");
9249 CmdArgs.push_back("-lgcc");
9250 }
9251 } else {
9252 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9253 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009254
Yaron Keren1c0070c2015-07-02 04:45:27 +00009255 CmdArgs.push_back("-lmoldname");
9256 CmdArgs.push_back("-lmingwex");
9257 CmdArgs.push_back("-lmsvcrt");
9258}
9259
9260void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9261 const InputInfo &Output,
9262 const InputInfoList &Inputs,
9263 const ArgList &Args,
9264 const char *LinkingOutput) const {
9265 const ToolChain &TC = getToolChain();
9266 const Driver &D = TC.getDriver();
9267 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9268
9269 ArgStringList CmdArgs;
9270
9271 // Silence warning for "clang -g foo.o -o foo"
9272 Args.ClaimAllArgs(options::OPT_g_Group);
9273 // and "clang -emit-llvm foo.o -o foo"
9274 Args.ClaimAllArgs(options::OPT_emit_llvm);
9275 // and for "clang -w foo.o -o foo". Other warning options are already
9276 // handled somewhere else.
9277 Args.ClaimAllArgs(options::OPT_w);
9278
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009279 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9280 if (LinkerName.equals_lower("lld")) {
9281 CmdArgs.push_back("-flavor");
9282 CmdArgs.push_back("gnu");
9283 }
9284
Yaron Keren1c0070c2015-07-02 04:45:27 +00009285 if (!D.SysRoot.empty())
9286 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9287
9288 if (Args.hasArg(options::OPT_s))
9289 CmdArgs.push_back("-s");
9290
9291 CmdArgs.push_back("-m");
9292 if (TC.getArch() == llvm::Triple::x86)
9293 CmdArgs.push_back("i386pe");
9294 if (TC.getArch() == llvm::Triple::x86_64)
9295 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009296 if (TC.getArch() == llvm::Triple::arm)
9297 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009298
9299 if (Args.hasArg(options::OPT_mwindows)) {
9300 CmdArgs.push_back("--subsystem");
9301 CmdArgs.push_back("windows");
9302 } else if (Args.hasArg(options::OPT_mconsole)) {
9303 CmdArgs.push_back("--subsystem");
9304 CmdArgs.push_back("console");
9305 }
9306
9307 if (Args.hasArg(options::OPT_static))
9308 CmdArgs.push_back("-Bstatic");
9309 else {
9310 if (Args.hasArg(options::OPT_mdll))
9311 CmdArgs.push_back("--dll");
9312 else if (Args.hasArg(options::OPT_shared))
9313 CmdArgs.push_back("--shared");
9314 CmdArgs.push_back("-Bdynamic");
9315 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9316 CmdArgs.push_back("-e");
9317 if (TC.getArch() == llvm::Triple::x86)
9318 CmdArgs.push_back("_DllMainCRTStartup@12");
9319 else
9320 CmdArgs.push_back("DllMainCRTStartup");
9321 CmdArgs.push_back("--enable-auto-image-base");
9322 }
9323 }
9324
9325 CmdArgs.push_back("-o");
9326 CmdArgs.push_back(Output.getFilename());
9327
9328 Args.AddAllArgs(CmdArgs, options::OPT_e);
9329 // FIXME: add -N, -n flags
9330 Args.AddLastArg(CmdArgs, options::OPT_r);
9331 Args.AddLastArg(CmdArgs, options::OPT_s);
9332 Args.AddLastArg(CmdArgs, options::OPT_t);
9333 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9334 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9335
9336 if (!Args.hasArg(options::OPT_nostdlib) &&
9337 !Args.hasArg(options::OPT_nostartfiles)) {
9338 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9339 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9340 } else {
9341 if (Args.hasArg(options::OPT_municode))
9342 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9343 else
9344 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9345 }
9346 if (Args.hasArg(options::OPT_pg))
9347 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9348 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9349 }
9350
9351 Args.AddAllArgs(CmdArgs, options::OPT_L);
9352 const ToolChain::path_list Paths = TC.getFilePaths();
9353 for (const auto &Path : Paths)
9354 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9355
9356 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9357
9358 // TODO: Add ASan stuff here
9359
9360 // TODO: Add profile stuff here
9361
9362 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9363 !Args.hasArg(options::OPT_nodefaultlibs)) {
9364 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9365 !Args.hasArg(options::OPT_static);
9366 if (OnlyLibstdcxxStatic)
9367 CmdArgs.push_back("-Bstatic");
9368 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9369 if (OnlyLibstdcxxStatic)
9370 CmdArgs.push_back("-Bdynamic");
9371 }
9372
9373 if (!Args.hasArg(options::OPT_nostdlib)) {
9374 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9375 if (Args.hasArg(options::OPT_static))
9376 CmdArgs.push_back("--start-group");
9377
9378 if (Args.hasArg(options::OPT_fstack_protector) ||
9379 Args.hasArg(options::OPT_fstack_protector_strong) ||
9380 Args.hasArg(options::OPT_fstack_protector_all)) {
9381 CmdArgs.push_back("-lssp_nonshared");
9382 CmdArgs.push_back("-lssp");
9383 }
9384 if (Args.hasArg(options::OPT_fopenmp))
9385 CmdArgs.push_back("-lgomp");
9386
9387 AddLibGCC(Args, CmdArgs);
9388
9389 if (Args.hasArg(options::OPT_pg))
9390 CmdArgs.push_back("-lgmon");
9391
Yaron Kerenadce68e2015-07-06 18:52:19 +00009392 if (Args.hasArg(options::OPT_pthread))
9393 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009394
9395 // add system libraries
9396 if (Args.hasArg(options::OPT_mwindows)) {
9397 CmdArgs.push_back("-lgdi32");
9398 CmdArgs.push_back("-lcomdlg32");
9399 }
9400 CmdArgs.push_back("-ladvapi32");
9401 CmdArgs.push_back("-lshell32");
9402 CmdArgs.push_back("-luser32");
9403 CmdArgs.push_back("-lkernel32");
9404
9405 if (Args.hasArg(options::OPT_static))
9406 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009407 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009408 AddLibGCC(Args, CmdArgs);
9409 }
9410
9411 if (!Args.hasArg(options::OPT_nostartfiles)) {
9412 // Add crtfastmath.o if available and fast math is enabled.
9413 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9414
9415 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9416 }
9417 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009418 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009419 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009420}
9421
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009422/// XCore Tools
9423// We pass assemble and link construction to the xcc tool.
9424
Douglas Katzman95354292015-06-23 20:42:09 +00009425void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9426 const InputInfo &Output,
9427 const InputInfoList &Inputs,
9428 const ArgList &Args,
9429 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009430 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009431 ArgStringList CmdArgs;
9432
9433 CmdArgs.push_back("-o");
9434 CmdArgs.push_back(Output.getFilename());
9435
9436 CmdArgs.push_back("-c");
9437
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009438 if (Args.hasArg(options::OPT_v))
9439 CmdArgs.push_back("-v");
9440
Robert Lytton894d25c2014-05-02 09:33:25 +00009441 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9442 if (!A->getOption().matches(options::OPT_g0))
9443 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009444
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009445 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9446 false))
9447 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009448
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009449 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009450
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009451 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009452 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009453
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009454 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009455 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009456}
9457
Douglas Katzman95354292015-06-23 20:42:09 +00009458void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9459 const InputInfo &Output,
9460 const InputInfoList &Inputs,
9461 const ArgList &Args,
9462 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009463 ArgStringList CmdArgs;
9464
9465 if (Output.isFilename()) {
9466 CmdArgs.push_back("-o");
9467 CmdArgs.push_back(Output.getFilename());
9468 } else {
9469 assert(Output.isNothing() && "Invalid output.");
9470 }
9471
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009472 if (Args.hasArg(options::OPT_v))
9473 CmdArgs.push_back("-v");
9474
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009475 // Pass -fexceptions through to the linker if it was present.
9476 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9477 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009478 CmdArgs.push_back("-fexceptions");
9479
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009480 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9481
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009482 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009483 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009484}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009485
Douglas Katzman95354292015-06-23 20:42:09 +00009486void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9487 const InputInfo &Output,
9488 const InputInfoList &Inputs,
9489 const ArgList &Args,
9490 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009491 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009492 const auto &TC =
9493 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9494 ArgStringList CmdArgs;
9495 const char *Exec;
9496
9497 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009498 default:
9499 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009500 case llvm::Triple::arm:
9501 case llvm::Triple::thumb:
9502 break;
9503 case llvm::Triple::x86:
9504 CmdArgs.push_back("--32");
9505 break;
9506 case llvm::Triple::x86_64:
9507 CmdArgs.push_back("--64");
9508 break;
9509 }
9510
9511 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9512
9513 CmdArgs.push_back("-o");
9514 CmdArgs.push_back(Output.getFilename());
9515
9516 for (const auto &Input : Inputs)
9517 CmdArgs.push_back(Input.getFilename());
9518
9519 const std::string Assembler = TC.GetProgramPath("as");
9520 Exec = Args.MakeArgString(Assembler);
9521
Justin Bognerd3371d82015-07-17 03:35:54 +00009522 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009523}
9524
Douglas Katzman95354292015-06-23 20:42:09 +00009525void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9526 const InputInfo &Output,
9527 const InputInfoList &Inputs,
9528 const ArgList &Args,
9529 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009530 const auto &TC =
9531 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9532 const llvm::Triple &T = TC.getTriple();
9533 const Driver &D = TC.getDriver();
9534 SmallString<128> EntryPoint;
9535 ArgStringList CmdArgs;
9536 const char *Exec;
9537
9538 // Silence warning for "clang -g foo.o -o foo"
9539 Args.ClaimAllArgs(options::OPT_g_Group);
9540 // and "clang -emit-llvm foo.o -o foo"
9541 Args.ClaimAllArgs(options::OPT_emit_llvm);
9542 // and for "clang -w foo.o -o foo"
9543 Args.ClaimAllArgs(options::OPT_w);
9544 // Other warning options are already handled somewhere else.
9545
9546 if (!D.SysRoot.empty())
9547 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9548
9549 if (Args.hasArg(options::OPT_pie))
9550 CmdArgs.push_back("-pie");
9551 if (Args.hasArg(options::OPT_rdynamic))
9552 CmdArgs.push_back("-export-dynamic");
9553 if (Args.hasArg(options::OPT_s))
9554 CmdArgs.push_back("--strip-all");
9555
9556 CmdArgs.push_back("-m");
9557 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009558 default:
9559 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009560 case llvm::Triple::arm:
9561 case llvm::Triple::thumb:
9562 // FIXME: this is incorrect for WinCE
9563 CmdArgs.push_back("thumb2pe");
9564 break;
9565 case llvm::Triple::x86:
9566 CmdArgs.push_back("i386pe");
9567 EntryPoint.append("_");
9568 break;
9569 case llvm::Triple::x86_64:
9570 CmdArgs.push_back("i386pep");
9571 break;
9572 }
9573
9574 if (Args.hasArg(options::OPT_shared)) {
9575 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009576 default:
9577 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009578 case llvm::Triple::arm:
9579 case llvm::Triple::thumb:
9580 case llvm::Triple::x86_64:
9581 EntryPoint.append("_DllMainCRTStartup");
9582 break;
9583 case llvm::Triple::x86:
9584 EntryPoint.append("_DllMainCRTStartup@12");
9585 break;
9586 }
9587
9588 CmdArgs.push_back("-shared");
9589 CmdArgs.push_back("-Bdynamic");
9590
9591 CmdArgs.push_back("--enable-auto-image-base");
9592
9593 CmdArgs.push_back("--entry");
9594 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9595 } else {
9596 EntryPoint.append("mainCRTStartup");
9597
9598 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9599 : "-Bdynamic");
9600
9601 if (!Args.hasArg(options::OPT_nostdlib) &&
9602 !Args.hasArg(options::OPT_nostartfiles)) {
9603 CmdArgs.push_back("--entry");
9604 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9605 }
9606
9607 // FIXME: handle subsystem
9608 }
9609
9610 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009611 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009612
9613 CmdArgs.push_back("-o");
9614 CmdArgs.push_back(Output.getFilename());
9615
9616 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9617 SmallString<261> ImpLib(Output.getFilename());
9618 llvm::sys::path::replace_extension(ImpLib, ".lib");
9619
9620 CmdArgs.push_back("--out-implib");
9621 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9622 }
9623
9624 if (!Args.hasArg(options::OPT_nostdlib) &&
9625 !Args.hasArg(options::OPT_nostartfiles)) {
9626 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9627 const char *CRTBegin;
9628
9629 CRTBegin =
9630 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9631 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9632 }
9633
9634 Args.AddAllArgs(CmdArgs, options::OPT_L);
9635
9636 const auto &Paths = TC.getFilePaths();
9637 for (const auto &Path : Paths)
9638 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9639
9640 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9641
9642 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9643 !Args.hasArg(options::OPT_nodefaultlibs)) {
9644 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9645 !Args.hasArg(options::OPT_static);
9646 if (StaticCXX)
9647 CmdArgs.push_back("-Bstatic");
9648 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9649 if (StaticCXX)
9650 CmdArgs.push_back("-Bdynamic");
9651 }
9652
9653 if (!Args.hasArg(options::OPT_nostdlib)) {
9654 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9655 // TODO handle /MT[d] /MD[d]
9656 CmdArgs.push_back("-lmsvcrt");
9657 AddRunTimeLibs(TC, D, CmdArgs, Args);
9658 }
9659 }
9660
9661 const std::string Linker = TC.GetProgramPath("ld");
9662 Exec = Args.MakeArgString(Linker);
9663
Justin Bognerd3371d82015-07-17 03:35:54 +00009664 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009665}
Douglas Katzman84a75642015-06-19 14:55:19 +00009666
Douglas Katzman95354292015-06-23 20:42:09 +00009667void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9668 const InputInfo &Output,
9669 const InputInfoList &Inputs,
9670 const ArgList &Args,
9671 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009672
9673 ArgStringList CmdArgs;
9674
9675 assert(Inputs.size() == 1);
9676 const InputInfo &II = Inputs[0];
9677 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9678 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9679
Douglas Katzman84a75642015-06-19 14:55:19 +00009680 CmdArgs.push_back("-DMYRIAD2");
9681 CmdArgs.push_back("-mcpu=myriad2");
9682 CmdArgs.push_back("-S");
9683
Douglas Katzmanf6071112015-08-03 14:34:22 +00009684 // Append all -I, -iquote, -isystem paths, defines/undefines,
9685 // 'f' flags, optimize flags, and warning options.
9686 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +00009687 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
9688 options::OPT_D, options::OPT_U,
9689 options::OPT_f_Group, options::OPT_f_clang_Group,
9690 options::OPT_g_Group, options::OPT_M_Group,
9691 options::OPT_O_Group, options::OPT_W_Group});
9692
9693 // If we're producing a dependency file, and assembly is the final action,
9694 // then the name of the target in the dependency file should be the '.o'
9695 // file, not the '.s' file produced by this step. For example, instead of
9696 // /tmp/mumble.s: mumble.c .../someheader.h
9697 // the filename on the lefthand side should be "mumble.o"
9698 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
9699 C.getActions().size() == 1 &&
9700 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
9701 Arg *A = Args.getLastArg(options::OPT_o);
9702 if (A) {
9703 CmdArgs.push_back("-MT");
9704 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
9705 }
9706 }
9707
Douglas Katzman84a75642015-06-19 14:55:19 +00009708 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9709
9710 CmdArgs.push_back(II.getFilename());
9711 CmdArgs.push_back("-o");
9712 CmdArgs.push_back(Output.getFilename());
9713
9714 std::string Exec =
9715 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009716 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9717 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009718}
9719
Douglas Katzman95354292015-06-23 20:42:09 +00009720void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9721 const InputInfo &Output,
9722 const InputInfoList &Inputs,
9723 const ArgList &Args,
9724 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009725 ArgStringList CmdArgs;
9726
9727 assert(Inputs.size() == 1);
9728 const InputInfo &II = Inputs[0];
9729 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9730 assert(Output.getType() == types::TY_Object);
9731
9732 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009733 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +00009734 CmdArgs.push_back("-noSPrefixing");
9735 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009736 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9737 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
9738 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +00009739 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009740 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +00009741 }
9742 CmdArgs.push_back("-elf"); // Output format.
9743 CmdArgs.push_back(II.getFilename());
9744 CmdArgs.push_back(
9745 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9746
9747 std::string Exec =
9748 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009749 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9750 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009751}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009752
9753void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9754 const InputInfo &Output,
9755 const InputInfoList &Inputs,
9756 const ArgList &Args,
9757 const char *LinkingOutput) const {
9758 const auto &TC =
9759 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
9760 const llvm::Triple &T = TC.getTriple();
9761 ArgStringList CmdArgs;
9762 bool UseStartfiles = !Args.hasArg(options::OPT_nostartfiles);
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009763 bool UseDefaultLibs = !Args.hasArg(options::OPT_nostdlib) &&
9764 !Args.hasArg(options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009765
9766 std::string StartFilesDir, BuiltinLibDir;
9767 TC.getCompilerSupportDir(StartFilesDir);
9768 TC.getBuiltinLibDir(BuiltinLibDir);
9769
9770 if (T.getArch() == llvm::Triple::sparc)
9771 CmdArgs.push_back("-EB");
9772 else // SHAVE assumes little-endian, and sparcel is expressly so.
9773 CmdArgs.push_back("-EL");
9774
9775 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
9776 // but we never pass through a --sysroot option and various other bits.
9777 // For example, there are no sanitizers (yet) nor gold linker.
9778
9779 // Eat some arguments that may be present but have no effect.
9780 Args.ClaimAllArgs(options::OPT_g_Group);
9781 Args.ClaimAllArgs(options::OPT_w);
9782 Args.ClaimAllArgs(options::OPT_static_libgcc);
9783
9784 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
9785 CmdArgs.push_back("-s");
9786
9787 CmdArgs.push_back("-o");
9788 CmdArgs.push_back(Output.getFilename());
9789
9790 if (UseStartfiles) {
9791 // If you want startfiles, it means you want the builtin crti and crtbegin,
9792 // but not crt0. Myriad link commands provide their own crt0.o as needed.
9793 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crti.o"));
9794 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtbegin.o"));
9795 }
9796
9797 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
9798 options::OPT_e, options::OPT_s, options::OPT_t,
9799 options::OPT_Z_Flag, options::OPT_r});
9800
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009801 if (UseDefaultLibs) {
9802 // The linker doesn't use these builtin paths unless directed to,
9803 // because it was not compiled for support with sysroots, nor does
9804 // it have a default of little-endian with FPU.
9805 CmdArgs.push_back(Args.MakeArgString("-L" + BuiltinLibDir));
9806 CmdArgs.push_back(Args.MakeArgString("-L" + StartFilesDir));
9807 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009808
9809 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9810
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009811 if (UseDefaultLibs) {
9812 if (T.getOS() == llvm::Triple::RTEMS) {
9813 CmdArgs.push_back("--start-group");
9814 CmdArgs.push_back("-lc");
9815 // You must provide your own "-L" option to enable finding these.
9816 CmdArgs.push_back("-lrtemscpu");
9817 CmdArgs.push_back("-lrtemsbsp");
9818 CmdArgs.push_back("--end-group");
9819 } else {
9820 CmdArgs.push_back("-lc");
9821 }
9822 if (C.getDriver().CCCIsCXX())
9823 CmdArgs.push_back("-lstdc++");
9824 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009825 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009826 if (UseStartfiles) {
9827 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtend.o"));
9828 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtn.o"));
9829 }
9830
9831 std::string Exec =
9832 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
9833 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9834 CmdArgs, Inputs));
9835}