blob: 56c1b4f1ee242cd8604ade0af4f705dd1297de6b [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Daniel Dunbar64198ef2009-09-10 01:21:05 +000055/// CheckPreprocessingOptions - Perform some validation of preprocessing
56/// arguments that is shared with gcc.
57static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000058 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
59 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
60 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000061 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000062 << A->getBaseArg().getAsString(Args)
63 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
64 }
65 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000066}
67
Daniel Dunbar4eadb602009-09-10 01:21:12 +000068/// CheckCodeGenerationOptions - Perform some validation of code generation
69/// arguments that is shared with gcc.
70static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
71 // In gcc, only ARM checks this, but it seems reasonable to check universally.
72 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +000073 if (const Arg *A =
74 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
75 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
76 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +000077}
78
Bob Wilsond5aad2a2014-11-04 22:28:48 +000079// Add backslashes to escape spaces and other backslashes.
80// This is used for the space-separated argument list specified with
81// the -dwarf-debug-flags option.
82static void EscapeSpacesAndBackslashes(const char *Arg,
83 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000084 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +000085 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000086 default:
87 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +000088 case ' ':
89 case '\\':
90 Res.push_back('\\');
91 break;
92 }
93 Res.push_back(*Arg);
94 }
95}
96
Chris Lattnerbf2803f2010-03-29 17:55:58 +000097// Quote target names for inclusion in GNU Make dependency files.
98// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +000099static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000100 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
101 switch (Target[i]) {
102 case ' ':
103 case '\t':
104 // Escape the preceding backslashes
105 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
106 Res.push_back('\\');
107
108 // Escape the space/tab
109 Res.push_back('\\');
110 break;
111 case '$':
112 Res.push_back('$');
113 break;
114 case '#':
115 Res.push_back('\\');
116 break;
117 default:
118 break;
119 }
120
121 Res.push_back(Target[i]);
122 }
123}
124
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000125static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
126 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000127 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000128 bool CombinedArg = false;
129
Bill Wendling281ca292012-03-12 21:22:35 +0000130 if (!DirList)
131 return; // Nothing to do.
132
Chad Rosier616e8a52012-10-30 21:42:09 +0000133 StringRef Name(ArgName);
134 if (Name.equals("-I") || Name.equals("-L"))
135 CombinedArg = true;
136
Bill Wendling281ca292012-03-12 21:22:35 +0000137 StringRef Dirs(DirList);
138 if (Dirs.empty()) // Empty string should not add '.'.
139 return;
140
141 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000142 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000143 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000144 if (CombinedArg) {
145 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
146 } else {
147 CmdArgs.push_back(ArgName);
148 CmdArgs.push_back(".");
149 }
Bill Wendling281ca292012-03-12 21:22:35 +0000150 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000151 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000152 CmdArgs.push_back(
153 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000154 } else {
155 CmdArgs.push_back(ArgName);
156 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
157 }
Bill Wendling281ca292012-03-12 21:22:35 +0000158 }
Nico Weber89355782012-03-19 15:00:03 +0000159 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000160 }
161
162 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000163 if (CombinedArg) {
164 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
165 } else {
166 CmdArgs.push_back(ArgName);
167 CmdArgs.push_back(".");
168 }
Bill Wendling281ca292012-03-12 21:22:35 +0000169 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000170 if (CombinedArg) {
171 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
172 } else {
173 CmdArgs.push_back(ArgName);
174 CmdArgs.push_back(Args.MakeArgString(Dirs));
175 }
Bill Wendling281ca292012-03-12 21:22:35 +0000176 }
177}
178
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000179static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
180 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000181 const Driver &D = TC.getDriver();
182
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000183 // Add extra linker input arguments which are not treated as inputs
184 // (constructed via -Xarch_).
185 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
186
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000187 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000188 if (!TC.HasNativeLLVMSupport()) {
189 // Don't try to pass LLVM inputs unless we have native support.
190 if (II.getType() == types::TY_LLVM_IR ||
191 II.getType() == types::TY_LTO_IR ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000192 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
193 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000194 }
195
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000196 // Add filenames immediately.
197 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000198 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000199 continue;
200 }
201
202 // Otherwise, this is a linker input argument.
203 const Arg &A = II.getInputArg();
204
205 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000206 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000207 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000208 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000209 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000210 else if (A.getOption().matches(options::OPT_z)) {
211 // Pass -z prefix for gcc linker compatibility.
212 A.claim();
213 A.render(Args, CmdArgs);
214 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000215 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000216 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000217 }
Bill Wendling281ca292012-03-12 21:22:35 +0000218
219 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000220 // and only supported on native toolchains.
221 if (!TC.isCrossCompiling())
222 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000223}
224
John McCall31168b02011-06-15 23:02:42 +0000225/// \brief Determine whether Objective-C automated reference counting is
226/// enabled.
227static bool isObjCAutoRefCount(const ArgList &Args) {
228 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
229}
230
Ted Kremeneke65b0862012-03-06 20:05:56 +0000231/// \brief Determine whether we are linking the ObjC runtime.
232static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000233 if (isObjCAutoRefCount(Args)) {
234 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000235 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000236 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000237 return Args.hasArg(options::OPT_fobjc_link_runtime);
238}
239
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000240static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000241 // Don't forward inputs from the original command line. They are added from
242 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000243 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000244 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000245}
246
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000247void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
248 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000249 ArgStringList &CmdArgs,
250 const InputInfo &Output,
251 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000252 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000253
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000254 CheckPreprocessingOptions(D, Args);
255
256 Args.AddLastArg(CmdArgs, options::OPT_C);
257 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000258
259 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000260 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000261 (A = Args.getLastArg(options::OPT_MD)) ||
262 (A = Args.getLastArg(options::OPT_MMD))) {
263 // Determine the output location.
264 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000265 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000266 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000267 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000268 } else if (Output.getType() == types::TY_Dependencies) {
269 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000270 } else if (A->getOption().matches(options::OPT_M) ||
271 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000272 DepFile = "-";
273 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000274 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000275 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000276 }
277 CmdArgs.push_back("-dependency-file");
278 CmdArgs.push_back(DepFile);
279
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000280 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000281 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
282 const char *DepTarget;
283
284 // If user provided -o, that is the dependency target, except
285 // when we are only generating a dependency file.
286 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
287 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000288 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000289 } else {
290 // Otherwise derive from the base input.
291 //
292 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000293 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000294 llvm::sys::path::replace_extension(P, "o");
295 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000296 }
297
298 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000299 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000300 QuoteTarget(DepTarget, Quoted);
301 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000302 }
303
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000304 if (A->getOption().matches(options::OPT_M) ||
305 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000307 if ((isa<PrecompileJobAction>(JA) &&
308 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
309 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000310 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000311 }
312
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000313 if (Args.hasArg(options::OPT_MG)) {
314 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000315 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000316 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000317 CmdArgs.push_back("-MG");
318 }
319
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000320 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000321 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000322
323 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000324 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000325 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000326
Daniel Dunbara442fd52010-06-11 22:00:13 +0000327 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000328 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000329 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000330 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000331 CmdArgs.push_back(Args.MakeArgString(Quoted));
332
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000333 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000334 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000335 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000336 }
337 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000338
Douglas Gregor111af7d2009-04-18 00:34:01 +0000339 // Add -i* options, and automatically translate to
340 // -include-pch/-include-pth for transparent PCH support. It's
341 // wonky, but we include looking for .gch so we can support seamless
342 // replacement into a build system already set up to be generating
343 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000344 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000345 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000346 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000347 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
348 RenderedImplicitInclude = true;
349
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000350 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000351 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000352
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000353 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000354 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000355 SmallString<128> P(A->getValue());
356 // We want the files to have a name like foo.h.pch. Add a dummy extension
357 // so that replace_extension does the right thing.
358 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000359 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000360 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000361 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000362 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000363 }
364
Douglas Gregor111af7d2009-04-18 00:34:01 +0000365 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000366 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000367 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000368 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000369 }
370
Douglas Gregor111af7d2009-04-18 00:34:01 +0000371 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000372 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000373 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000374 FoundPCH = UsePCH;
375 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000376 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000377 }
378
379 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000380 if (IsFirstImplicitInclude) {
381 A->claim();
382 if (UsePCH)
383 CmdArgs.push_back("-include-pch");
384 else
385 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000386 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000387 continue;
388 } else {
389 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000390 D.Diag(diag::warn_drv_pch_not_first_include) << P
391 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000392 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000393 }
394 }
395
396 // Not translated, render as usual.
397 A->claim();
398 A->render(Args, CmdArgs);
399 }
400
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000401 Args.AddAllArgs(CmdArgs,
402 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
403 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000404
405 // Add -Wp, and -Xassembler if using the preprocessor.
406
407 // FIXME: There is a very unfortunate problem here, some troubled
408 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
409 // really support that we would have to parse and then translate
410 // those options. :(
411 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
412 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000413
414 // -I- is a deprecated GCC feature, reject it.
415 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000416 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000417
418 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
419 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000420 StringRef sysroot = C.getSysRoot();
421 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000422 if (!Args.hasArg(options::OPT_isysroot)) {
423 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000424 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000425 }
426 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000427
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000428 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000429 // FIXME: We should probably sink the logic for handling these from the
430 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000431 // CPATH - included following the user specified includes (but prior to
432 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000433 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000434 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000435 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000436 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000437 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000438 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000439 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000440 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000441 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000442
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000443 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000444 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000445 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000446
447 // Add system include arguments.
448 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000449}
450
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000451// FIXME: Move to target hook.
452static bool isSignedCharDefault(const llvm::Triple &Triple) {
453 switch (Triple.getArch()) {
454 default:
455 return true;
456
Tim Northover9bb857a2013-01-31 12:13:10 +0000457 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000458 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000459 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000460 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000461 case llvm::Triple::thumb:
462 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000463 if (Triple.isOSDarwin() || Triple.isOSWindows())
464 return true;
465 return false;
466
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000467 case llvm::Triple::ppc:
468 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000469 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000470 return true;
471 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000472
David Majnemerdcecd932015-05-23 19:23:55 +0000473 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000474 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000475 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000476 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000477 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000478 }
479}
480
Robert Lytton0e076492013-08-13 09:43:10 +0000481static bool isNoCommonDefault(const llvm::Triple &Triple) {
482 switch (Triple.getArch()) {
483 default:
484 return false;
485
486 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000487 case llvm::Triple::wasm32:
488 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000489 return true;
490 }
491}
492
Renato Goline17c5802015-07-27 23:44:42 +0000493// ARM tools start.
494
495// Get SubArch (vN).
496static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
497 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000498 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000499}
500
501// True if M-profile.
502static bool isARMMProfile(const llvm::Triple &Triple) {
503 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000504 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000505 return Profile == llvm::ARM::PK_M;
506}
507
508// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000509static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
510 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000511 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
512 CPU = A->getValue();
513 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
514 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000515 if (!FromAs)
516 return;
517
518 for (const Arg *A :
519 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
520 StringRef Value = A->getValue();
521 if (Value.startswith("-mcpu="))
522 CPU = Value.substr(6);
523 if (Value.startswith("-march="))
524 Arch = Value.substr(7);
525 }
Renato Goline17c5802015-07-27 23:44:42 +0000526}
527
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000528// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000529// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000530static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000531 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000532 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000533 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
534 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000535 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
536}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000537
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000538// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000539static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000540 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000541 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000542 unsigned FPUID = llvm::ARM::parseFPU(FPU);
543 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000544 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
545}
546
Renato Golin7c542b42015-07-27 23:44:45 +0000547// Check if -march is valid by checking if it can be canonicalised and parsed.
548// getARMArch is used here instead of just checking the -march value in order
549// to handle -march=native correctly.
550static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000551 llvm::StringRef ArchName,
552 const llvm::Triple &Triple) {
553 std::string MArch = arm::getARMArch(ArchName, Triple);
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000554 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID)
Renato Goline17c5802015-07-27 23:44:42 +0000555 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000556}
557
Renato Golin7c542b42015-07-27 23:44:45 +0000558// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
559static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
560 llvm::StringRef CPUName, llvm::StringRef ArchName,
Renato Goline17c5802015-07-27 23:44:42 +0000561 const llvm::Triple &Triple) {
562 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
563 std::string Arch = arm::getARMArch(ArchName, Triple);
Chandler Carruthd96f37a2015-08-30 07:51:18 +0000564 if (arm::getLLVMArchSuffixForARM(CPU, Arch).empty())
Renato Goline17c5802015-07-27 23:44:42 +0000565 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000566}
567
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000568static bool useAAPCSForMachO(const llvm::Triple &T) {
569 // The backend is hardwired to assume AAPCS for M-class processors, ensure
570 // the frontend matches that.
571 return T.getEnvironment() == llvm::Triple::EABI ||
572 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
573}
574
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000575// Select the float ABI as determined by -msoft-float, -mhard-float, and
576// -mfloat-abi=.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000577arm::FloatABI arm::getARMFloatABI(const Driver &D, const ArgList &Args,
578 const llvm::Triple &Triple) {
579 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
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000666static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
667 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000668 std::vector<const char *> &Features,
669 bool ForAS) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000670 bool KernelOrKext =
671 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000672 arm::FloatABI ABI = arm::getARMFloatABI(D, Args, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000673 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
674 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
675
Nico Weber6e0ebae2015-04-29 21:16:40 +0000676 if (!ForAS) {
677 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
678 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
679 // stripped out by the ARM target. We should probably pass this a new
680 // -target-option, which is handled by the -cc1/-cc1as invocation.
681 //
682 // FIXME2: For consistency, it would be ideal if we set up the target
683 // machine state the same when using the frontend or the assembler. We don't
684 // currently do that for the assembler, we pass the options directly to the
685 // backend and never even instantiate the frontend TargetInfo. If we did,
686 // and used its handleTargetFeatures hook, then we could ensure the
687 // assembler and the frontend behave the same.
688
689 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000690 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000691 Features.push_back("+soft-float");
692
693 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000694 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000695 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000696 } else {
697 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
698 // to the assembler correctly.
699 for (const Arg *A :
700 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
701 StringRef Value = A->getValue();
702 if (Value.startswith("-mfpu=")) {
703 WaFPU = A;
704 } else if (Value.startswith("-mcpu=")) {
705 WaCPU = A;
706 } else if (Value.startswith("-mhwdiv=")) {
707 WaHDiv = A;
708 } else if (Value.startswith("-march=")) {
709 WaArch = A;
710 }
711 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000712 }
713
Renato Golin7c542b42015-07-27 23:44:45 +0000714 // Check -march. ClangAs gives preference to -Wa,-march=.
715 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000716 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000717 if (WaArch) {
718 if (ArchArg)
719 D.Diag(clang::diag::warn_drv_unused_argument)
720 << ArchArg->getAsString(Args);
721 ArchName = StringRef(WaArch->getValue()).substr(7);
722 checkARMArchName(D, WaArch, Args, ArchName, Triple);
723 // FIXME: Set Arch.
724 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
725 } else if (ArchArg) {
726 ArchName = ArchArg->getValue();
727 checkARMArchName(D, ArchArg, Args, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000728 }
729
Renato Golin7c542b42015-07-27 23:44:45 +0000730 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
731 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000732 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000733 if (WaCPU) {
734 if (CPUArg)
735 D.Diag(clang::diag::warn_drv_unused_argument)
736 << CPUArg->getAsString(Args);
737 CPUName = StringRef(WaCPU->getValue()).substr(6);
738 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Triple);
739 } else if (CPUArg) {
740 CPUName = CPUArg->getValue();
741 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000742 }
John Brawna95c1a82015-05-08 12:52:18 +0000743
Renato Golin23459c62015-07-30 16:40:17 +0000744 // Add CPU features for generic CPUs
745 if (CPUName == "native") {
746 llvm::StringMap<bool> HostFeatures;
747 if (llvm::sys::getHostCPUFeatures(HostFeatures))
748 for (auto &F : HostFeatures)
749 Features.push_back(
750 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
751 }
752
753 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
754 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
755 if (WaFPU) {
756 if (FPUArg)
757 D.Diag(clang::diag::warn_drv_unused_argument)
758 << FPUArg->getAsString(Args);
759 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
760 Features);
761 } else if (FPUArg) {
762 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
763 }
764
765 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
766 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
767 if (WaHDiv) {
768 if (HDivArg)
769 D.Diag(clang::diag::warn_drv_unused_argument)
770 << HDivArg->getAsString(Args);
771 getARMHWDivFeatures(D, WaHDiv, Args,
772 StringRef(WaHDiv->getValue()).substr(8), Features);
773 } else if (HDivArg)
774 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
775
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000776 // Setting -msoft-float effectively disables NEON because of the GCC
777 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000778 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000779 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000780 // Also need to explicitly disable features which imply NEON.
781 Features.push_back("-crypto");
782 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000783
Eric Christopher269c2a22015-04-04 03:34:43 +0000784 // En/disable crc code generation.
785 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000786 if (A->getOption().matches(options::OPT_mcrc))
787 Features.push_back("+crc");
788 else
789 Features.push_back("-crc");
790 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000791
792 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
793 Features.insert(Features.begin(), "+v8.1a");
794 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000795
Akira Hatanakac2694822015-07-07 08:28:42 +0000796 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
797 // neither options are specified, see if we are compiling for kernel/kext and
798 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000799 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
800 options::OPT_mno_long_calls)) {
801 if (A->getOption().matches(options::OPT_mlong_calls))
802 Features.push_back("+long-calls");
803 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6))) {
804 Features.push_back("+long-calls");
805 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000806
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000807 // Kernel code has more strict alignment requirements.
808 if (KernelOrKext)
809 Features.push_back("+strict-align");
810 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
811 options::OPT_munaligned_access)) {
812 if (A->getOption().matches(options::OPT_munaligned_access)) {
813 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
814 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
815 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
816 } else
817 Features.push_back("+strict-align");
818 } else {
819 // Assume pre-ARMv6 doesn't support unaligned accesses.
820 //
821 // ARMv6 may or may not support unaligned accesses depending on the
822 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
823 // Darwin and NetBSD targets support unaligned accesses, and others don't.
824 //
825 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
826 // which raises an alignment fault on unaligned accesses. Linux
827 // defaults this bit to 0 and handles it as a system-wide (not
828 // per-process) setting. It is therefore safe to assume that ARMv7+
829 // Linux targets support unaligned accesses. The same goes for NaCl.
830 //
831 // The above behavior is consistent with GCC.
832 int VersionNum = getARMSubArchVersionNumber(Triple);
833 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
834 if (VersionNum < 6)
835 Features.push_back("+strict-align");
836 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
837 if (VersionNum < 7)
838 Features.push_back("+strict-align");
839 } else
840 Features.push_back("+strict-align");
841 }
842
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000843 // llvm does not support reserving registers in general. There is support
844 // for reserving r9 on ARM though (defined as a platform-specific register
845 // in ARM EABI).
846 if (Args.hasArg(options::OPT_ffixed_r9))
847 Features.push_back("+reserve-r9");
848
Akira Hatanaka580efb22015-07-16 00:43:00 +0000849 // The kext linker doesn't know how to deal with movw/movt.
850 if (KernelOrKext)
851 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000852}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000853
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000854void Clang::AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000855 bool KernelOrKext) const {
856 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000857 // Get the effective triple, which takes into account the deployment target.
858 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
859 llvm::Triple Triple(TripleStr);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000860
861 // Select the ABI to use.
862 //
863 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000864 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000865 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000866 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000867 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000868 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000869 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000870 ABIName = "aapcs";
871 } else {
872 ABIName = "apcs-gnu";
873 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000874 } else if (Triple.isOSWindows()) {
875 // FIXME: this is invalid for WindowsCE
876 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000877 } else {
878 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000879 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000880 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000881 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000882 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000883 ABIName = "aapcs-linux";
884 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000885 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000886 case llvm::Triple::EABI:
887 ABIName = "aapcs";
888 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000889 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000890 if (Triple.getOS() == llvm::Triple::NetBSD)
891 ABIName = "apcs-gnu";
892 else
893 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000894 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000895 }
896 }
897 CmdArgs.push_back("-target-abi");
898 CmdArgs.push_back(ABIName);
899
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000900 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000901 arm::FloatABI ABI = arm::getARMFloatABI(D, Args, Triple);
902 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000903 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000904 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000905 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000906 CmdArgs.push_back("-mfloat-abi");
907 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000908 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000909 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000910 CmdArgs.push_back("-mfloat-abi");
911 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000912 } else {
913 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000914 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000915 CmdArgs.push_back("-mfloat-abi");
916 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000917 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000918
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000919 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000920 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
921 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000922 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000923 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000924 CmdArgs.push_back("-arm-global-merge=false");
925 else
926 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000927 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000928
Bob Wilson9c8af452013-04-11 18:53:25 +0000929 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000930 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000931 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000932}
Renato Goline17c5802015-07-27 23:44:42 +0000933// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000934
Tim Northover573cbee2014-05-24 12:52:07 +0000935/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
936/// targeting.
937static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000938 Arg *A;
939 std::string CPU;
940 // If we have -mtune or -mcpu, use that.
941 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +0000942 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +0000943 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000944 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +0000945 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +0000946 }
947
Kevin Qin110db6f2014-07-18 07:03:22 +0000948 // Handle CPU name is 'native'.
949 if (CPU == "native")
950 return llvm::sys::getHostCPUName();
951 else if (CPU.size())
952 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000953
James Molloy9b1586b2014-04-17 12:51:17 +0000954 // Make sure we pick "cyclone" if -arch is used.
955 // FIXME: Should this be picked by checking the target triple instead?
956 if (Args.getLastArg(options::OPT_arch))
957 return "cyclone";
958
959 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000960}
961
Tim Northover573cbee2014-05-24 12:52:07 +0000962void Clang::AddAArch64TargetArgs(const ArgList &Args,
963 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000964 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
965 llvm::Triple Triple(TripleStr);
966
967 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
968 Args.hasArg(options::OPT_mkernel) ||
969 Args.hasArg(options::OPT_fapple_kext))
970 CmdArgs.push_back("-disable-red-zone");
971
972 if (!Args.hasFlag(options::OPT_mimplicit_float,
973 options::OPT_mno_implicit_float, true))
974 CmdArgs.push_back("-no-implicit-float");
975
Craig Topper92fc2df2014-05-17 16:56:41 +0000976 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000977 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
978 ABIName = A->getValue();
979 else if (Triple.isOSDarwin())
980 ABIName = "darwinpcs";
981 else
982 ABIName = "aapcs";
983
984 CmdArgs.push_back("-target-abi");
985 CmdArgs.push_back(ABIName);
986
Bradley Smith9ff64332014-10-13 10:16:06 +0000987 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
988 options::OPT_mno_fix_cortex_a53_835769)) {
989 CmdArgs.push_back("-backend-option");
990 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
991 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
992 else
993 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000994 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
995 // Enabled A53 errata (835769) workaround by default on android
996 CmdArgs.push_back("-backend-option");
997 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000998 }
999
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001000 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001001 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1002 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001003 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001004 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001005 CmdArgs.push_back("-aarch64-global-merge=false");
1006 else
1007 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001008 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001009}
1010
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001011// Get CPU and ABI names. They are not independent
1012// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001013void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1014 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001015 const char *DefMips32CPU = "mips32r2";
1016 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001017
Daniel Sanders2bf13662014-07-10 14:40:57 +00001018 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1019 // default for mips64(el)?-img-linux-gnu.
1020 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1021 Triple.getEnvironment() == llvm::Triple::GNU) {
1022 DefMips32CPU = "mips32r6";
1023 DefMips64CPU = "mips64r6";
1024 }
Renato Golin7c542b42015-07-27 23:44:45 +00001025
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001026 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
1027 if (Triple.getEnvironment() == llvm::Triple::Android)
1028 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001029
Brad Smithba26f582015-01-06 02:53:17 +00001030 // MIPS3 is the default for mips64*-unknown-openbsd.
1031 if (Triple.getOS() == llvm::Triple::OpenBSD)
1032 DefMips64CPU = "mips3";
1033
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001034 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001035 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001036
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001037 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001038 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001039 // Convert a GNU style Mips ABI name to the name
1040 // accepted by LLVM Mips backend.
1041 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001042 .Case("32", "o32")
1043 .Case("64", "n64")
1044 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001045 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001046
1047 // Setup default CPU and ABI names.
1048 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001049 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001050 default:
1051 llvm_unreachable("Unexpected triple arch name");
1052 case llvm::Triple::mips:
1053 case llvm::Triple::mipsel:
1054 CPUName = DefMips32CPU;
1055 break;
1056 case llvm::Triple::mips64:
1057 case llvm::Triple::mips64el:
1058 CPUName = DefMips64CPU;
1059 break;
1060 }
1061 }
1062
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001063 if (ABIName.empty()) {
1064 // Deduce ABI name from the target triple.
1065 if (Triple.getArch() == llvm::Triple::mips ||
1066 Triple.getArch() == llvm::Triple::mipsel)
1067 ABIName = "o32";
1068 else
1069 ABIName = "n64";
1070 }
1071
1072 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001073 // Deduce CPU name from ABI name.
1074 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001075 .Cases("o32", "eabi", DefMips32CPU)
1076 .Cases("n32", "n64", DefMips64CPU)
1077 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001078 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001079
1080 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001081}
1082
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001083// Convert ABI name to the GNU tools acceptable variant.
1084static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1085 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001086 .Case("o32", "32")
1087 .Case("n64", "64")
1088 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001089}
1090
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001091// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1092// and -mfloat-abi=.
1093static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001094 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001095 if (Arg *A =
1096 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1097 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001098 if (A->getOption().matches(options::OPT_msoft_float))
1099 FloatABI = "soft";
1100 else if (A->getOption().matches(options::OPT_mhard_float))
1101 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001102 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001103 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001104 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001105 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001106 FloatABI = "hard";
1107 }
1108 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001109 }
1110
1111 // If unspecified, choose the default based on the platform.
1112 if (FloatABI.empty()) {
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.
1116 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001117 }
1118
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001119 return FloatABI;
1120}
1121
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001122static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001123 std::vector<const char *> &Features,
1124 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001125 StringRef FeatureName) {
1126 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001127 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001128 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001129 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001130 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001131 }
1132}
1133
Daniel Sanders379d44b2014-07-16 11:52:23 +00001134static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1135 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001136 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001137 StringRef CPUName;
1138 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001139 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001140 ABIName = getGnuCompatibleMipsABIName(ABIName);
1141
Daniel Sandersfeb61302014-08-08 15:47:17 +00001142 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1143 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001144
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001145 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001146 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001147 // FIXME: Note, this is a hack. We need to pass the selected float
1148 // mode to the MipsTargetInfoBase to define appropriate macros there.
1149 // Now it is the only method.
1150 Features.push_back("+soft-float");
1151 }
1152
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001153 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001154 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001155 if (Val == "2008") {
1156 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1157 Features.push_back("+nan2008");
1158 else {
1159 Features.push_back("-nan2008");
1160 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1161 }
1162 } else if (Val == "legacy") {
1163 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1164 Features.push_back("-nan2008");
1165 else {
1166 Features.push_back("+nan2008");
1167 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1168 }
1169 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001170 D.Diag(diag::err_drv_unsupported_option_argument)
1171 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001172 }
1173
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001174 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1175 options::OPT_mdouble_float, "single-float");
1176 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1177 "mips16");
1178 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1179 options::OPT_mno_micromips, "micromips");
1180 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1181 "dsp");
1182 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1183 "dspr2");
1184 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1185 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001186
1187 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1188 // pass -mfpxx
1189 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1190 options::OPT_mfp64)) {
1191 if (A->getOption().matches(options::OPT_mfp32))
1192 Features.push_back(Args.MakeArgString("-fp64"));
1193 else if (A->getOption().matches(options::OPT_mfpxx)) {
1194 Features.push_back(Args.MakeArgString("+fpxx"));
1195 Features.push_back(Args.MakeArgString("+nooddspreg"));
1196 } else
1197 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001198 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001199 Features.push_back(Args.MakeArgString("+fpxx"));
1200 Features.push_back(Args.MakeArgString("+nooddspreg"));
1201 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001202
Daniel Sanders28e5d392014-07-10 10:39:51 +00001203 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1204 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001205}
1206
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001207void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001208 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001209 const Driver &D = getToolChain().getDriver();
1210 StringRef CPUName;
1211 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001212 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001213 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001214
1215 CmdArgs.push_back("-target-abi");
1216 CmdArgs.push_back(ABIName.data());
1217
1218 StringRef FloatABI = getMipsFloatABI(D, Args);
1219
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001220 if (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.
Eric Christopher0b26a612010-03-02 02:41:08 +00001227 assert(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.
1672static bool getRefinementStep(const 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
Douglas Katzman2675d012015-06-29 19:12:56 +00001938 for (const StringRef Feature : Split) {
1939 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
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002113static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002114 const ArgList &Args, ArgStringList &CmdArgs,
2115 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002116 std::vector<const char *> Features;
2117 switch (Triple.getArch()) {
2118 default:
2119 break;
2120 case llvm::Triple::mips:
2121 case llvm::Triple::mipsel:
2122 case llvm::Triple::mips64:
2123 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002124 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002125 break;
2126
2127 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002128 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002129 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002130 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002131 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002132 break;
2133
2134 case llvm::Triple::ppc:
2135 case llvm::Triple::ppc64:
2136 case llvm::Triple::ppc64le:
2137 getPPCTargetFeatures(Args, Features);
2138 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002139 case llvm::Triple::systemz:
2140 getSystemZTargetFeatures(Args, Features);
2141 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002142 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002143 case llvm::Triple::aarch64_be:
Akira Hatanaka92500472015-07-27 19:29:04 +00002144 getAArch64TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002145 break;
2146 case llvm::Triple::x86:
2147 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002148 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002149 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002150 case llvm::Triple::wasm32:
2151 case llvm::Triple::wasm64:
2152 getWebAssemblyTargetFeatures(Args, Features);
2153 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002154 }
Rafael Espindola43964802013-08-21 17:34:32 +00002155
2156 // Find the last of each feature.
2157 llvm::StringMap<unsigned> LastOpt;
2158 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2159 const char *Name = Features[I];
2160 assert(Name[0] == '-' || Name[0] == '+');
2161 LastOpt[Name + 1] = I;
2162 }
2163
2164 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2165 // If this feature was overridden, ignore it.
2166 const char *Name = Features[I];
2167 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2168 assert(LastI != LastOpt.end());
2169 unsigned Last = LastI->second;
2170 if (Last != I)
2171 continue;
2172
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002173 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002174 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002175 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002176}
2177
David Majnemerae394812014-12-09 00:12:30 +00002178static bool
2179shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2180 const llvm::Triple &Triple) {
2181 // We use the zero-cost exception tables for Objective-C if the non-fragile
2182 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2183 // later.
2184 if (runtime.isNonFragile())
2185 return true;
2186
2187 if (!Triple.isMacOSX())
2188 return false;
2189
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002190 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002191 (Triple.getArch() == llvm::Triple::x86_64 ||
2192 Triple.getArch() == llvm::Triple::arm));
2193}
2194
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002195/// Adds exception related arguments to the driver command arguments. There's a
2196/// master flag, -fexceptions and also language specific flags to enable/disable
2197/// C++ and Objective-C exceptions. This makes it possible to for example
2198/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002199static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002200 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002201 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002202 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002203 const Driver &D = TC.getDriver();
2204 const llvm::Triple &Triple = TC.getTriple();
2205
Chad Rosier4fab82c2012-03-26 22:04:46 +00002206 if (KernelOrKext) {
2207 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2208 // arguments now to avoid warnings about unused arguments.
2209 Args.ClaimAllArgs(options::OPT_fexceptions);
2210 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2211 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2212 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2213 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2214 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002215 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002216 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002217
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002218 // See if the user explicitly enabled exceptions.
2219 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2220 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002221
David Majnemerae394812014-12-09 00:12:30 +00002222 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2223 // is not necessarily sensible, but follows GCC.
2224 if (types::isObjC(InputType) &&
2225 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002226 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002227 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002228
David Majnemerae394812014-12-09 00:12:30 +00002229 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002230 }
2231
2232 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002233 // Disable C++ EH by default on XCore, PS4, and MSVC.
2234 // FIXME: Remove MSVC from this list once things work.
2235 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2236 !Triple.isPS4CPU() &&
2237 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002238 Arg *ExceptionArg = Args.getLastArg(
2239 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2240 options::OPT_fexceptions, options::OPT_fno_exceptions);
2241 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002242 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002243 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2244 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002245
2246 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002247 if (Triple.isPS4CPU()) {
2248 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2249 assert(ExceptionArg &&
2250 "On the PS4 exceptions should only be enabled if passing "
2251 "an argument");
2252 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2253 const Arg *RTTIArg = TC.getRTTIArg();
2254 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2255 D.Diag(diag::err_drv_argument_not_allowed_with)
2256 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2257 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2258 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2259 } else
2260 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2261
Anders Carlssone96ab552011-02-28 02:27:16 +00002262 CmdArgs.push_back("-fcxx-exceptions");
2263
David Majnemer8de68642014-12-05 08:11:58 +00002264 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002265 }
2266 }
2267
David Majnemer8de68642014-12-05 08:11:58 +00002268 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002269 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002270}
2271
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002272static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002273 bool Default = true;
2274 if (TC.getTriple().isOSDarwin()) {
2275 // The native darwin assembler doesn't support the linker_option directives,
2276 // so we disable them if we think the .s file will be passed to it.
2277 Default = TC.useIntegratedAs();
2278 }
2279 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2280 Default);
2281}
2282
Ted Kremenek62093662013-03-12 17:02:12 +00002283static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2284 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002285 bool UseDwarfDirectory =
2286 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2287 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002288 return !UseDwarfDirectory;
2289}
2290
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002291/// \brief Check whether the given input tree contains any compilation actions.
2292static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002293 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002294 return true;
2295
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002296 for (const auto &Act : *A)
2297 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002298 return true;
2299
2300 return false;
2301}
2302
2303/// \brief Check if -relax-all should be passed to the internal assembler.
2304/// This is done by default when compiling non-assembler source with -O0.
2305static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2306 bool RelaxDefault = true;
2307
2308 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2309 RelaxDefault = A->getOption().matches(options::OPT_O0);
2310
2311 if (RelaxDefault) {
2312 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002313 for (const auto &Act : C.getActions()) {
2314 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002315 RelaxDefault = true;
2316 break;
2317 }
2318 }
2319 }
2320
2321 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002322 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002323}
2324
David Blaikie9260ed62013-07-25 21:19:01 +00002325static void CollectArgsForIntegratedAssembler(Compilation &C,
2326 const ArgList &Args,
2327 ArgStringList &CmdArgs,
2328 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002329 if (UseRelaxAll(C, Args))
2330 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002331
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002332 // When passing -I arguments to the assembler we sometimes need to
2333 // unconditionally take the next argument. For example, when parsing
2334 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2335 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2336 // arg after parsing the '-I' arg.
2337 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002338
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002339 // When using an integrated assembler, translate -Wa, and -Xassembler
2340 // options.
2341 bool CompressDebugSections = false;
2342 for (const Arg *A :
2343 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2344 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002345
Renato Golin7c542b42015-07-27 23:44:45 +00002346 for (const StringRef Value : A->getValues()) {
2347 if (TakeNextArg) {
2348 CmdArgs.push_back(Value.data());
2349 TakeNextArg = false;
2350 continue;
2351 }
David Blaikie9260ed62013-07-25 21:19:01 +00002352
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002353 if (Value == "-force_cpusubtype_ALL") {
2354 // Do nothing, this is the default and we don't support anything else.
2355 } else if (Value == "-L") {
2356 CmdArgs.push_back("-msave-temp-labels");
2357 } else if (Value == "--fatal-warnings") {
2358 CmdArgs.push_back("-massembler-fatal-warnings");
2359 } else if (Value == "--noexecstack") {
2360 CmdArgs.push_back("-mnoexecstack");
2361 } else if (Value == "-compress-debug-sections" ||
2362 Value == "--compress-debug-sections") {
2363 CompressDebugSections = true;
2364 } else if (Value == "-nocompress-debug-sections" ||
2365 Value == "--nocompress-debug-sections") {
2366 CompressDebugSections = false;
2367 } else if (Value.startswith("-I")) {
2368 CmdArgs.push_back(Value.data());
2369 // We need to consume the next argument if the current arg is a plain
2370 // -I. The next arg will be the include directory.
2371 if (Value == "-I")
2372 TakeNextArg = true;
2373 } else if (Value.startswith("-gdwarf-")) {
2374 CmdArgs.push_back(Value.data());
Renato Golin7c542b42015-07-27 23:44:45 +00002375 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2376 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2377 // Do nothing, we'll validate it later.
Daniel Sanders4f7cd232015-09-03 12:58:39 +00002378 } else if (Value == "--trap") {
2379 CmdArgs.push_back("-target-feature");
2380 CmdArgs.push_back("+use-tcc-in-div");
2381 } else if (Value == "--break") {
2382 CmdArgs.push_back("-target-feature");
2383 CmdArgs.push_back("-use-tcc-in-div");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002384 } else {
2385 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002386 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002387 }
2388 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002389 }
2390 if (CompressDebugSections) {
2391 if (llvm::zlib::isAvailable())
2392 CmdArgs.push_back("-compress-debug-sections");
2393 else
2394 D.Diag(diag::warn_debug_compression_unavailable);
2395 }
David Blaikie9260ed62013-07-25 21:19:01 +00002396}
2397
Renato Goline807c122014-01-31 11:47:28 +00002398// Until ARM libraries are build separately, we have them all in one library
2399static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Reid Kleckner0213a472015-07-22 16:01:38 +00002400 if (TC.getTriple().isWindowsMSVCEnvironment() &&
Peter Collingbourne2659fb32015-07-02 02:07:43 +00002401 TC.getArch() == llvm::Triple::x86)
2402 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002403 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002404 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002405 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002406}
2407
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002408static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2409 // The runtimes are located in the OS-specific resource directory.
2410 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002411 const llvm::Triple &Triple = TC.getTriple();
2412 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002413 StringRef OSLibName =
2414 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002415 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002416 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002417}
2418
Peter Collingbourne581f4382015-07-02 01:48:12 +00002419SmallString<128> tools::getCompilerRT(const ToolChain &TC, StringRef Component,
2420 bool Shared) {
Dan Albert6f2875d2015-01-28 23:23:36 +00002421 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2422 ? "-android"
2423 : "";
2424
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002425 bool IsOSWindows = TC.getTriple().isOSWindows();
Reid Kleckner0213a472015-07-22 16:01:38 +00002426 bool IsITANMSVCWindows = TC.getTriple().isWindowsMSVCEnvironment() ||
2427 TC.getTriple().isWindowsItaniumEnvironment();
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002428 StringRef Arch = getArchNameForCompilerRTLib(TC);
Reid Kleckner0213a472015-07-22 16:01:38 +00002429 const char *Prefix = IsITANMSVCWindows ? "" : "lib";
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002430 const char *Suffix =
Reid Kleckner0213a472015-07-22 16:01:38 +00002431 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsITANMSVCWindows ? ".lib" : ".a");
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002432
2433 SmallString<128> Path = getCompilerRTLibDir(TC);
2434 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2435 Arch + Env + Suffix);
2436
2437 return Path;
2438}
2439
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002440// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002441// FIXME: Make sure we can also emit shared objects if they're requested
2442// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002443static void addClangRT(const ToolChain &TC, const ArgList &Args,
2444 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002445 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002446}
2447
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002448static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2449 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002450 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2451 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002452 Args.hasArg(options::OPT_fprofile_generate) ||
Diego Novillo578caf52015-07-09 17:23:53 +00002453 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002454 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002455 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002456 Args.hasArg(options::OPT_fcreate_profile) ||
2457 Args.hasArg(options::OPT_coverage)))
2458 return;
2459
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002460 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002461}
2462
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002463namespace {
2464enum OpenMPRuntimeKind {
2465 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2466 /// without knowing what runtime to target.
2467 OMPRT_Unknown,
2468
2469 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2470 /// the default for Clang.
2471 OMPRT_OMP,
2472
2473 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2474 /// this runtime but can swallow the pragmas, and find and link against the
2475 /// runtime library itself.
2476 OMPRT_GOMP,
2477
Chandler Carruthc6625c62015-05-28 21:10:31 +00002478 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002479 /// OpenMP runtime. We support this mode for users with existing dependencies
2480 /// on this runtime library name.
2481 OMPRT_IOMP5
2482};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002483}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002484
2485/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002486static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2487 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002488 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2489
2490 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2491 if (A)
2492 RuntimeName = A->getValue();
2493
2494 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002495 .Case("libomp", OMPRT_OMP)
2496 .Case("libgomp", OMPRT_GOMP)
2497 .Case("libiomp5", OMPRT_IOMP5)
2498 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002499
2500 if (RT == OMPRT_Unknown) {
2501 if (A)
2502 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002503 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002504 else
2505 // FIXME: We could use a nicer diagnostic here.
2506 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2507 }
2508
2509 return RT;
2510}
2511
Alexey Samsonov52550342014-09-15 19:58:40 +00002512static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2513 ArgStringList &CmdArgs, StringRef Sanitizer,
2514 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002515 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002516 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002517 if (!IsShared)
2518 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002519 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002520 if (!IsShared)
2521 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002522}
2523
Alexey Samsonov52550342014-09-15 19:58:40 +00002524// Tries to use a file with the list of dynamic symbols that need to be exported
2525// from the runtime library. Returns true if the file was found.
2526static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2527 ArgStringList &CmdArgs,
2528 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002529 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2530 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2531 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002532 return true;
2533 }
2534 return false;
2535}
2536
2537static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2538 ArgStringList &CmdArgs) {
2539 // Force linking against the system libraries sanitizers depends on
2540 // (see PR15823 why this is necessary).
2541 CmdArgs.push_back("--no-as-needed");
2542 CmdArgs.push_back("-lpthread");
2543 CmdArgs.push_back("-lrt");
2544 CmdArgs.push_back("-lm");
2545 // There's no libdl on FreeBSD.
2546 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2547 CmdArgs.push_back("-ldl");
2548}
2549
2550static void
2551collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2552 SmallVectorImpl<StringRef> &SharedRuntimes,
2553 SmallVectorImpl<StringRef> &StaticRuntimes,
2554 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2555 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2556 // Collect shared runtimes.
2557 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2558 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002559 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002560
Alexey Samsonov52550342014-09-15 19:58:40 +00002561 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002562 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002563 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2564 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002565 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002566 }
2567 if (SanArgs.needsAsanRt()) {
2568 if (SanArgs.needsSharedAsanRt()) {
2569 HelperStaticRuntimes.push_back("asan-preinit");
2570 } else {
2571 StaticRuntimes.push_back("asan");
2572 if (SanArgs.linkCXXRuntimes())
2573 StaticRuntimes.push_back("asan_cxx");
2574 }
2575 }
2576 if (SanArgs.needsDfsanRt())
2577 StaticRuntimes.push_back("dfsan");
2578 if (SanArgs.needsLsanRt())
2579 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002580 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002581 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002582 if (SanArgs.linkCXXRuntimes())
2583 StaticRuntimes.push_back("msan_cxx");
2584 }
2585 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002586 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002587 if (SanArgs.linkCXXRuntimes())
2588 StaticRuntimes.push_back("tsan_cxx");
2589 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002590 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002591 StaticRuntimes.push_back("ubsan_standalone");
2592 if (SanArgs.linkCXXRuntimes())
2593 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002594 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002595 if (SanArgs.needsSafeStackRt())
2596 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002597}
2598
Alexey Samsonov52550342014-09-15 19:58:40 +00002599// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2600// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2601static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002602 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002603 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2604 HelperStaticRuntimes;
2605 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2606 HelperStaticRuntimes);
2607 for (auto RT : SharedRuntimes)
2608 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2609 for (auto RT : HelperStaticRuntimes)
2610 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2611 bool AddExportDynamic = false;
2612 for (auto RT : StaticRuntimes) {
2613 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2614 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2615 }
2616 // If there is a static runtime with no dynamic list, force all the symbols
2617 // to be dynamic to be sure we export sanitizer interface functions.
2618 if (AddExportDynamic)
2619 CmdArgs.push_back("-export-dynamic");
2620 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002621}
2622
Reid Kleckner86ea7702015-02-04 23:45:07 +00002623static bool areOptimizationsEnabled(const ArgList &Args) {
2624 // Find the last -O arg and see if it is non-zero.
2625 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2626 return !A->getOption().matches(options::OPT_O0);
2627 // Defaults to -O0.
2628 return false;
2629}
2630
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002631static bool shouldUseFramePointerForTarget(const ArgList &Args,
2632 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002633 switch (Triple.getArch()) {
2634 case llvm::Triple::xcore:
2635 case llvm::Triple::wasm32:
2636 case llvm::Triple::wasm64:
2637 // XCore never wants frame pointers, regardless of OS.
2638 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002639 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002640 default:
2641 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002642 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002643
2644 if (Triple.isOSLinux()) {
2645 switch (Triple.getArch()) {
2646 // Don't use a frame pointer on linux if optimizing for certain targets.
2647 case llvm::Triple::mips64:
2648 case llvm::Triple::mips64el:
2649 case llvm::Triple::mips:
2650 case llvm::Triple::mipsel:
2651 case llvm::Triple::systemz:
2652 case llvm::Triple::x86:
2653 case llvm::Triple::x86_64:
2654 return !areOptimizationsEnabled(Args);
2655 default:
2656 return true;
2657 }
2658 }
2659
2660 if (Triple.isOSWindows()) {
2661 switch (Triple.getArch()) {
2662 case llvm::Triple::x86:
2663 return !areOptimizationsEnabled(Args);
2664 default:
2665 // All other supported Windows ISAs use xdata unwind information, so frame
2666 // pointers are not generally useful.
2667 return false;
2668 }
2669 }
2670
2671 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002672}
2673
Rafael Espindola224dd632011-12-14 21:02:23 +00002674static bool shouldUseFramePointer(const ArgList &Args,
2675 const llvm::Triple &Triple) {
2676 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2677 options::OPT_fomit_frame_pointer))
2678 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2679
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002680 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002681}
2682
Eric Christopherb7d97e92013-04-03 01:58:53 +00002683static bool shouldUseLeafFramePointer(const ArgList &Args,
2684 const llvm::Triple &Triple) {
2685 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2686 options::OPT_momit_leaf_frame_pointer))
2687 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2688
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002689 if (Triple.isPS4CPU())
2690 return false;
2691
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002692 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002693}
2694
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002695/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002696static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002697 SmallString<128> cwd;
2698 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002699 CmdArgs.push_back("-fdebug-compilation-dir");
2700 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002701 }
2702}
2703
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002704static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002705 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2706 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2707 SmallString<128> T(FinalOutput->getValue());
2708 llvm::sys::path::replace_extension(T, "dwo");
2709 return Args.MakeArgString(T);
2710 } else {
2711 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002712 SmallString<128> T(
2713 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002714 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002715 llvm::sys::path::replace_extension(F, "dwo");
2716 T += F;
2717 return Args.MakeArgString(F);
2718 }
2719}
2720
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002721static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2722 const JobAction &JA, const ArgList &Args,
2723 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002724 ArgStringList ExtractArgs;
2725 ExtractArgs.push_back("--extract-dwo");
2726
2727 ArgStringList StripArgs;
2728 StripArgs.push_back("--strip-dwo");
2729
2730 // Grabbing the output of the earlier compile step.
2731 StripArgs.push_back(Output.getFilename());
2732 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002733 ExtractArgs.push_back(OutFile);
2734
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002735 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002736 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002737
2738 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002739 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002740
2741 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002742 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002743}
2744
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002745/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002746/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2747static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002748 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002749 if (A->getOption().matches(options::OPT_O4) ||
2750 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002751 return true;
2752
2753 if (A->getOption().matches(options::OPT_O0))
2754 return false;
2755
2756 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2757
Rafael Espindola91780de2013-08-26 14:05:41 +00002758 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002759 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002760 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002761 return true;
2762
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002763 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002764 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002765 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002766
2767 unsigned OptLevel = 0;
2768 if (S.getAsInteger(10, OptLevel))
2769 return false;
2770
2771 return OptLevel > 1;
2772 }
2773
2774 return false;
2775}
2776
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002777/// Add -x lang to \p CmdArgs for \p Input.
2778static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2779 ArgStringList &CmdArgs) {
2780 // When using -verify-pch, we don't want to provide the type
2781 // 'precompiled-header' if it was inferred from the file extension
2782 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2783 return;
2784
2785 CmdArgs.push_back("-x");
2786 if (Args.hasArg(options::OPT_rewrite_objc))
2787 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2788 else
2789 CmdArgs.push_back(types::getTypeName(Input.getType()));
2790}
2791
David Majnemerc371ff02015-03-22 08:39:22 +00002792static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002793 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002794 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002795
2796 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002797 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002798
2799 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002800 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002801 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002802 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002803}
2804
Rafael Espindola577637a2015-01-03 00:06:04 +00002805// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002806// options that build systems might add but are unused when assembling or only
2807// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002808static void claimNoWarnArgs(const ArgList &Args) {
2809 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002810 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002811 Args.ClaimAllArgs(options::OPT_flto);
2812 Args.ClaimAllArgs(options::OPT_fno_lto);
2813}
2814
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002815static void appendUserToPath(SmallVectorImpl<char> &Result) {
2816#ifdef LLVM_ON_UNIX
2817 const char *Username = getenv("LOGNAME");
2818#else
2819 const char *Username = getenv("USERNAME");
2820#endif
2821 if (Username) {
2822 // Validate that LoginName can be used in a path, and get its length.
2823 size_t Len = 0;
2824 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002825 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002826 Username = nullptr;
2827 break;
2828 }
2829 }
2830
2831 if (Username && Len > 0) {
2832 Result.append(Username, Username + Len);
2833 return;
2834 }
2835 }
2836
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002837// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002838#ifdef LLVM_ON_UNIX
2839 std::string UID = llvm::utostr(getuid());
2840#else
2841 // FIXME: Windows seems to have an 'SID' that might work.
2842 std::string UID = "9999";
2843#endif
2844 Result.append(UID.begin(), UID.end());
2845}
2846
David Majnemere11d3732015-06-08 00:22:46 +00002847VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2848 const llvm::Triple &Triple,
2849 const llvm::opt::ArgList &Args,
2850 bool IsWindowsMSVC) {
2851 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2852 IsWindowsMSVC) ||
2853 Args.hasArg(options::OPT_fmsc_version) ||
2854 Args.hasArg(options::OPT_fms_compatibility_version)) {
2855 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2856 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002857 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002858
2859 if (MSCVersion && MSCompatibilityVersion) {
2860 if (D)
2861 D->Diag(diag::err_drv_argument_not_allowed_with)
2862 << MSCVersion->getAsString(Args)
2863 << MSCompatibilityVersion->getAsString(Args);
2864 return VersionTuple();
2865 }
2866
2867 if (MSCompatibilityVersion) {
2868 VersionTuple MSVT;
2869 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2870 D->Diag(diag::err_drv_invalid_value)
2871 << MSCompatibilityVersion->getAsString(Args)
2872 << MSCompatibilityVersion->getValue();
2873 return MSVT;
2874 }
2875
2876 if (MSCVersion) {
2877 unsigned Version = 0;
2878 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2879 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2880 << MSCVersion->getValue();
2881 return getMSCompatibilityVersion(Version);
2882 }
2883
2884 unsigned Major, Minor, Micro;
2885 Triple.getEnvironmentVersion(Major, Minor, Micro);
2886 if (Major || Minor || Micro)
2887 return VersionTuple(Major, Minor, Micro);
2888
2889 return VersionTuple(18);
2890 }
2891 return VersionTuple();
2892}
2893
Diego Novilloa0545962015-07-10 18:00:07 +00002894static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2895 const InputInfo &Output, const ArgList &Args,
2896 ArgStringList &CmdArgs) {
2897 auto *ProfileGenerateArg = Args.getLastArg(
2898 options::OPT_fprofile_instr_generate,
2899 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00002900 options::OPT_fprofile_generate_EQ,
2901 options::OPT_fno_profile_instr_generate);
2902 if (ProfileGenerateArg &&
2903 ProfileGenerateArg->getOption().matches(
2904 options::OPT_fno_profile_instr_generate))
2905 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002906
2907 auto *ProfileUseArg = Args.getLastArg(
2908 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00002909 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2910 options::OPT_fno_profile_instr_use);
2911 if (ProfileUseArg &&
2912 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2913 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002914
2915 if (ProfileGenerateArg && ProfileUseArg)
2916 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00002917 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00002918
Diego Novillo758f3f52015-08-05 21:49:51 +00002919 if (ProfileGenerateArg) {
2920 if (ProfileGenerateArg->getOption().matches(
2921 options::OPT_fprofile_instr_generate_EQ))
2922 ProfileGenerateArg->render(Args, CmdArgs);
2923 else if (ProfileGenerateArg->getOption().matches(
2924 options::OPT_fprofile_generate_EQ)) {
2925 SmallString<128> Path(ProfileGenerateArg->getValue());
2926 llvm::sys::path::append(Path, "default.profraw");
2927 CmdArgs.push_back(
2928 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
2929 } else
2930 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2931 }
Diego Novilloa0545962015-07-10 18:00:07 +00002932
Diego Novillo758f3f52015-08-05 21:49:51 +00002933 if (ProfileUseArg) {
2934 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
2935 ProfileUseArg->render(Args, CmdArgs);
2936 else if ((ProfileUseArg->getOption().matches(
2937 options::OPT_fprofile_use_EQ) ||
2938 ProfileUseArg->getOption().matches(
2939 options::OPT_fprofile_instr_use))) {
2940 SmallString<128> Path(
2941 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
2942 if (Path.empty() || llvm::sys::fs::is_directory(Path))
2943 llvm::sys::path::append(Path, "default.profdata");
2944 CmdArgs.push_back(
2945 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
2946 }
Diego Novilloa0545962015-07-10 18:00:07 +00002947 }
2948
2949 if (Args.hasArg(options::OPT_ftest_coverage) ||
2950 Args.hasArg(options::OPT_coverage))
2951 CmdArgs.push_back("-femit-coverage-notes");
2952 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2953 false) ||
2954 Args.hasArg(options::OPT_coverage))
2955 CmdArgs.push_back("-femit-coverage-data");
2956
Diego Novilloc4b94da2015-08-05 23:27:40 +00002957 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2958 options::OPT_fno_coverage_mapping, false) &&
2959 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00002960 D.Diag(diag::err_drv_argument_only_allowed_with)
2961 << "-fcoverage-mapping"
2962 << "-fprofile-instr-generate";
2963
Diego Novilloc4b94da2015-08-05 23:27:40 +00002964 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2965 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00002966 CmdArgs.push_back("-fcoverage-mapping");
2967
2968 if (C.getArgs().hasArg(options::OPT_c) ||
2969 C.getArgs().hasArg(options::OPT_S)) {
2970 if (Output.isFilename()) {
2971 CmdArgs.push_back("-coverage-file");
2972 SmallString<128> CoverageFilename;
2973 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
2974 CoverageFilename = FinalOutput->getValue();
2975 } else {
2976 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
2977 }
2978 if (llvm::sys::path::is_relative(CoverageFilename)) {
2979 SmallString<128> Pwd;
2980 if (!llvm::sys::fs::current_path(Pwd)) {
2981 llvm::sys::path::append(Pwd, CoverageFilename);
2982 CoverageFilename.swap(Pwd);
2983 }
2984 }
2985 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
2986 }
2987 }
2988}
2989
James Y Knight5bdf7ab2015-08-19 15:12:02 +00002990/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
2991/// smooshes them together with platform defaults, to decide whether
2992/// this compile should be using PIC mode or not. Returns a tuple of
2993/// (RelocationModel, PICLevel, IsPIE).
2994static std::tuple<llvm::Reloc::Model, unsigned, bool>
2995ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
2996 const ArgList &Args) {
2997 // FIXME: why does this code...and so much everywhere else, use both
2998 // ToolChain.getTriple() and Triple?
2999 bool PIE = ToolChain.isPIEDefault();
3000 bool PIC = PIE || ToolChain.isPICDefault();
3001 bool IsPICLevelTwo = PIC;
3002
3003 bool KernelOrKext =
3004 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3005
3006 // Android-specific defaults for PIC/PIE
3007 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
3008 switch (ToolChain.getArch()) {
3009 case llvm::Triple::arm:
3010 case llvm::Triple::armeb:
3011 case llvm::Triple::thumb:
3012 case llvm::Triple::thumbeb:
3013 case llvm::Triple::aarch64:
3014 case llvm::Triple::mips:
3015 case llvm::Triple::mipsel:
3016 case llvm::Triple::mips64:
3017 case llvm::Triple::mips64el:
3018 PIC = true; // "-fpic"
3019 break;
3020
3021 case llvm::Triple::x86:
3022 case llvm::Triple::x86_64:
3023 PIC = true; // "-fPIC"
3024 IsPICLevelTwo = true;
3025 break;
3026
3027 default:
3028 break;
3029 }
3030 }
3031
3032 // OpenBSD-specific defaults for PIE
3033 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3034 switch (ToolChain.getArch()) {
3035 case llvm::Triple::mips64:
3036 case llvm::Triple::mips64el:
3037 case llvm::Triple::sparcel:
3038 case llvm::Triple::x86:
3039 case llvm::Triple::x86_64:
3040 IsPICLevelTwo = false; // "-fpie"
3041 break;
3042
3043 case llvm::Triple::ppc:
3044 case llvm::Triple::sparc:
3045 case llvm::Triple::sparcv9:
3046 IsPICLevelTwo = true; // "-fPIE"
3047 break;
3048
3049 default:
3050 break;
3051 }
3052 }
3053
3054 // The last argument relating to either PIC or PIE wins, and no
3055 // other argument is used. If the last argument is any flavor of the
3056 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3057 // option implicitly enables PIC at the same level.
3058 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3059 options::OPT_fpic, options::OPT_fno_pic,
3060 options::OPT_fPIE, options::OPT_fno_PIE,
3061 options::OPT_fpie, options::OPT_fno_pie);
3062 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3063 // is forced, then neither PIC nor PIE flags will have no effect.
3064 if (!ToolChain.isPICDefaultForced()) {
3065 if (LastPICArg) {
3066 Option O = LastPICArg->getOption();
3067 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3068 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3069 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3070 PIC =
3071 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3072 IsPICLevelTwo =
3073 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3074 } else {
3075 PIE = PIC = false;
3076 }
3077 }
3078 }
3079
3080 // Introduce a Darwin-specific hack. If the default is PIC, but the
3081 // PIC level would've been set to level 1, force it back to level 2
3082 // PIC instead. This matches the behavior of Darwin GCC (based on
3083 // chandlerc's informal testing in 2012).
3084 if (PIC && ToolChain.getTriple().isOSDarwin())
3085 IsPICLevelTwo |= ToolChain.isPICDefault();
3086
James Y Knightc4015d32015-08-21 04:14:55 +00003087 // This kernel flags are a trump-card: they will disable PIC/PIE
3088 // generation, independent of the argument order.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003089 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
3090 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003091
3092 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3093 // This is a very special mode. It trumps the other modes, almost no one
3094 // uses it, and it isn't even valid on any OS but Darwin.
3095 if (!ToolChain.getTriple().isOSDarwin())
3096 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3097 << A->getSpelling() << ToolChain.getTriple().str();
3098
3099 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3100
3101 // Only a forced PIC mode can cause the actual compile to have PIC defines
3102 // etc., no flags are sufficient. This behavior was selected to closely
3103 // match that of llvm-gcc and Apple GCC before that.
3104 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3105
3106 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3107 }
3108
3109 if (PIC)
3110 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3111
3112 return std::make_tuple(llvm::Reloc::Static, 0, false);
3113}
3114
3115static const char *RelocationModelName(llvm::Reloc::Model Model) {
3116 switch (Model) {
3117 case llvm::Reloc::Default:
3118 return nullptr;
3119 case llvm::Reloc::Static:
3120 return "static";
3121 case llvm::Reloc::PIC_:
3122 return "pic";
3123 case llvm::Reloc::DynamicNoPIC:
3124 return "dynamic-no-pic";
3125 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003126 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003127}
3128
3129static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3130 ArgStringList &CmdArgs) {
3131 llvm::Reloc::Model RelocationModel;
3132 unsigned PICLevel;
3133 bool IsPIE;
3134 std::tie(RelocationModel, PICLevel, IsPIE) =
3135 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3136
3137 if (RelocationModel != llvm::Reloc::Static)
3138 CmdArgs.push_back("-KPIC");
3139}
3140
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003141void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003142 const InputInfo &Output, const InputInfoList &Inputs,
3143 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003144 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3145 const llvm::Triple Triple(TripleStr);
3146
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003147 bool KernelOrKext =
3148 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003149 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003150 ArgStringList CmdArgs;
3151
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003152 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003153 bool IsWindowsCygnus =
3154 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003155 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
3156
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003157 // Check number of inputs for sanity. We need at least one input.
3158 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003159 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003160 // CUDA compilation may have multiple inputs (source file + results of
3161 // device-side compilations). All other jobs are expected to have exactly one
3162 // input.
3163 bool IsCuda = types::isCuda(Input.getType());
3164 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003165
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003166 // Invoke ourselves in -cc1 mode.
3167 //
3168 // FIXME: Implement custom jobs for internal actions.
3169 CmdArgs.push_back("-cc1");
3170
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003171 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003172 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003173 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003174
James Y Knight2db38f32015-08-15 03:45:25 +00003175 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3176 Triple.getArch() == llvm::Triple::thumb)) {
3177 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003178 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003179 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003180 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003181 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003182 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003183 }
3184
Tim Northover336f1892014-03-29 13:16:12 +00003185 // Push all default warning arguments that are specific to
3186 // the given target. These come before user provided warning options
3187 // are provided.
3188 getToolChain().addClangWarningOptions(CmdArgs);
3189
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003190 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003191 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003192
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003193 if (isa<AnalyzeJobAction>(JA)) {
3194 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3195 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003196 } else if (isa<MigrateJobAction>(JA)) {
3197 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003198 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003199 if (Output.getType() == types::TY_Dependencies)
3200 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003201 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003202 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003203 if (Args.hasArg(options::OPT_rewrite_objc) &&
3204 !Args.hasArg(options::OPT_g_Group))
3205 CmdArgs.push_back("-P");
3206 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003207 } else if (isa<AssembleJobAction>(JA)) {
3208 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003209
David Blaikie9260ed62013-07-25 21:19:01 +00003210 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003211
3212 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003213 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003214 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003215 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003216 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003217
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003218 if (JA.getType() == types::TY_Nothing)
3219 CmdArgs.push_back("-fsyntax-only");
3220 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003221 CmdArgs.push_back("-emit-pch");
3222 else
3223 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003224 } else if (isa<VerifyPCHJobAction>(JA)) {
3225 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003226 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003227 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3228 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003229
Renato Golin7c542b42015-07-27 23:44:45 +00003230 if (JA.getType() == types::TY_LTO_IR || JA.getType() == types::TY_LTO_BC) {
Teresa Johnson8749d8042015-07-06 16:23:00 +00003231 CmdArgs.push_back("-flto");
3232 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003233 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003234 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003235 } else if (JA.getType() == types::TY_LLVM_IR ||
3236 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003237 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003238 } else if (JA.getType() == types::TY_LLVM_BC ||
3239 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003240 CmdArgs.push_back("-emit-llvm-bc");
3241 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003242 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003243 } else if (JA.getType() == types::TY_AST) {
3244 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003245 } else if (JA.getType() == types::TY_ModuleFile) {
3246 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003247 } else if (JA.getType() == types::TY_RewrittenObjC) {
3248 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003249 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003250 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3251 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003252 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003253 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003254 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003255 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003256
3257 // Preserve use-list order by default when emitting bitcode, so that
3258 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3259 // same result as running passes here. For LTO, we don't need to preserve
3260 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003261 if (JA.getType() == types::TY_LLVM_BC)
3262 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003263 }
3264
Justin Bognera88f0122014-06-20 22:59:50 +00003265 // We normally speed up the clang process a bit by skipping destructors at
3266 // exit, but when we're generating diagnostics we can rely on some of the
3267 // cleanup.
3268 if (!C.isForDiagnostics())
3269 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003270
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003271// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003272#ifdef NDEBUG
3273 CmdArgs.push_back("-disable-llvm-verifier");
3274#endif
3275
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003276 // Set the main file name, so that debug info works even with
3277 // -save-temps.
3278 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003279 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003280
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003281 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003282 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003283 if (Args.hasArg(options::OPT_static))
3284 CmdArgs.push_back("-static-define");
3285
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003286 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003287 // Enable region store model by default.
3288 CmdArgs.push_back("-analyzer-store=region");
3289
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003290 // Treat blocks as analysis entry points.
3291 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3292
Ted Kremenek49c79792011-03-24 00:28:47 +00003293 CmdArgs.push_back("-analyzer-eagerly-assume");
3294
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003295 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003296 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003297 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003298
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003299 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003300 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003301
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003302 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003303 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003304
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003305 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003306
Artem Belevichba558952015-05-06 18:20:23 +00003307 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003308 CmdArgs.push_back("-analyzer-checker=cplusplus");
3309
Nico Webere8e53112014-05-11 01:04:02 +00003310 // Enable the following experimental checkers for testing.
3311 CmdArgs.push_back(
3312 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003313 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3314 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003315 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003316 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3317 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003318
3319 // Default nullability checks.
3320 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3321 CmdArgs.push_back(
3322 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003323 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003324
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003325 // Set the output format. The default is plist, for (lame) historical
3326 // reasons.
3327 CmdArgs.push_back("-analyzer-output");
3328 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003329 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003330 else
3331 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003332
Ted Kremenekfe449a22010-03-22 22:32:05 +00003333 // Disable the presentation of standard compiler warnings when
3334 // using --analyze. We only want to show static analyzer diagnostics
3335 // or frontend errors.
3336 CmdArgs.push_back("-w");
3337
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003338 // Add -Xanalyzer arguments when running as analyzer.
3339 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003340 }
3341
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003342 CheckCodeGenerationOptions(D, Args);
3343
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003344 llvm::Reloc::Model RelocationModel;
3345 unsigned PICLevel;
3346 bool IsPIE;
3347 std::tie(RelocationModel, PICLevel, IsPIE) =
3348 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003349
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003350 const char *RMName = RelocationModelName(RelocationModel);
3351 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003352 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003353 CmdArgs.push_back(RMName);
3354 }
3355 if (PICLevel > 0) {
3356 CmdArgs.push_back("-pic-level");
3357 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3358 if (IsPIE) {
3359 CmdArgs.push_back("-pie-level");
3360 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003361 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003362 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003363
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003364 CmdArgs.push_back("-mthread-model");
3365 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3366 CmdArgs.push_back(A->getValue());
3367 else
3368 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3369
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003370 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3371
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003372 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3373 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003374 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003375
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003376 // LLVM Code Generator Options.
3377
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003378 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3379 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003380 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3381 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003382 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003383 CmdArgs.push_back(A->getValue());
3384 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003385 }
3386 }
3387
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003388 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3389 StringRef v = A->getValue();
3390 CmdArgs.push_back("-mllvm");
3391 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3392 A->claim();
3393 }
3394
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003395 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3396 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003397 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003398 }
3399
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003400 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3401 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003402 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003403 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003404 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003405 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3406 CmdArgs.push_back("-fpcc-struct-return");
3407 } else {
3408 assert(A->getOption().matches(options::OPT_freg_struct_return));
3409 CmdArgs.push_back("-freg-struct-return");
3410 }
3411 }
3412
Roman Divacky65b88cd2011-03-01 17:40:53 +00003413 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3414 CmdArgs.push_back("-mrtd");
3415
Rafael Espindola224dd632011-12-14 21:02:23 +00003416 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003417 CmdArgs.push_back("-mdisable-fp-elim");
3418 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3419 options::OPT_fno_zero_initialized_in_bss))
3420 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003421
3422 bool OFastEnabled = isOptimizationLevelFast(Args);
3423 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3424 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003425 OptSpecifier StrictAliasingAliasOption =
3426 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003427 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3428 // doesn't do any TBAA.
3429 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003430 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003431 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003432 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003433 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3434 options::OPT_fno_struct_path_tbaa))
3435 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003436 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3437 false))
3438 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003439 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3440 options::OPT_fno_strict_vtable_pointers,
3441 false))
3442 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003443 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3444 options::OPT_fno_optimize_sibling_calls))
3445 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003446
Eric Christopher006208c2013-04-04 06:29:47 +00003447 // Handle segmented stacks.
3448 if (Args.hasArg(options::OPT_fsplit_stack))
3449 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003450
3451 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3452 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003453 OptSpecifier FastMathAliasOption =
3454 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3455
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003456 // Handle various floating point optimization flags, mapping them to the
3457 // appropriate LLVM code generation flags. The pattern for all of these is to
3458 // default off the codegen optimizations, and if any flag enables them and no
3459 // flag disables them after the flag enabling them, enable the codegen
3460 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003461 if (Arg *A = Args.getLastArg(
3462 options::OPT_ffast_math, FastMathAliasOption,
3463 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3464 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3465 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003466 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3467 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003468 A->getOption().getID() != options::OPT_fhonor_infinities)
3469 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003470 if (Arg *A = Args.getLastArg(
3471 options::OPT_ffast_math, FastMathAliasOption,
3472 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3473 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3474 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003475 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3476 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003477 A->getOption().getID() != options::OPT_fhonor_nans)
3478 CmdArgs.push_back("-menable-no-nans");
3479
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003480 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3481 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003482 if (Arg *A =
3483 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3484 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3485 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003486 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3487 // However, turning *off* -ffast_math merely restores the toolchain default
3488 // (which may be false).
3489 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3490 A->getOption().getID() == options::OPT_ffast_math ||
3491 A->getOption().getID() == options::OPT_Ofast)
3492 MathErrno = false;
3493 else if (A->getOption().getID() == options::OPT_fmath_errno)
3494 MathErrno = true;
3495 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003496 if (MathErrno)
3497 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003498
3499 // There are several flags which require disabling very specific
3500 // optimizations. Any of these being disabled forces us to turn off the
3501 // entire set of LLVM optimizations, so collect them through all the flag
3502 // madness.
3503 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003504 if (Arg *A = Args.getLastArg(
3505 options::OPT_ffast_math, FastMathAliasOption,
3506 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3507 options::OPT_fno_unsafe_math_optimizations,
3508 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003509 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3510 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003511 A->getOption().getID() != options::OPT_fno_associative_math)
3512 AssociativeMath = true;
3513 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003514 if (Arg *A = Args.getLastArg(
3515 options::OPT_ffast_math, FastMathAliasOption,
3516 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3517 options::OPT_fno_unsafe_math_optimizations,
3518 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003519 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3520 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003521 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3522 ReciprocalMath = true;
3523 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003524 if (Arg *A = Args.getLastArg(
3525 options::OPT_ffast_math, FastMathAliasOption,
3526 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3527 options::OPT_fno_unsafe_math_optimizations,
3528 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003529 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3530 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003531 A->getOption().getID() != options::OPT_fsigned_zeros)
3532 SignedZeros = false;
3533 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003534 if (Arg *A = Args.getLastArg(
3535 options::OPT_ffast_math, FastMathAliasOption,
3536 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3537 options::OPT_fno_unsafe_math_optimizations,
3538 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003539 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3540 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003541 A->getOption().getID() != options::OPT_ftrapping_math)
3542 TrappingMath = false;
3543 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3544 !TrappingMath)
3545 CmdArgs.push_back("-menable-unsafe-fp-math");
3546
Sanjay Patel76c9e092015-01-23 16:40:50 +00003547 if (!SignedZeros)
3548 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003549
Sanjay Patel359b1052015-04-09 15:03:23 +00003550 if (ReciprocalMath)
3551 CmdArgs.push_back("-freciprocal-math");
3552
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003553 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003554 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003555 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003556 options::OPT_ffp_contract)) {
3557 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003558 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003559 if (Val == "fast" || Val == "on" || Val == "off") {
3560 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3561 } else {
3562 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003563 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003564 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003565 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3566 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003567 // If fast-math is set then set the fp-contract mode to fast.
3568 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3569 }
3570 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003571
Sanjay Patel2987c292015-06-11 14:53:41 +00003572 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003573
Bob Wilson6a039162012-07-19 03:52:53 +00003574 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3575 // and if we find them, tell the frontend to provide the appropriate
3576 // preprocessor macros. This is distinct from enabling any optimizations as
3577 // these options induce language changes which must survive serialization
3578 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003579 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3580 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003581 if (!A->getOption().matches(options::OPT_fno_fast_math))
3582 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003583 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3584 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003585 if (A->getOption().matches(options::OPT_ffinite_math_only))
3586 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003587
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003588 // Decide whether to use verbose asm. Verbose assembly is the default on
3589 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003590 bool IsIntegratedAssemblerDefault =
3591 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003592 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003593 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003594 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003595 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003596
Rafael Espindolab8a12932015-05-22 20:44:03 +00003597 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3598 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003599 CmdArgs.push_back("-no-integrated-as");
3600
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003601 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3602 CmdArgs.push_back("-mdebug-pass");
3603 CmdArgs.push_back("Structure");
3604 }
3605 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3606 CmdArgs.push_back("-mdebug-pass");
3607 CmdArgs.push_back("Arguments");
3608 }
3609
John McCall8517abc2010-02-19 02:45:38 +00003610 // Enable -mconstructor-aliases except on darwin, where we have to
3611 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003612 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003613 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003614
John McCall7ef5cb32011-03-18 02:56:14 +00003615 // Darwin's kernel doesn't support guard variables; just die if we
3616 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003617 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003618 CmdArgs.push_back("-fforbid-guard-variables");
3619
Douglas Gregordbe39272011-02-01 15:15:22 +00003620 if (Args.hasArg(options::OPT_mms_bitfields)) {
3621 CmdArgs.push_back("-mms-bitfields");
3622 }
John McCall8517abc2010-02-19 02:45:38 +00003623
Daniel Dunbar306945d2009-09-16 06:17:29 +00003624 // This is a coarse approximation of what llvm-gcc actually does, both
3625 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3626 // complicated ways.
3627 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003628 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3629 options::OPT_fno_asynchronous_unwind_tables,
3630 (getToolChain().IsUnwindTablesDefault() ||
3631 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3632 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003633 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3634 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003635 CmdArgs.push_back("-munwind-tables");
3636
Chandler Carruth05fb5852012-11-21 23:40:23 +00003637 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003638
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003639 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3640 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003641 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003642 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003643
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003644 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003645 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003646
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003647 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003648 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003649 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003650 }
3651
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003652 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003653 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003654 if (!CPU.empty()) {
3655 CmdArgs.push_back("-target-cpu");
3656 CmdArgs.push_back(Args.MakeArgString(CPU));
3657 }
3658
Rafael Espindolaeb265472013-08-21 21:59:03 +00003659 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3660 CmdArgs.push_back("-mfpmath");
3661 CmdArgs.push_back(A->getValue());
3662 }
3663
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003664 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003665 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003666
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003667 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003668 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003669 default:
3670 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003671
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003672 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003673 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003674 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003675 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003676 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003677 break;
3678
Tim Northover573cbee2014-05-24 12:52:07 +00003679 case llvm::Triple::aarch64:
3680 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003681 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003682 break;
3683
Eric Christopher0b26a612010-03-02 02:41:08 +00003684 case llvm::Triple::mips:
3685 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003686 case llvm::Triple::mips64:
3687 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003688 AddMIPSTargetArgs(Args, CmdArgs);
3689 break;
3690
Ulrich Weigand8afad612014-07-28 13:17:52 +00003691 case llvm::Triple::ppc:
3692 case llvm::Triple::ppc64:
3693 case llvm::Triple::ppc64le:
3694 AddPPCTargetArgs(Args, CmdArgs);
3695 break;
3696
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003697 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003698 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003699 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003700 AddSparcTargetArgs(Args, CmdArgs);
3701 break;
3702
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003703 case llvm::Triple::x86:
3704 case llvm::Triple::x86_64:
3705 AddX86TargetArgs(Args, CmdArgs);
3706 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003707
3708 case llvm::Triple::hexagon:
3709 AddHexagonTargetArgs(Args, CmdArgs);
3710 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003711 }
3712
Hans Wennborg75958c42013-08-08 00:17:41 +00003713 // Add clang-cl arguments.
3714 if (getToolChain().getDriver().IsCLMode())
3715 AddClangCLArgs(Args, CmdArgs);
3716
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003717 // Pass the linker version in use.
3718 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3719 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003720 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003721 }
3722
Eric Christopherb7d97e92013-04-03 01:58:53 +00003723 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003724 CmdArgs.push_back("-momit-leaf-frame-pointer");
3725
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003726 // Explicitly error on some things we know we don't support and can't just
3727 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003728 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003729 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3730 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003731 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003732 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003733 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3734 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003735 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003736 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003737 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003738 }
3739
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003740 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003741 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003742 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003743 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003744 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3745 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003746 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003747 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003748 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003749
Chad Rosierbe10f982011-08-02 17:58:04 +00003750 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003751 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003752 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3753 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003754 }
3755
Manman Ren17bdb0f2013-11-20 20:22:14 +00003756 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3757 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003758 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003759 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003760 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikiece3e7a62015-07-30 21:42:22 +00003761 if ((A->getOption().matches(options::OPT_gline_tables_only) ||
3762 A->getOption().matches(options::OPT_g1)) &&
3763 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003764 // FIXME: we should support specifying dwarf version with
3765 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003766 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003767 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003768 const llvm::Triple &Triple = getToolChain().getTriple();
3769 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003770 Triple.getOS() == llvm::Triple::FreeBSD ||
3771 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003772 CmdArgs.push_back("-gdwarf-2");
David Blaikiece3e7a62015-07-30 21:42:22 +00003773 SplitDwarfArg = nullptr;
Douglas Katzman553927a2015-09-14 20:31:28 +00003774 } else if (A->getOption().matches(options::OPT_gdwarf_2) ||
3775 A->getOption().matches(options::OPT_gdwarf_3) ||
3776 A->getOption().matches(options::OPT_gdwarf_4)) {
3777 A->render(Args, CmdArgs);
3778 } else if (!A->getOption().matches(options::OPT_g0) &&
3779 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003780 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003781 const llvm::Triple &Triple = getToolChain().getTriple();
3782 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003783 Triple.getOS() == llvm::Triple::FreeBSD ||
3784 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003785 CmdArgs.push_back("-gdwarf-2");
3786 else
3787 CmdArgs.push_back("-g");
3788 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003789 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003790
Reid Kleckner124955a2015-08-05 18:51:13 +00003791 // Forward -gcodeview.
3792 Args.AddLastArg(CmdArgs, options::OPT_gcodeview);
3793
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003794 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3795 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003796 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3797 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003798 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003799
Eric Christopher138c32b2013-09-13 22:37:55 +00003800 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003801 if (Args.hasArg(options::OPT_gmodules)) {
3802 CmdArgs.push_back("-g");
3803 CmdArgs.push_back("-dwarf-ext-refs");
3804 CmdArgs.push_back("-fmodule-format=obj");
3805 }
3806
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003807 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3808 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003809 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003810 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003811 CmdArgs.push_back("-g");
3812 CmdArgs.push_back("-backend-option");
3813 CmdArgs.push_back("-split-dwarf=Enable");
3814 }
3815
Eric Christopher138c32b2013-09-13 22:37:55 +00003816 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3817 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3818 CmdArgs.push_back("-backend-option");
3819 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3820 }
Eric Christophereec89c22013-06-18 00:03:50 +00003821
Eric Christopher0d403d22014-02-14 01:27:03 +00003822 // -gdwarf-aranges turns on the emission of the aranges section in the
3823 // backend.
3824 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3825 CmdArgs.push_back("-backend-option");
3826 CmdArgs.push_back("-generate-arange-section");
3827 }
3828
David Blaikief36d9ba2014-01-27 18:52:43 +00003829 if (Args.hasFlag(options::OPT_fdebug_types_section,
3830 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003831 CmdArgs.push_back("-backend-option");
3832 CmdArgs.push_back("-generate-type-units");
3833 }
Eric Christophereec89c22013-06-18 00:03:50 +00003834
Ed Schouten6e576152015-03-26 17:50:28 +00003835 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3836 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3837
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003838 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003839 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003840 CmdArgs.push_back("-ffunction-sections");
3841 }
3842
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003843 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3844 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003845 CmdArgs.push_back("-fdata-sections");
3846 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003847
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003848 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003849 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003850 CmdArgs.push_back("-fno-unique-section-names");
3851
Chris Lattner3c77a352010-06-22 00:03:40 +00003852 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3853
Diego Novilloa0545962015-07-10 18:00:07 +00003854 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003855
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003856 // Pass options for controlling the default header search paths.
3857 if (Args.hasArg(options::OPT_nostdinc)) {
3858 CmdArgs.push_back("-nostdsysteminc");
3859 CmdArgs.push_back("-nobuiltininc");
3860 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003861 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003862 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003863 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3864 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3865 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003866
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003867 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003868 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003869 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003870
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003871 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3872
Ted Kremenekf7639e12012-03-06 20:06:33 +00003873 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003874 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003875 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003876 options::OPT_ccc_arcmt_modify,
3877 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003878 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003879 switch (A->getOption().getID()) {
3880 default:
3881 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003882 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003883 CmdArgs.push_back("-arcmt-check");
3884 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003885 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003886 CmdArgs.push_back("-arcmt-modify");
3887 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003888 case options::OPT_ccc_arcmt_migrate:
3889 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003890 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003891 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003892
3893 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3894 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003895 break;
John McCalld70fb982011-06-15 23:25:17 +00003896 }
3897 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003898 } else {
3899 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3900 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3901 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003902 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003903
Ted Kremenekf7639e12012-03-06 20:06:33 +00003904 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3905 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003906 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3907 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003908 }
3909 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003910 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003911
3912 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003913 options::OPT_objcmt_migrate_subscripting,
3914 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003915 // None specified, means enable them all.
3916 CmdArgs.push_back("-objcmt-migrate-literals");
3917 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003918 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003919 } else {
3920 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3921 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003922 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003923 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003924 } else {
3925 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3926 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3927 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3928 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3929 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3930 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003931 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003932 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3933 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3934 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3935 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3936 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3937 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3938 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003939 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003940 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003941 }
3942
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003943 // Add preprocessing options like -I, -D, etc. if we are using the
3944 // preprocessor.
3945 //
3946 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003947 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003948 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003949
Rafael Espindolaa7431922011-07-21 23:40:37 +00003950 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3951 // that "The compiler can only warn and ignore the option if not recognized".
3952 // When building with ccache, it will pass -D options to clang even on
3953 // preprocessed inputs and configure concludes that -fPIC is not supported.
3954 Args.ClaimAllArgs(options::OPT_D);
3955
Alp Toker7874bdc2013-11-15 20:40:58 +00003956 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003957 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3958 if (A->getOption().matches(options::OPT_O4)) {
3959 CmdArgs.push_back("-O3");
3960 D.Diag(diag::warn_O4_is_O3);
3961 } else {
3962 A->render(Args, CmdArgs);
3963 }
3964 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003965
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003966 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003967 for (const Arg *A :
3968 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3969 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00003970 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003971 }
3972
Rafael Espindola577637a2015-01-03 00:06:04 +00003973 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003974
Richard Smith3be1cb22014-08-07 00:24:21 +00003975 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003976 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003977 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3978 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003979 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003980 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003981
3982 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003983 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003984 //
3985 // If a std is supplied, only add -trigraphs if it follows the
3986 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003987 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003988 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3989 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003990 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003991 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003992 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003993 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003994 else
3995 Std->render(Args, CmdArgs);
3996
Nico Weber00721502014-12-23 22:32:37 +00003997 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003998 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003999 options::OPT_ftrigraphs,
4000 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004001 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004002 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004003 } else {
4004 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004005 //
4006 // FIXME: Clang doesn't correctly handle -std= when the input language
4007 // doesn't match. For the time being just ignore this for C++ inputs;
4008 // eventually we want to do all the standard defaulting here instead of
4009 // splitting it between the driver and clang -cc1.
4010 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004011 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4012 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004013 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004014 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004015
Nico Weber00721502014-12-23 22:32:37 +00004016 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4017 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004018 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004019
Richard Smith282b4492013-09-04 22:50:31 +00004020 // GCC's behavior for -Wwrite-strings is a bit strange:
4021 // * In C, this "warning flag" changes the types of string literals from
4022 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4023 // for the discarded qualifier.
4024 // * In C++, this is just a normal warning flag.
4025 //
4026 // Implementing this warning correctly in C is hard, so we follow GCC's
4027 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4028 // a non-const char* in C, rather than using this crude hack.
4029 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004030 // FIXME: This should behave just like a warning flag, and thus should also
4031 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4032 Arg *WriteStrings =
4033 Args.getLastArg(options::OPT_Wwrite_strings,
4034 options::OPT_Wno_write_strings, options::OPT_w);
4035 if (WriteStrings &&
4036 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004037 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004038 }
4039
Chandler Carruth61fbf622011-04-23 09:27:53 +00004040 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004041 // during C++ compilation, which it is by default. GCC keeps this define even
4042 // in the presence of '-w', match this behavior bug-for-bug.
4043 if (types::isCXX(InputType) &&
4044 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4045 true)) {
4046 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004047 }
4048
Chandler Carruthe0391482010-05-22 02:21:53 +00004049 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4050 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4051 if (Asm->getOption().matches(options::OPT_fasm))
4052 CmdArgs.push_back("-fgnu-keywords");
4053 else
4054 CmdArgs.push_back("-fno-gnu-keywords");
4055 }
4056
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004057 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4058 CmdArgs.push_back("-fno-dwarf-directory-asm");
4059
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004060 if (ShouldDisableAutolink(Args, getToolChain()))
4061 CmdArgs.push_back("-fno-autolink");
4062
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004063 // Add in -fdebug-compilation-dir if necessary.
4064 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004065
Richard Smith9a568822011-11-21 19:36:32 +00004066 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4067 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004068 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004069 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004070 }
4071
Richard Smith79c927b2013-11-06 19:31:51 +00004072 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4073 CmdArgs.push_back("-foperator-arrow-depth");
4074 CmdArgs.push_back(A->getValue());
4075 }
4076
Richard Smith9a568822011-11-21 19:36:32 +00004077 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4078 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004079 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004080 }
4081
Richard Smitha3d3bd22013-05-08 02:12:03 +00004082 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4083 CmdArgs.push_back("-fconstexpr-steps");
4084 CmdArgs.push_back(A->getValue());
4085 }
4086
Richard Smithb3a14522013-02-22 01:59:51 +00004087 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4088 CmdArgs.push_back("-fbracket-depth");
4089 CmdArgs.push_back(A->getValue());
4090 }
4091
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004092 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4093 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004094 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004095 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004096 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4097 } else
4098 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004099 }
4100
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004101 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004102 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004103
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004104 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4105 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004106 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004107 }
David Chisnall5778fce2009-08-31 16:41:57 +00004108
Chris Lattnere23003d2010-01-09 21:54:33 +00004109 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4110 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004111 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004112 }
4113
Chris Lattnerb35583d2010-04-07 20:49:23 +00004114 CmdArgs.push_back("-ferror-limit");
4115 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004116 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004117 else
4118 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004119
Chandler Carrutha77a7272010-05-06 04:55:18 +00004120 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4121 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004122 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004123 }
4124
4125 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4126 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004127 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004128 }
4129
Richard Smithf6f003a2011-12-16 19:06:07 +00004130 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4131 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004132 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004133 }
4134
Nick Lewycky24653262014-12-16 21:39:02 +00004135 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4136 CmdArgs.push_back("-fspell-checking-limit");
4137 CmdArgs.push_back(A->getValue());
4138 }
4139
Daniel Dunbar2c978472009-11-04 06:24:47 +00004140 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004141 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004142 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004143 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004144 } else {
4145 // If -fmessage-length=N was not specified, determine whether this is a
4146 // terminal and, if so, implicitly define -fmessage-length appropriately.
4147 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004148 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004149 }
4150
John McCallb4a99d32013-02-19 01:57:35 +00004151 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4152 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4153 options::OPT_fvisibility_ms_compat)) {
4154 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4155 CmdArgs.push_back("-fvisibility");
4156 CmdArgs.push_back(A->getValue());
4157 } else {
4158 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4159 CmdArgs.push_back("-fvisibility");
4160 CmdArgs.push_back("hidden");
4161 CmdArgs.push_back("-ftype-visibility");
4162 CmdArgs.push_back("default");
4163 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004164 }
4165
Douglas Gregor08329632010-06-15 17:05:35 +00004166 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004167
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004168 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4169
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004170 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004171 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4172 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004173 CmdArgs.push_back("-ffreestanding");
4174
Daniel Dunbare357d562009-12-03 18:42:11 +00004175 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004176 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004177 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00004178 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
4179 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00004180 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004181 // Emulated TLS is enabled by default on Android, and can be enabled manually
4182 // with -femulated-tls.
4183 bool EmulatedTLSDefault = Triple.getEnvironment() == llvm::Triple::Android;
4184 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4185 EmulatedTLSDefault))
4186 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004187 // AltiVec-like language extensions aren't relevant for assembling.
4188 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004189 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004190 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4191 }
Richard Trieu91844232012-06-26 18:18:47 +00004192 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4193 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004194
Alexey Bataevdb390212015-05-20 04:24:19 +00004195 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004196 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4197 options::OPT_fno_openmp, false))
4198 switch (getOpenMPRuntime(getToolChain(), Args)) {
4199 case OMPRT_OMP:
4200 case OMPRT_IOMP5:
4201 // Clang can generate useful OpenMP code for these two runtime libraries.
4202 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004203
4204 // If no option regarding the use of TLS in OpenMP codegeneration is
4205 // given, decide a default based on the target. Otherwise rely on the
4206 // options and pass the right information to the frontend.
4207 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004208 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004209 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004210 break;
4211 default:
4212 // By default, if Clang doesn't know how to generate useful OpenMP code
4213 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4214 // down to the actual compilation.
4215 // FIXME: It would be better to have a mode which *only* omits IR
4216 // generation based on the OpenMP support so that we get consistent
4217 // semantic analysis, etc.
4218 break;
4219 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004220
Peter Collingbourne32701642013-11-01 18:16:25 +00004221 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004222 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004223
Eric Christopher459d2712013-02-19 06:16:53 +00004224 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004225 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4226 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4227 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4228 Arch == llvm::Triple::ppc64le))
4229 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4230 << "ppc/ppc64/ppc64le";
4231 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004232
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004233 // -fzvector is incompatible with -faltivec.
4234 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4235 if (Args.hasArg(options::OPT_faltivec))
4236 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4237 << "-faltivec";
4238
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004239 if (getToolChain().SupportsProfiling())
4240 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004241
4242 // -flax-vector-conversions is default.
4243 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4244 options::OPT_fno_lax_vector_conversions))
4245 CmdArgs.push_back("-fno-lax-vector-conversions");
4246
John Brawna7b4ec02015-08-10 11:11:28 +00004247 if (Args.getLastArg(options::OPT_fapple_kext) ||
4248 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004249 CmdArgs.push_back("-fapple-kext");
4250
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004251 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004252 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004253 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004254 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4255 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004256
4257 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4258 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004259 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004260 }
4261
Bob Wilson14adb362012-02-03 06:27:22 +00004262 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004263
Chandler Carruth6e501032011-03-27 00:04:55 +00004264 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4265 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004266 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004267 if (A->getOption().matches(options::OPT_fwrapv))
4268 CmdArgs.push_back("-fwrapv");
4269 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4270 options::OPT_fno_strict_overflow)) {
4271 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4272 CmdArgs.push_back("-fwrapv");
4273 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004274
4275 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4276 options::OPT_fno_reroll_loops))
4277 if (A->getOption().matches(options::OPT_freroll_loops))
4278 CmdArgs.push_back("-freroll-loops");
4279
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004280 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004281 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4282 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004283
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004284 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4285
Daniel Dunbar4930e332009-11-17 08:07:36 +00004286 // -stack-protector=0 is default.
4287 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004288 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4289 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4290 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4291 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4292 Args.ClaimAllArgs(options::OPT_fstack_protector);
4293 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004294 options::OPT_fstack_protector_all,
4295 options::OPT_fstack_protector_strong,
4296 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004297 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004298 StackProtectorLevel = std::max<unsigned>(
4299 LangOptions::SSPOn,
4300 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004301 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004302 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004303 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004304 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004305 } else {
4306 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004307 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004308 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004309 if (StackProtectorLevel) {
4310 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004311 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004312 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004313
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004314 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004315 for (const Arg *A : Args.filtered(options::OPT__param)) {
4316 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004317 if (Str.startswith("ssp-buffer-size=")) {
4318 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004319 CmdArgs.push_back("-stack-protector-buffer-size");
4320 // FIXME: Verify the argument is a valid integer.
4321 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004322 }
Sean Silva14facf32015-06-09 01:57:17 +00004323 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004324 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004325 }
4326
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004327 // Translate -mstackrealign
4328 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004329 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004330 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004331
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004332 if (Args.hasArg(options::OPT_mstack_alignment)) {
4333 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4334 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004335 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004336
Hans Wennborg77dc2362015-01-20 19:45:50 +00004337 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4338 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4339
4340 if (!Size.empty())
4341 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4342 else
4343 CmdArgs.push_back("-mstack-probe-size=0");
4344 }
4345
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004346 switch (getToolChain().getArch()) {
4347 case llvm::Triple::aarch64:
4348 case llvm::Triple::aarch64_be:
4349 case llvm::Triple::arm:
4350 case llvm::Triple::armeb:
4351 case llvm::Triple::thumb:
4352 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004353 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004354 break;
4355
4356 default:
4357 break;
4358 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004359
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004360 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4361 options::OPT_mno_restrict_it)) {
4362 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4363 CmdArgs.push_back("-backend-option");
4364 CmdArgs.push_back("-arm-restrict-it");
4365 } else {
4366 CmdArgs.push_back("-backend-option");
4367 CmdArgs.push_back("-arm-no-restrict-it");
4368 }
James Y Knight2db38f32015-08-15 03:45:25 +00004369 } else if (Triple.isOSWindows() &&
4370 (Triple.getArch() == llvm::Triple::arm ||
4371 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004372 // Windows on ARM expects restricted IT blocks
4373 CmdArgs.push_back("-backend-option");
4374 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004375 }
4376
Daniel Dunbard18049a2009-04-07 21:16:11 +00004377 // Forward -f options with positive and negative forms; we translate
4378 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004379 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4380 StringRef fname = A->getValue();
4381 if (!llvm::sys::fs::exists(fname))
4382 D.Diag(diag::err_drv_no_such_file) << fname;
4383 else
4384 A->render(Args, CmdArgs);
4385 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004386
John Brawna7b4ec02015-08-10 11:11:28 +00004387 // -fbuiltin is default unless -mkernel is used
4388 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4389 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004390 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004391
Nuno Lopes13c88c72009-12-16 16:59:22 +00004392 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4393 options::OPT_fno_assume_sane_operator_new))
4394 CmdArgs.push_back("-fno-assume-sane-operator-new");
4395
Daniel Dunbar4930e332009-11-17 08:07:36 +00004396 // -fblocks=0 is default.
4397 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004398 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004399 (Args.hasArg(options::OPT_fgnu_runtime) &&
4400 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4401 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004402 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004403
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004404 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004405 !getToolChain().hasBlocksRuntime())
4406 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004407 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004408
Richard Smith47972af2015-06-16 00:08:24 +00004409 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004410 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004411 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004412 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004413 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004414 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4415 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004416 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004417 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004418 HaveModules = true;
4419 }
4420 }
4421
Richard Smith47972af2015-06-16 00:08:24 +00004422 // -fmodule-maps enables implicit reading of module map files. By default,
4423 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004424 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4425 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004426 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004427 }
4428
Daniel Jasperac42b752013-10-21 06:34:34 +00004429 // -fmodules-decluse checks that modules used are declared so (off by
4430 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004431 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004432 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004433 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004434 }
4435
Daniel Jasper962b38e2014-04-11 11:47:45 +00004436 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4437 // all #included headers are part of modules.
4438 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004439 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004440 CmdArgs.push_back("-fmodules-strict-decluse");
4441 }
4442
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004443 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4444 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4445 options::OPT_fno_implicit_modules)) {
4446 CmdArgs.push_back("-fno-implicit-modules");
4447 }
4448
Daniel Jasperac42b752013-10-21 06:34:34 +00004449 // -fmodule-name specifies the module that is currently being built (or
4450 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004451 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004452
Richard Smith9887d792014-10-17 01:42:53 +00004453 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004454 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004455 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004456
Richard Smithe842a472014-10-22 02:05:46 +00004457 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004458 if (HaveModules)
4459 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4460 else
4461 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004462
4463 // -fmodule-cache-path specifies where our implicitly-built module files
4464 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004465 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004466 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004467 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004468 if (HaveModules) {
4469 if (C.isForDiagnostics()) {
4470 // When generating crash reports, we want to emit the modules along with
4471 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004472 Path = Output.getFilename();
4473 llvm::sys::path::replace_extension(Path, ".cache");
4474 llvm::sys::path::append(Path, "modules");
4475 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004476 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004477 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004478 llvm::sys::path::append(Path, "org.llvm.clang.");
4479 appendUserToPath(Path);
4480 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004481 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004482 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004483 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4484 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004485 }
4486
4487 // When building modules and generating crashdumps, we need to dump a module
4488 // dependency VFS alongside the output.
4489 if (HaveModules && C.isForDiagnostics()) {
4490 SmallString<128> VFSDir(Output.getFilename());
4491 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004492 // Add the cache directory as a temp so the crash diagnostics pick it up.
4493 C.addTempFile(Args.MakeArgString(VFSDir));
4494
Justin Bognera88f0122014-06-20 22:59:50 +00004495 llvm::sys::path::append(VFSDir, "vfs");
4496 CmdArgs.push_back("-module-dependency-dir");
4497 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004498 }
4499
Richard Smith9887d792014-10-17 01:42:53 +00004500 if (HaveModules)
4501 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004502
Douglas Gregor35b04d62013-02-07 19:01:24 +00004503 // Pass through all -fmodules-ignore-macro arguments.
4504 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004505 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4506 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004507
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004508 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4509
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004510 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4511 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4512 D.Diag(diag::err_drv_argument_not_allowed_with)
4513 << A->getAsString(Args) << "-fbuild-session-timestamp";
4514
4515 llvm::sys::fs::file_status Status;
4516 if (llvm::sys::fs::status(A->getValue(), Status))
4517 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004518 CmdArgs.push_back(Args.MakeArgString(
4519 "-fbuild-session-timestamp=" +
4520 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004521 }
4522
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004523 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004524 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4525 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004526 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4527
4528 Args.AddLastArg(CmdArgs,
4529 options::OPT_fmodules_validate_once_per_build_session);
4530 }
4531
Ben Langmuirdcf73862014-03-12 00:06:17 +00004532 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4533
John McCalldfea9982010-04-09 19:12:06 +00004534 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004535 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004536 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004537 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004538
Anders Carlssond470fef2010-11-21 00:09:52 +00004539 // -felide-constructors is the default.
4540 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004541 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004542 CmdArgs.push_back("-fno-elide-constructors");
4543
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004544 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004545
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004546 if (KernelOrKext || (types::isCXX(InputType) &&
4547 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4548 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004549 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004550
Tony Linthicum76329bf2011-12-12 21:14:55 +00004551 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004552 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4553 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004554 CmdArgs.push_back("-fshort-enums");
4555
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004556 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004557 if (Arg *A = Args.getLastArg(
4558 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4559 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4560 if (A->getOption().matches(options::OPT_funsigned_char) ||
4561 A->getOption().matches(options::OPT_fno_signed_char)) {
4562 CmdArgs.push_back("-fno-signed-char");
4563 }
4564 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004565 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004566 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004567
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004568 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004569 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4570 options::OPT_fno_use_cxa_atexit,
4571 !IsWindowsCygnus && !IsWindowsGNU &&
Rafael Espindolafe71f382015-09-14 23:21:31 +00004572 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4573 getToolChain().getArch() != llvm::Triple::hexagon &&
4574 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004575 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004576 CmdArgs.push_back("-fno-use-cxa-atexit");
4577
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004578 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004579 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004580 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004581 CmdArgs.push_back("-fms-extensions");
4582
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004583 // -fno-use-line-directives is default.
4584 if (Args.hasFlag(options::OPT_fuse_line_directives,
4585 options::OPT_fno_use_line_directives, false))
4586 CmdArgs.push_back("-fuse-line-directives");
4587
Francois Pichet1b4f1632011-09-17 04:32:15 +00004588 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004589 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004590 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004591 (IsWindowsMSVC &&
4592 Args.hasFlag(options::OPT_fms_extensions,
4593 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004594 CmdArgs.push_back("-fms-compatibility");
4595
David Majnemerc371ff02015-03-22 08:39:22 +00004596 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004597 VersionTuple MSVT = visualstudio::getMSVCVersion(
4598 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4599 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004600 CmdArgs.push_back(
4601 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004602
David Majnemer8db91762015-05-18 04:49:30 +00004603 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4604 if (ImplyVCPPCXXVer) {
4605 if (IsMSVC2015Compatible)
4606 CmdArgs.push_back("-std=c++14");
4607 else
4608 CmdArgs.push_back("-std=c++11");
4609 }
4610
Eric Christopher5ecce122013-02-18 00:38:31 +00004611 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004612 if (Args.hasFlag(options::OPT_fborland_extensions,
4613 options::OPT_fno_borland_extensions, false))
4614 CmdArgs.push_back("-fborland-extensions");
4615
David Majnemerc371ff02015-03-22 08:39:22 +00004616 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4617 // than 19.
4618 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4619 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004620 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004621 CmdArgs.push_back("-fno-threadsafe-statics");
4622
Francois Pichet02744872011-09-01 16:38:08 +00004623 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4624 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004625 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004626 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004627 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004628
Chandler Carruthe03aa552010-04-17 20:17:31 +00004629 // -fgnu-keywords default varies depending on language; only pass if
4630 // specified.
4631 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004632 options::OPT_fno_gnu_keywords))
4633 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004634
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004635 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004636 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004637 CmdArgs.push_back("-fgnu89-inline");
4638
Chad Rosier9c76d242012-03-15 22:31:42 +00004639 if (Args.hasArg(options::OPT_fno_inline))
4640 CmdArgs.push_back("-fno-inline");
4641
Chad Rosier64d6be92012-03-06 21:17:19 +00004642 if (Args.hasArg(options::OPT_fno_inline_functions))
4643 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004644
John McCall5fb5df92012-06-20 06:18:46 +00004645 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004646
John McCall5fb5df92012-06-20 06:18:46 +00004647 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004648 // legacy is the default. Except for deployment taget of 10.5,
4649 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4650 // gets ignored silently.
4651 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004652 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4653 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004654 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004655 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004656 if (getToolChain().UseObjCMixedDispatch())
4657 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4658 else
4659 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4660 }
4661 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004662
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004663 // When ObjectiveC legacy runtime is in effect on MacOSX,
4664 // turn on the option to do Array/Dictionary subscripting
4665 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004666 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004667 getToolChain().getTriple().isMacOSX() &&
4668 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4669 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004670 objcRuntime.isNeXTFamily())
4671 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004672
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004673 // -fencode-extended-block-signature=1 is default.
4674 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4675 CmdArgs.push_back("-fencode-extended-block-signature");
4676 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004677
John McCall24fc0de2011-07-06 00:26:06 +00004678 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4679 // NOTE: This logic is duplicated in ToolChains.cpp.
4680 bool ARC = isObjCAutoRefCount(Args);
4681 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004682 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004683
John McCall24fc0de2011-07-06 00:26:06 +00004684 CmdArgs.push_back("-fobjc-arc");
4685
Chandler Carruth491db322011-11-04 07:34:47 +00004686 // FIXME: It seems like this entire block, and several around it should be
4687 // wrapped in isObjC, but for now we just use it here as this is where it
4688 // was being used previously.
4689 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4690 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4691 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4692 else
4693 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4694 }
4695
John McCall24fc0de2011-07-06 00:26:06 +00004696 // Allow the user to enable full exceptions code emission.
4697 // We define off for Objective-CC, on for Objective-C++.
4698 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4699 options::OPT_fno_objc_arc_exceptions,
4700 /*default*/ types::isCXX(InputType)))
4701 CmdArgs.push_back("-fobjc-arc-exceptions");
4702 }
4703
4704 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4705 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004706 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004707 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004708
John McCall24fc0de2011-07-06 00:26:06 +00004709 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4710 // takes precedence.
4711 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4712 if (!GCArg)
4713 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4714 if (GCArg) {
4715 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004716 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004717 } else if (getToolChain().SupportsObjCGC()) {
4718 GCArg->render(Args, CmdArgs);
4719 } else {
4720 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004721 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004722 }
4723 }
4724
Bob Wilsonb111ec92015-03-02 19:01:14 +00004725 if (Args.hasFlag(options::OPT_fapplication_extension,
4726 options::OPT_fno_application_extension, false))
4727 CmdArgs.push_back("-fapplication-extension");
4728
Reid Klecknerc542d372014-06-27 17:02:02 +00004729 // Handle GCC-style exception args.
4730 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004731 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4732 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004733
4734 if (getToolChain().UseSjLjExceptions())
4735 CmdArgs.push_back("-fsjlj-exceptions");
4736
4737 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004738 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4739 options::OPT_fno_assume_sane_operator_new))
4740 CmdArgs.push_back("-fno-assume-sane-operator-new");
4741
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004742 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4743 // most platforms.
4744 if (Args.hasFlag(options::OPT_fsized_deallocation,
4745 options::OPT_fno_sized_deallocation, false))
4746 CmdArgs.push_back("-fsized-deallocation");
4747
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004748 // -fconstant-cfstrings is default, and may be subject to argument translation
4749 // on Darwin.
4750 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4751 options::OPT_fno_constant_cfstrings) ||
4752 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4753 options::OPT_mno_constant_cfstrings))
4754 CmdArgs.push_back("-fno-constant-cfstrings");
4755
John Thompsoned4e2952009-11-05 20:14:16 +00004756 // -fshort-wchar default varies depending on platform; only
4757 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004758 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4759 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004760 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004761
Hans Wennborg28c96312013-07-31 23:39:13 +00004762 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004763 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004764 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004765 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004766
Daniel Dunbar096ed292011-10-05 21:04:55 +00004767 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4768 // -fno-pack-struct doesn't apply to -fpack-struct=.
4769 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004770 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004771 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004772 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004773 } else if (Args.hasFlag(options::OPT_fpack_struct,
4774 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004775 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004776 }
4777
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004778 // Handle -fmax-type-align=N and -fno-type-align
4779 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4780 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4781 if (!SkipMaxTypeAlign) {
4782 std::string MaxTypeAlignStr = "-fmax-type-align=";
4783 MaxTypeAlignStr += A->getValue();
4784 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4785 }
4786 } else if (getToolChain().getTriple().isOSDarwin()) {
4787 if (!SkipMaxTypeAlign) {
4788 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4789 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4790 }
4791 }
4792
John Brawna7b4ec02015-08-10 11:11:28 +00004793 // -fcommon is the default unless compiling kernel code or the target says so
4794 bool NoCommonDefault =
4795 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
4796 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
4797 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004798 CmdArgs.push_back("-fno-common");
4799
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004800 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004801 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004802 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004803 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004804 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004805 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004806
Daniel Dunbar6358d682010-10-15 22:30:42 +00004807 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004808 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004809 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004810 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004811
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004812 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004813 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4814 StringRef value = inputCharset->getValue();
4815 if (value != "UTF-8")
4816 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4817 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004818 }
4819
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004820 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004821 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4822 StringRef value = execCharset->getValue();
4823 if (value != "UTF-8")
4824 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4825 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004826 }
4827
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004828 // -fcaret-diagnostics is default.
4829 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4830 options::OPT_fno_caret_diagnostics, true))
4831 CmdArgs.push_back("-fno-caret-diagnostics");
4832
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004833 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004834 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004835 options::OPT_fno_diagnostics_fixit_info))
4836 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004837
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004838 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004839 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004840 options::OPT_fno_diagnostics_show_option))
4841 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004842
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004843 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004844 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004845 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004846 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004847 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004848
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004849 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004850 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004851 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004852 }
4853
Chandler Carruthb6766f02011-03-27 01:50:55 +00004854 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004855 options::OPT_fdiagnostics_show_note_include_stack,
4856 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004857 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004858 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004859 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4860 else
4861 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4862 }
4863
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004864 // Color diagnostics are the default, unless the terminal doesn't support
4865 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004866 // Support both clang's -f[no-]color-diagnostics and gcc's
4867 // -f[no-]diagnostics-colors[=never|always|auto].
4868 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004869 for (const auto &Arg : Args) {
4870 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004871 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4872 !O.matches(options::OPT_fdiagnostics_color) &&
4873 !O.matches(options::OPT_fno_color_diagnostics) &&
4874 !O.matches(options::OPT_fno_diagnostics_color) &&
4875 !O.matches(options::OPT_fdiagnostics_color_EQ))
4876 continue;
4877
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004878 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004879 if (O.matches(options::OPT_fcolor_diagnostics) ||
4880 O.matches(options::OPT_fdiagnostics_color)) {
4881 ShowColors = Colors_On;
4882 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4883 O.matches(options::OPT_fno_diagnostics_color)) {
4884 ShowColors = Colors_Off;
4885 } else {
4886 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004887 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004888 if (value == "always")
4889 ShowColors = Colors_On;
4890 else if (value == "never")
4891 ShowColors = Colors_Off;
4892 else if (value == "auto")
4893 ShowColors = Colors_Auto;
4894 else
4895 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004896 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004897 }
4898 }
4899 if (ShowColors == Colors_On ||
4900 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004901 CmdArgs.push_back("-fcolor-diagnostics");
4902
Nico Rieck7857d462013-09-11 00:38:02 +00004903 if (Args.hasArg(options::OPT_fansi_escape_codes))
4904 CmdArgs.push_back("-fansi-escape-codes");
4905
Daniel Dunbardb097022009-06-08 21:13:54 +00004906 if (!Args.hasFlag(options::OPT_fshow_source_location,
4907 options::OPT_fno_show_source_location))
4908 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004909
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004910 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004911 true))
4912 CmdArgs.push_back("-fno-show-column");
4913
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004914 if (!Args.hasFlag(options::OPT_fspell_checking,
4915 options::OPT_fno_spell_checking))
4916 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004917
Chad Rosierc8e56e82012-12-05 21:08:21 +00004918 // -fno-asm-blocks is default.
4919 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4920 false))
4921 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004922
Steven Wucb0d13f2015-01-16 23:05:28 +00004923 // -fgnu-inline-asm is default.
4924 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4925 options::OPT_fno_gnu_inline_asm, true))
4926 CmdArgs.push_back("-fno-gnu-inline-asm");
4927
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004928 // Enable vectorization per default according to the optimization level
4929 // selected. For optimization levels that want vectorization we use the alias
4930 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004931 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004932 OptSpecifier VectorizeAliasOption =
4933 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004934 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004935 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004936 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004937
Chad Rosier136d67d2014-04-28 19:30:57 +00004938 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004939 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004940 OptSpecifier SLPVectAliasOption =
4941 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00004942 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004943 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004944 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004945
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004946 // -fno-slp-vectorize-aggressive is default.
4947 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004948 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004949 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004950
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004951 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4952 A->render(Args, CmdArgs);
4953
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004954 // -fdollars-in-identifiers default varies depending on platform and
4955 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004956 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004957 options::OPT_fno_dollars_in_identifiers)) {
4958 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004959 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004960 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004961 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004962 }
4963
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004964 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4965 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004966 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004967 options::OPT_fno_unit_at_a_time)) {
4968 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004969 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004970 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004971
Eli Friedman055c9702011-11-02 01:53:16 +00004972 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4973 options::OPT_fno_apple_pragma_pack, false))
4974 CmdArgs.push_back("-fapple-pragma-pack");
4975
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004976 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004977 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4978 // by default.
4979 if (getToolChain().getArch() == llvm::Triple::le32) {
4980 CmdArgs.push_back("-fno-math-builtin");
4981 }
4982
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004983// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4984//
4985// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004986#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004987 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004988 (getToolChain().getArch() == llvm::Triple::arm ||
4989 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004990 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4991 CmdArgs.push_back("-fno-builtin-strcat");
4992 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4993 CmdArgs.push_back("-fno-builtin-strcpy");
4994 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004995#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004996
Justin Bognera88f0122014-06-20 22:59:50 +00004997 // Enable rewrite includes if the user's asked for it or if we're generating
4998 // diagnostics.
4999 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5000 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005001 if (Args.hasFlag(options::OPT_frewrite_includes,
5002 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005003 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005004 CmdArgs.push_back("-frewrite-includes");
5005
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005006 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005007 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005008 options::OPT_traditional_cpp)) {
5009 if (isa<PreprocessJobAction>(JA))
5010 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005011 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005012 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005013 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005014
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005015 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005016 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005017
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005018 // Handle serialized diagnostics.
5019 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5020 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005021 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005022 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005023
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005024 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5025 CmdArgs.push_back("-fretain-comments-from-system-headers");
5026
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005027 // Forward -fcomment-block-commands to -cc1.
5028 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005029 // Forward -fparse-all-comments to -cc1.
5030 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005031
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
5529 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005530 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005531
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005532 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005533 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005534
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005535 // Pass along any -I options so we get proper .include search paths.
5536 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5537
Eric Christopherfc3ee562012-01-10 00:38:01 +00005538 // Determine the original source input.
5539 const Action *SourceAction = &JA;
5540 while (SourceAction->getKind() != Action::InputClass) {
5541 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5542 SourceAction = SourceAction->getInputs()[0];
5543 }
5544
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005545 // Forward -g and handle debug info related flags, assuming we are dealing
5546 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005547 if (SourceAction->getType() == types::TY_Asm ||
5548 SourceAction->getType() == types::TY_PP_Asm) {
5549 Args.ClaimAllArgs(options::OPT_g_Group);
5550 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5551 if (!A->getOption().matches(options::OPT_g0))
5552 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005553
Douglas Katzman553927a2015-09-14 20:31:28 +00005554 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
5555 options::OPT_gdwarf_4))
5556 A->render(Args, CmdArgs);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005557
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005558 // Add the -fdebug-compilation-dir flag if needed.
5559 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005560
5561 // Set the AT_producer to the clang version when using the integrated
5562 // assembler on assembly source files.
5563 CmdArgs.push_back("-dwarf-debug-producer");
5564 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005565
5566 // And pass along -I options
5567 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005568 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005569
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005570 // Handle -fPIC et al -- the relocation-model affects the assembler
5571 // for some targets.
5572 llvm::Reloc::Model RelocationModel;
5573 unsigned PICLevel;
5574 bool IsPIE;
5575 std::tie(RelocationModel, PICLevel, IsPIE) =
5576 ParsePICArgs(getToolChain(), Triple, Args);
5577
5578 const char *RMName = RelocationModelName(RelocationModel);
5579 if (RMName) {
5580 CmdArgs.push_back("-mrelocation-model");
5581 CmdArgs.push_back(RMName);
5582 }
5583
Kevin Enderby292dc082011-12-22 19:31:58 +00005584 // Optionally embed the -cc1as level arguments into the debug info, for build
5585 // analysis.
5586 if (getToolChain().UseDwarfDebugFlags()) {
5587 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005588 for (const auto &Arg : Args)
5589 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005590
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005591 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005592 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5593 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005594 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005595 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005596 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005597 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005598 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005599 }
5600 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005601 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005602 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005603
5604 // FIXME: Add -static support, once we have it.
5605
Daniel Sanders7f933f42015-01-30 17:35:23 +00005606 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005607 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005608 default:
5609 break;
5610
5611 case llvm::Triple::mips:
5612 case llvm::Triple::mipsel:
5613 case llvm::Triple::mips64:
5614 case llvm::Triple::mips64el:
5615 AddMIPSTargetArgs(Args, CmdArgs);
5616 break;
5617 }
5618
David Blaikie372d9502014-01-17 03:17:40 +00005619 // Consume all the warning flags. Usually this would be handled more
5620 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5621 // doesn't handle that so rather than warning about unused flags that are
5622 // actually used, we'll lie by omission instead.
5623 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005624 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5625 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005626
David Blaikie9260ed62013-07-25 21:19:01 +00005627 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5628 getToolChain().getDriver());
5629
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005630 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005631
5632 assert(Output.isFilename() && "Unexpected lipo output.");
5633 CmdArgs.push_back("-o");
5634 CmdArgs.push_back(Output.getFilename());
5635
Daniel Dunbarb440f562010-08-02 02:38:21 +00005636 assert(Input.isFilename() && "Invalid input.");
5637 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005638
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005639 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005640 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005641
5642 // Handle the debug info splitting at object creation time if we're
5643 // creating an object.
5644 // TODO: Currently only works on linux with newer objcopy.
5645 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005646 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005647 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005648 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005649}
5650
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005651void GnuTool::anchor() {}
5652
Daniel Dunbara3246a02009-03-18 08:07:30 +00005653void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005654 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005655 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005656 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005657 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005658 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005659
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005660 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005661 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005662 // Don't forward any -g arguments to assembly steps.
5663 if (isa<AssembleJobAction>(JA) &&
5664 A->getOption().matches(options::OPT_g_Group))
5665 continue;
5666
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005667 // Don't forward any -W arguments to assembly and link steps.
5668 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5669 A->getOption().matches(options::OPT_W_Group))
5670 continue;
5671
Daniel Dunbar2da02722009-03-19 07:55:12 +00005672 // It is unfortunate that we have to claim here, as this means
5673 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005674 // platforms using a generic gcc, even if we are just using gcc
5675 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005676 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005677 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005678 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005679 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005680
Daniel Dunbar4e295052010-01-25 22:35:08 +00005681 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005682
5683 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005684 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005685 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005686 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005687 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005688 }
5689
Daniel Dunbar5716d872009-05-02 21:41:52 +00005690 // Try to force gcc to match the tool chain we want, if we recognize
5691 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005692 //
5693 // FIXME: The triple class should directly provide the information we want
5694 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005695 switch (getToolChain().getArch()) {
5696 default:
5697 break;
5698 case llvm::Triple::x86:
5699 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005700 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005701 break;
5702 case llvm::Triple::x86_64:
5703 case llvm::Triple::ppc64:
5704 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005705 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005706 break;
5707 case llvm::Triple::sparcel:
5708 CmdArgs.push_back("-EL");
5709 break;
5710 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005711
Daniel Dunbarb440f562010-08-02 02:38:21 +00005712 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005713 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005714 CmdArgs.push_back(Output.getFilename());
5715 } else {
5716 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005717 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005718 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005719
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005720 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005721
5722 // Only pass -x if gcc will understand it; otherwise hope gcc
5723 // understands the suffix correctly. The main use case this would go
5724 // wrong in is for linker inputs if they happened to have an odd
5725 // suffix; really the only way to get this to happen is a command
5726 // like '-x foobar a.c' which will treat a.c like a linker input.
5727 //
5728 // FIXME: For the linker case specifically, can we safely convert
5729 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005730 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005731 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005732 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5733 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005734 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005735 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005736 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005737 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005738 else if (II.getType() == types::TY_ModuleFile)
5739 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005740 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005741
Daniel Dunbara3246a02009-03-18 08:07:30 +00005742 if (types::canTypeBeUserSpecified(II.getType())) {
5743 CmdArgs.push_back("-x");
5744 CmdArgs.push_back(types::getTypeName(II.getType()));
5745 }
5746
Daniel Dunbarb440f562010-08-02 02:38:21 +00005747 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005748 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005749 else {
5750 const Arg &A = II.getInputArg();
5751
5752 // Reverse translate some rewritten options.
5753 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5754 CmdArgs.push_back("-lstdc++");
5755 continue;
5756 }
5757
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005758 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005759 A.render(Args, CmdArgs);
5760 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005761 }
5762
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005763 const std::string customGCCName = D.getCCCGenericGCCName();
5764 const char *GCCName;
5765 if (!customGCCName.empty())
5766 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005767 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005768 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005769 } else
5770 GCCName = "gcc";
5771
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005772 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005773 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005774}
5775
Douglas Katzman95354292015-06-23 20:42:09 +00005776void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5777 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005778 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005779}
5780
Douglas Katzman95354292015-06-23 20:42:09 +00005781void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5782 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005783 const Driver &D = getToolChain().getDriver();
5784
Eric Christophercc7ff502015-01-29 00:56:17 +00005785 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005786 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005787 case types::TY_LLVM_IR:
5788 case types::TY_LTO_IR:
5789 case types::TY_LLVM_BC:
5790 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005791 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005792 break;
5793 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005794 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005795 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005796 case types::TY_Nothing:
5797 CmdArgs.push_back("-fsyntax-only");
5798 break;
5799 default:
5800 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005801 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005802}
5803
Douglas Katzman95354292015-06-23 20:42:09 +00005804void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5805 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005806 // The types are (hopefully) good enough.
5807}
5808
Tony Linthicum76329bf2011-12-12 21:14:55 +00005809// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005810void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5811 ArgStringList &CmdArgs) const {}
5812void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5813 const InputInfo &Output,
5814 const InputInfoList &Inputs,
5815 const ArgList &Args,
5816 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005817 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005818
5819 const Driver &D = getToolChain().getDriver();
5820 ArgStringList CmdArgs;
5821
5822 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005823 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005824 CmdArgs.push_back(Args.MakeArgString(MarchString));
5825
5826 RenderExtraToolArgs(JA, CmdArgs);
5827
5828 if (Output.isFilename()) {
5829 CmdArgs.push_back("-o");
5830 CmdArgs.push_back(Output.getFilename());
5831 } else {
5832 assert(Output.isNothing() && "Unexpected output");
5833 CmdArgs.push_back("-fsyntax-only");
5834 }
5835
Douglas Katzman54366072015-07-27 16:53:08 +00005836 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005837 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005838
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005839 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005840
Tony Linthicum76329bf2011-12-12 21:14:55 +00005841 // Only pass -x if gcc will understand it; otherwise hope gcc
5842 // understands the suffix correctly. The main use case this would go
5843 // wrong in is for linker inputs if they happened to have an odd
5844 // suffix; really the only way to get this to happen is a command
5845 // like '-x foobar a.c' which will treat a.c like a linker input.
5846 //
5847 // FIXME: For the linker case specifically, can we safely convert
5848 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005849 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005850 // Don't try to pass LLVM or AST inputs to a generic gcc.
5851 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5852 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5853 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005854 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005855 else if (II.getType() == types::TY_AST)
5856 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005857 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005858 else if (II.getType() == types::TY_ModuleFile)
5859 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005860 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005861
5862 if (II.isFilename())
5863 CmdArgs.push_back(II.getFilename());
5864 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005865 // Don't render as input, we need gcc to do the translations.
5866 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005867 II.getInputArg().render(Args, CmdArgs);
5868 }
5869
5870 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005871 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005872 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005873}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005874
Douglas Katzman95354292015-06-23 20:42:09 +00005875void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5876 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005877 // The types are (hopefully) good enough.
5878}
5879
Douglas Katzman54366072015-07-27 16:53:08 +00005880static void
5881constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5882 const toolchains::HexagonToolChain &ToolChain,
5883 const InputInfo &Output, const InputInfoList &Inputs,
5884 const ArgList &Args, ArgStringList &CmdArgs,
5885 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005886
Matthew Curtise689b052012-12-06 15:46:07 +00005887 const Driver &D = ToolChain.getDriver();
5888
Matthew Curtise689b052012-12-06 15:46:07 +00005889 //----------------------------------------------------------------------------
5890 //
5891 //----------------------------------------------------------------------------
5892 bool hasStaticArg = Args.hasArg(options::OPT_static);
5893 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005894 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005895 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5896 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5897 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005898 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005899 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005900
Matthew Curtise689b052012-12-06 15:46:07 +00005901 //----------------------------------------------------------------------------
5902 // Silence warnings for various options
5903 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005904
Matthew Curtise689b052012-12-06 15:46:07 +00005905 Args.ClaimAllArgs(options::OPT_g_Group);
5906 Args.ClaimAllArgs(options::OPT_emit_llvm);
5907 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5908 // handled somewhere else.
5909 Args.ClaimAllArgs(options::OPT_static_libgcc);
5910
5911 //----------------------------------------------------------------------------
5912 //
5913 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005914 for (const auto &Opt : ToolChain.ExtraOpts)
5915 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005916
Douglas Katzman54366072015-07-27 16:53:08 +00005917 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00005918 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005919
Matthew Curtise689b052012-12-06 15:46:07 +00005920 if (buildingLib) {
5921 CmdArgs.push_back("-shared");
5922 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5923 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005924 }
5925
Matthew Curtise689b052012-12-06 15:46:07 +00005926 if (hasStaticArg)
5927 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005928
Matthew Curtise8f80a12012-12-06 17:49:03 +00005929 if (buildPIE && !buildingLib)
5930 CmdArgs.push_back("-pie");
5931
Douglas Katzman54366072015-07-27 16:53:08 +00005932 if (const char *v =
5933 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005934 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00005935 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005936 }
5937
Matthew Curtise689b052012-12-06 15:46:07 +00005938 //----------------------------------------------------------------------------
5939 //
5940 //----------------------------------------------------------------------------
5941 CmdArgs.push_back("-o");
5942 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005943
Matthew Curtise689b052012-12-06 15:46:07 +00005944 const std::string MarchSuffix = "/" + MarchString;
5945 const std::string G0Suffix = "/G0";
5946 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005947 const std::string RootDir =
Douglas Katzman54366072015-07-27 16:53:08 +00005948 toolchains::HexagonToolChain::GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005949 const std::string StartFilesDir =
5950 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005951
5952 //----------------------------------------------------------------------------
5953 // moslib
5954 //----------------------------------------------------------------------------
5955 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005956 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005957
Sean Silva14facf32015-06-09 01:57:17 +00005958 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5959 A->claim();
5960 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005961 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005962 }
Matthew Curtise689b052012-12-06 15:46:07 +00005963 if (oslibs.empty()) {
5964 oslibs.push_back("standalone");
5965 hasStandalone = true;
5966 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005967
Matthew Curtise689b052012-12-06 15:46:07 +00005968 //----------------------------------------------------------------------------
5969 // Start Files
5970 //----------------------------------------------------------------------------
5971 if (incStdLib && incStartFiles) {
5972
5973 if (!buildingLib) {
5974 if (hasStandalone) {
5975 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005976 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00005977 }
5978 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5979 }
5980 std::string initObj = useShared ? "/initS.o" : "/init.o";
5981 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5982 }
5983
5984 //----------------------------------------------------------------------------
5985 // Library Search Paths
5986 //----------------------------------------------------------------------------
5987 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005988 for (const auto &LibPath : LibPaths)
5989 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005990
5991 //----------------------------------------------------------------------------
5992 //
5993 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00005994 Args.AddAllArgs(CmdArgs,
5995 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
5996 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00005997
5998 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5999
6000 //----------------------------------------------------------------------------
6001 // Libraries
6002 //----------------------------------------------------------------------------
6003 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006004 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00006005 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6006 CmdArgs.push_back("-lm");
6007 }
6008
6009 CmdArgs.push_back("--start-group");
6010
6011 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00006012 for (const std::string &Lib : oslibs)
6013 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006014 CmdArgs.push_back("-lc");
6015 }
6016 CmdArgs.push_back("-lgcc");
6017
6018 CmdArgs.push_back("--end-group");
6019 }
6020
6021 //----------------------------------------------------------------------------
6022 // End files
6023 //----------------------------------------------------------------------------
6024 if (incStdLib && incStartFiles) {
6025 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
6026 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
6027 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006028}
6029
Douglas Katzman95354292015-06-23 20:42:09 +00006030void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6031 const InputInfo &Output,
6032 const InputInfoList &Inputs,
6033 const ArgList &Args,
6034 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006035
Douglas Katzman54366072015-07-27 16:53:08 +00006036 const toolchains::HexagonToolChain &ToolChain =
6037 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006038
6039 ArgStringList CmdArgs;
6040 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
6041 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006042
6043 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00006044 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006045 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006046}
6047// Hexagon tools end.
6048
Tom Stellard8fa33092015-07-18 01:49:05 +00006049void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6050 const InputInfo &Output,
6051 const InputInfoList &Inputs,
6052 const ArgList &Args,
6053 const char *LinkingOutput) const {
6054
6055 std::string Linker = getToolChain().GetProgramPath(getShortName());
6056 ArgStringList CmdArgs;
6057 CmdArgs.push_back("-flavor");
6058 CmdArgs.push_back("gnu");
6059 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006060 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006061 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6062 CmdArgs.push_back("-o");
6063 CmdArgs.push_back(Output.getFilename());
6064 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6065 CmdArgs, Inputs));
6066}
6067// AMDGPU tools end.
6068
Renato Golin7c542b42015-07-27 23:44:45 +00006069const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006070 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006071 if (!Arch.empty())
6072 MArch = Arch;
6073 else
Bernard Ogden31561762013-12-12 13:27:11 +00006074 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006075 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00006076
6077 // Handle -march=native.
6078 if (MArch == "native") {
6079 std::string CPU = llvm::sys::getHostCPUName();
6080 if (CPU != "generic") {
6081 // Translate the native cpu into the architecture suffix for that CPU.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006082 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
John Brawn94fd9632015-05-21 12:19:49 +00006083 // If there is no valid architecture suffix for this CPU we don't know how
6084 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006085 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006086 MArch = "";
6087 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006088 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006089 }
6090 }
6091
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006092 return MArch;
6093}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006094
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006095/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006096StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006097 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006098 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6099 // here means an -march=native that we can't handle, so instead return no CPU.
6100 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006101 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006102
John Brawna95c1a82015-05-08 12:52:18 +00006103 // We need to return an empty string here on invalid MArch values as the
6104 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006105 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006106}
6107
6108/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006109std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006110 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006111 // FIXME: Warn on inconsistent use of -mcpu and -march.
6112 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006113 if (!CPU.empty()) {
6114 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006115 // Handle -mcpu=native.
6116 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006117 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006118 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006119 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006120 }
6121
Renato Goline17c5802015-07-27 23:44:42 +00006122 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006123}
6124
6125/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006126/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006127// FIXME: This is redundant with -mcpu, why does LLVM use this.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006128StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00006129 if (CPU == "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006130 return llvm::ARM::getSubArch(
6131 llvm::ARM::parseArch(Arch));
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006132
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006133 unsigned ArchKind = llvm::ARM::parseCPUArch(CPU);
Renato Golin3c007252015-05-28 15:05:53 +00006134 if (ArchKind == llvm::ARM::AK_INVALID)
6135 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006136 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006137}
6138
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006139void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006140 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006141 if (Args.hasArg(options::OPT_r))
6142 return;
6143
John Brawn94fd9632015-05-21 12:19:49 +00006144 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6145 // to generate BE-8 executables.
6146 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6147 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006148}
6149
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006150mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
6151 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6152 .Case("mips1", NanLegacy)
6153 .Case("mips2", NanLegacy)
6154 .Case("mips3", NanLegacy)
6155 .Case("mips4", NanLegacy)
6156 .Case("mips5", NanLegacy)
6157 .Case("mips32", NanLegacy)
6158 .Case("mips32r2", NanLegacy)
6159 .Case("mips32r3", NanLegacy | Nan2008)
6160 .Case("mips32r5", NanLegacy | Nan2008)
6161 .Case("mips32r6", Nan2008)
6162 .Case("mips64", NanLegacy)
6163 .Case("mips64r2", NanLegacy)
6164 .Case("mips64r3", NanLegacy | Nan2008)
6165 .Case("mips64r5", NanLegacy | Nan2008)
6166 .Case("mips64r6", Nan2008)
6167 .Default(NanLegacy);
6168}
6169
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006170bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6171 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6172 return A && (A->getValue() == StringRef(Value));
6173}
6174
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006175bool mips::isUCLibc(const ArgList &Args) {
6176 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006177 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006178}
6179
Daniel Sanders2bf13662014-07-10 14:40:57 +00006180bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006181 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6182 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006183 .Case("2008", true)
6184 .Case("legacy", false)
6185 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006186
6187 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006188 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006189 .Cases("mips32r6", "mips64r6", true)
6190 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006191
6192 return false;
6193}
6194
Daniel Sanders379d44b2014-07-16 11:52:23 +00006195bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Toma Tabacu94ea6862015-06-16 13:54:13 +00006196 StringRef ABIName, StringRef FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006197 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006198 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006199 return false;
6200
6201 if (ABIName != "32")
6202 return false;
6203
Toma Tabacu94ea6862015-06-16 13:54:13 +00006204 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6205 // present.
6206 if (FloatABI == "soft")
6207 return false;
6208
Daniel Sanders379d44b2014-07-16 11:52:23 +00006209 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006210 .Cases("mips2", "mips3", "mips4", "mips5", true)
6211 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6212 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6213 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006214}
6215
Toma Tabacu94ea6862015-06-16 13:54:13 +00006216bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6217 StringRef CPUName, StringRef ABIName,
6218 StringRef FloatABI) {
6219 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6220
6221 // FPXX shouldn't be used if -msingle-float is present.
6222 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6223 options::OPT_mdouble_float))
6224 if (A->getOption().matches(options::OPT_msingle_float))
6225 UseFPXX = false;
6226
6227 return UseFPXX;
6228}
6229
Tim Northover157d9112014-01-16 08:48:16 +00006230llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006231 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6232 // archs which Darwin doesn't use.
6233
6234 // The matching this routine does is fairly pointless, since it is neither the
6235 // complete architecture list, nor a reasonable subset. The problem is that
6236 // historically the driver driver accepts this and also ties its -march=
6237 // handling to the architecture name, so we need to be careful before removing
6238 // support for it.
6239
6240 // This code must be kept in sync with Clang's Darwin specific argument
6241 // translation.
6242
6243 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006244 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6245 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6246 .Case("ppc64", llvm::Triple::ppc64)
6247 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6248 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6249 llvm::Triple::x86)
6250 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6251 // This is derived from the driver driver.
6252 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6253 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6254 .Cases("armv7s", "xscale", llvm::Triple::arm)
6255 .Case("arm64", llvm::Triple::aarch64)
6256 .Case("r600", llvm::Triple::r600)
6257 .Case("amdgcn", llvm::Triple::amdgcn)
6258 .Case("nvptx", llvm::Triple::nvptx)
6259 .Case("nvptx64", llvm::Triple::nvptx64)
6260 .Case("amdil", llvm::Triple::amdil)
6261 .Case("spir", llvm::Triple::spir)
6262 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006263}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006264
Tim Northover157d9112014-01-16 08:48:16 +00006265void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006266 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006267 T.setArch(Arch);
6268
6269 if (Str == "x86_64h")
6270 T.setArchName(Str);
6271 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6272 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006273 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006274 }
6275}
6276
Bob Wilsondecc03e2012-11-23 06:14:39 +00006277const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006278 const InputInfo &Input) {
6279 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006280}
6281
Bob Wilsondecc03e2012-11-23 06:14:39 +00006282const char *Clang::getBaseInputStem(const ArgList &Args,
6283 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006284 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006285
Chris Lattner906bb902011-01-16 08:14:11 +00006286 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006287 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006288
6289 return Str;
6290}
6291
Bob Wilsondecc03e2012-11-23 06:14:39 +00006292const char *Clang::getDependencyFileName(const ArgList &Args,
6293 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006294 // FIXME: Think about this more.
6295 std::string Res;
6296
6297 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006298 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006299 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006300 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006301 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006302 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006303 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006304}
6305
Douglas Katzman95354292015-06-23 20:42:09 +00006306void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6307 const InputInfo &Output,
6308 const InputInfoList &Inputs,
6309 const ArgList &Args,
6310 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006311 const ToolChain &ToolChain = getToolChain();
6312 const Driver &D = ToolChain.getDriver();
6313 ArgStringList CmdArgs;
6314
6315 // Silence warning for "clang -g foo.o -o foo"
6316 Args.ClaimAllArgs(options::OPT_g_Group);
6317 // and "clang -emit-llvm foo.o -o foo"
6318 Args.ClaimAllArgs(options::OPT_emit_llvm);
6319 // and for "clang -w foo.o -o foo". Other warning options are already
6320 // handled somewhere else.
6321 Args.ClaimAllArgs(options::OPT_w);
6322
6323 if (!D.SysRoot.empty())
6324 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6325
6326 // CloudABI only supports static linkage.
6327 CmdArgs.push_back("-Bstatic");
6328 CmdArgs.push_back("--eh-frame-hdr");
6329 CmdArgs.push_back("--gc-sections");
6330
6331 if (Output.isFilename()) {
6332 CmdArgs.push_back("-o");
6333 CmdArgs.push_back(Output.getFilename());
6334 } else {
6335 assert(Output.isNothing() && "Invalid output.");
6336 }
6337
6338 if (!Args.hasArg(options::OPT_nostdlib) &&
6339 !Args.hasArg(options::OPT_nostartfiles)) {
6340 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6341 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6342 }
6343
6344 Args.AddAllArgs(CmdArgs, options::OPT_L);
6345 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6346 for (const auto &Path : Paths)
6347 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006348 Args.AddAllArgs(CmdArgs,
6349 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6350 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006351
Alexey Samsonov907880e2015-06-19 19:57:46 +00006352 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006353 AddGoldPlugin(ToolChain, Args, CmdArgs);
6354
6355 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6356
6357 if (!Args.hasArg(options::OPT_nostdlib) &&
6358 !Args.hasArg(options::OPT_nodefaultlibs)) {
6359 if (D.CCCIsCXX())
6360 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6361 CmdArgs.push_back("-lc");
6362 CmdArgs.push_back("-lcompiler_rt");
6363 }
6364
6365 if (!Args.hasArg(options::OPT_nostdlib) &&
6366 !Args.hasArg(options::OPT_nostartfiles))
6367 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6368
6369 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006370 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006371}
6372
Douglas Katzman95354292015-06-23 20:42:09 +00006373void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6374 const InputInfo &Output,
6375 const InputInfoList &Inputs,
6376 const ArgList &Args,
6377 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006378 ArgStringList CmdArgs;
6379
6380 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6381 const InputInfo &Input = Inputs[0];
6382
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006383 // Determine the original source input.
6384 const Action *SourceAction = &JA;
6385 while (SourceAction->getKind() != Action::InputClass) {
6386 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6387 SourceAction = SourceAction->getInputs()[0];
6388 }
6389
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006390 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006391 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006392 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6393 // FIXME: at run-time detect assembler capabilities or rely on version
6394 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006395 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006396 const llvm::Triple &T(getToolChain().getTriple());
6397 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006398 CmdArgs.push_back("-Q");
6399 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006400
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006401 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006402 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006403 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006404 if (Args.hasArg(options::OPT_gstabs))
6405 CmdArgs.push_back("--gstabs");
6406 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006407 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006408 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006409
Daniel Dunbarbe220842009-03-20 16:06:39 +00006410 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006411 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006412
Daniel Dunbar6d484762010-07-22 01:47:22 +00006413 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006414 if (getToolChain().getArch() == llvm::Triple::x86 ||
6415 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006416 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6417 CmdArgs.push_back("-force_cpusubtype_ALL");
6418
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006419 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006420 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006421 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006422 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006423 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006424 CmdArgs.push_back("-static");
6425
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006426 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006427
6428 assert(Output.isFilename() && "Unexpected lipo output.");
6429 CmdArgs.push_back("-o");
6430 CmdArgs.push_back(Output.getFilename());
6431
Daniel Dunbarb440f562010-08-02 02:38:21 +00006432 assert(Input.isFilename() && "Invalid input.");
6433 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006434
6435 // asm_final spec is empty.
6436
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006437 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006438 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006439}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006440
Tim Northover157d9112014-01-16 08:48:16 +00006441void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006442
Tim Northover157d9112014-01-16 08:48:16 +00006443void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6444 ArgStringList &CmdArgs) const {
6445 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006446
Daniel Dunbarc1964212009-03-26 16:23:12 +00006447 // Derived from darwin_arch spec.
6448 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006449 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006450
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006451 // FIXME: Is this needed anymore?
6452 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006453 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006454}
6455
Douglas Katzman95354292015-06-23 20:42:09 +00006456bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006457 // We only need to generate a temp path for LTO if we aren't compiling object
6458 // files. When compiling source files, we run 'dsymutil' after linking. We
6459 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006460 for (const auto &Input : Inputs)
6461 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006462 return true;
6463
6464 return false;
6465}
6466
Douglas Katzman95354292015-06-23 20:42:09 +00006467void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6468 ArgStringList &CmdArgs,
6469 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006470 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006471 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006472
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006473 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006474 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6475 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006476 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6477 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006478 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006479 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006480 }
6481
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006482 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006483 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006484 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6485 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006486
Bob Wilson3d27dad2013-08-02 22:25:34 +00006487 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6488 CmdArgs.push_back("-export_dynamic");
6489
Bob Wilsonb111ec92015-03-02 19:01:14 +00006490 // If we are using App Extension restrictions, pass a flag to the linker
6491 // telling it that the compiled code has been audited.
6492 if (Args.hasFlag(options::OPT_fapplication_extension,
6493 options::OPT_fno_application_extension, false))
6494 CmdArgs.push_back("-application_extension");
6495
Bill Wendling313b6bf2012-11-16 23:03:00 +00006496 // If we are using LTO, then automatically create a temporary file path for
6497 // the linker to use, so that it's lifetime will extend past a possible
6498 // dsymutil step.
Alexey Samsonov907880e2015-06-19 19:57:46 +00006499 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006500 const char *TmpPath = C.getArgs().MakeArgString(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006501 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Bill Wendling313b6bf2012-11-16 23:03:00 +00006502 C.addTempFile(TmpPath);
6503 CmdArgs.push_back("-object_path_lto");
6504 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006505 }
6506
Daniel Dunbarc1964212009-03-26 16:23:12 +00006507 // Derived from the "link" spec.
6508 Args.AddAllArgs(CmdArgs, options::OPT_static);
6509 if (!Args.hasArg(options::OPT_static))
6510 CmdArgs.push_back("-dynamic");
6511 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6512 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6513 // here. How do we wish to handle such things?
6514 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006515
Daniel Dunbarc1964212009-03-26 16:23:12 +00006516 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006517 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006518 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006519 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006520
6521 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6522 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6523 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6524
6525 Arg *A;
6526 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6527 (A = Args.getLastArg(options::OPT_current__version)) ||
6528 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006529 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6530 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006531
6532 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6533 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6534 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6535 } else {
6536 CmdArgs.push_back("-dylib");
6537
6538 Arg *A;
6539 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6540 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6541 (A = Args.getLastArg(options::OPT_client__name)) ||
6542 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6543 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6544 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006545 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6546 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006547
Daniel Dunbarc1964212009-03-26 16:23:12 +00006548 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6549 "-dylib_compatibility_version");
6550 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6551 "-dylib_current_version");
6552
Tim Northover157d9112014-01-16 08:48:16 +00006553 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006554
6555 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6556 "-dylib_install_name");
6557 }
6558
6559 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6560 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6561 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006562 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006563 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006564 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6565 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6566 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6567 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6568 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6569 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006570 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006571 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6572 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6573 Args.AddAllArgs(CmdArgs, options::OPT_init);
6574
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006575 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006576 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006577
Daniel Dunbarc1964212009-03-26 16:23:12 +00006578 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6579 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6580 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6581 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6582 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006583
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006584 if (const Arg *A =
6585 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6586 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006587 if (A->getOption().matches(options::OPT_fpie) ||
6588 A->getOption().matches(options::OPT_fPIE))
6589 CmdArgs.push_back("-pie");
6590 else
6591 CmdArgs.push_back("-no_pie");
6592 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006593
6594 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6595 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6596 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6597 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6598 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6599 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6600 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6601 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6602 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6603 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6604 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6605 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6606 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6607 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6608 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6609 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006610
Daniel Dunbar84384642011-05-02 21:03:47 +00006611 // Give --sysroot= preference, over the Apple specific behavior to also use
6612 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006613 StringRef sysroot = C.getSysRoot();
6614 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006615 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006616 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006617 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6618 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006619 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006620 }
6621
Daniel Dunbarc1964212009-03-26 16:23:12 +00006622 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6623 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6624 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6625 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6626 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006627 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006628 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6629 Args.AddAllArgs(CmdArgs, options::OPT_y);
6630 Args.AddLastArg(CmdArgs, options::OPT_w);
6631 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6632 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6633 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6634 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6635 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6636 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6637 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6638 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6639 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6640 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6641 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6642 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6643}
6644
Douglas Katzman95354292015-06-23 20:42:09 +00006645void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6646 const InputInfo &Output,
6647 const InputInfoList &Inputs,
6648 const ArgList &Args,
6649 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006650 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006651
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006652 // If the number of arguments surpasses the system limits, we will encode the
6653 // input files in a separate file, shortening the command line. To this end,
6654 // build a list of input file names that can be passed via a file with the
6655 // -filelist linker option.
6656 llvm::opt::ArgStringList InputFileList;
6657
Daniel Dunbarc1964212009-03-26 16:23:12 +00006658 // The logic here is derived from gcc's behavior; most of which
6659 // comes from specs (starting with link_command). Consult gcc for
6660 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006661 ArgStringList CmdArgs;
6662
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006663 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6664 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6665 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006666 for (const auto &Arg : Args)
6667 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006668 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006669 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006670 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006671 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006672 return;
6673 }
6674
Daniel Dunbarc1964212009-03-26 16:23:12 +00006675 // I'm not sure why this particular decomposition exists in gcc, but
6676 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006677 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006678
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006679 // It seems that the 'e' option is completely ignored for dynamic executables
6680 // (the default), and with static executables, the last one wins, as expected.
6681 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6682 options::OPT_Z_Flag, options::OPT_u_Group,
6683 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006684
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006685 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6686 // members of static archive libraries which implement Objective-C classes or
6687 // categories.
6688 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6689 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006690
Daniel Dunbarc1964212009-03-26 16:23:12 +00006691 CmdArgs.push_back("-o");
6692 CmdArgs.push_back(Output.getFilename());
6693
Chad Rosier06fd3c62012-05-16 23:45:12 +00006694 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006695 !Args.hasArg(options::OPT_nostartfiles))
6696 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006697
Peter Collingbournec4122c12015-06-15 21:08:13 +00006698 // SafeStack requires its own runtime libraries
6699 // These libraries should be linked first, to make sure the
6700 // __safestack_init constructor executes before everything else
6701 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6702 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6703 "libclang_rt.safestack_osx.a",
6704 /*AlwaysLink=*/true);
6705 }
6706
Daniel Dunbarc1964212009-03-26 16:23:12 +00006707 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006708
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006709 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6710 options::OPT_fno_openmp, false)) {
6711 switch (getOpenMPRuntime(getToolChain(), Args)) {
6712 case OMPRT_OMP:
6713 CmdArgs.push_back("-lomp");
6714 break;
6715 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006716 CmdArgs.push_back("-lgomp");
6717 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006718 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006719 CmdArgs.push_back("-liomp5");
6720 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006721 case OMPRT_Unknown:
6722 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006723 break;
6724 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006725 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006726
Douglas Gregor9295df02012-05-15 21:00:27 +00006727 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006728 // Build the input file for -filelist (list of linker input files) in case we
6729 // need it later
6730 for (const auto &II : Inputs) {
6731 if (!II.isFilename()) {
6732 // This is a linker input argument.
6733 // We cannot mix input arguments and file names in a -filelist input, thus
6734 // we prematurely stop our list (remaining files shall be passed as
6735 // arguments).
6736 if (InputFileList.size() > 0)
6737 break;
6738
6739 continue;
6740 }
6741
6742 InputFileList.push_back(II.getFilename());
6743 }
6744
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006745 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006746 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006747 // We use arclite library for both ARC and subscripting support.
6748 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6749
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006750 CmdArgs.push_back("-framework");
6751 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006752 // Link libobj.
6753 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006754 }
John McCall31168b02011-06-15 23:02:42 +00006755
Daniel Dunbarc1964212009-03-26 16:23:12 +00006756 if (LinkingOutput) {
6757 CmdArgs.push_back("-arch_multiple");
6758 CmdArgs.push_back("-final_output");
6759 CmdArgs.push_back(LinkingOutput);
6760 }
6761
Daniel Dunbarc1964212009-03-26 16:23:12 +00006762 if (Args.hasArg(options::OPT_fnested_functions))
6763 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006764
Justin Bognerc7701242015-05-12 05:44:36 +00006765 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6766 // paths are different enough from other toolchains that this needs a fair
6767 // amount of refactoring done first.
6768 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6769
Daniel Dunbarc1964212009-03-26 16:23:12 +00006770 if (!Args.hasArg(options::OPT_nostdlib) &&
6771 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006772 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006773 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006774
Daniel Dunbarc1964212009-03-26 16:23:12 +00006775 // link_ssp spec is empty.
6776
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006777 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006778 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006779 }
6780
Chad Rosier06fd3c62012-05-16 23:45:12 +00006781 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006782 !Args.hasArg(options::OPT_nostartfiles)) {
6783 // endfile_spec is empty.
6784 }
6785
6786 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6787 Args.AddAllArgs(CmdArgs, options::OPT_F);
6788
Steven Wu3ffb61b2015-02-06 18:08:29 +00006789 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006790 for (const Arg *A : Args.filtered(options::OPT_iframework))
6791 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006792
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006793 if (!Args.hasArg(options::OPT_nostdlib) &&
6794 !Args.hasArg(options::OPT_nodefaultlibs)) {
6795 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6796 if (A->getValue() == StringRef("Accelerate")) {
6797 CmdArgs.push_back("-framework");
6798 CmdArgs.push_back("Accelerate");
6799 }
6800 }
6801 }
6802
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006803 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006804 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006805 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006806 Cmd->setInputFileList(std::move(InputFileList));
6807 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006808}
6809
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006810void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006811 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006812 const InputInfoList &Inputs,
6813 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006814 const char *LinkingOutput) const {
6815 ArgStringList CmdArgs;
6816
6817 CmdArgs.push_back("-create");
6818 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006819
6820 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006821 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006822
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006823 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006824 assert(II.isFilename() && "Unexpected lipo input.");
6825 CmdArgs.push_back(II.getFilename());
6826 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006827
6828 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006829 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006830}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006831
Daniel Dunbar88299622010-06-04 18:28:36 +00006832void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006833 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006834 const InputInfoList &Inputs,
6835 const ArgList &Args,
6836 const char *LinkingOutput) const {
6837 ArgStringList CmdArgs;
6838
Daniel Dunbareb86b042011-05-09 17:23:16 +00006839 CmdArgs.push_back("-o");
6840 CmdArgs.push_back(Output.getFilename());
6841
Daniel Dunbar88299622010-06-04 18:28:36 +00006842 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6843 const InputInfo &Input = Inputs[0];
6844 assert(Input.isFilename() && "Unexpected dsymutil input.");
6845 CmdArgs.push_back(Input.getFilename());
6846
Daniel Dunbar88299622010-06-04 18:28:36 +00006847 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006848 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006849 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006850}
6851
Eric Christopher551ef452011-08-23 17:56:55 +00006852void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006853 const InputInfo &Output,
6854 const InputInfoList &Inputs,
6855 const ArgList &Args,
6856 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006857 ArgStringList CmdArgs;
6858 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006859 CmdArgs.push_back("--debug-info");
6860 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006861 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006862
6863 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6864 const InputInfo &Input = Inputs[0];
6865 assert(Input.isFilename() && "Unexpected verify input");
6866
6867 // Grabbing the output of the earlier dsymutil run.
6868 CmdArgs.push_back(Input.getFilename());
6869
6870 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006871 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006872 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00006873}
6874
Douglas Katzman95354292015-06-23 20:42:09 +00006875void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006876 const InputInfo &Output,
6877 const InputInfoList &Inputs,
6878 const ArgList &Args,
6879 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006880 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006881 ArgStringList CmdArgs;
6882
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006883 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006884
6885 CmdArgs.push_back("-o");
6886 CmdArgs.push_back(Output.getFilename());
6887
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006888 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006889 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006890
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006891 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006892 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006893}
6894
Douglas Katzman95354292015-06-23 20:42:09 +00006895void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6896 const InputInfo &Output,
6897 const InputInfoList &Inputs,
6898 const ArgList &Args,
6899 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006900 ArgStringList CmdArgs;
6901
David Chisnall272a0712012-02-29 15:06:12 +00006902 // Demangle C++ names in errors
6903 CmdArgs.push_back("-C");
6904
David Chisnallf571cde2012-02-15 13:39:01 +00006905 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6906 (!Args.hasArg(options::OPT_shared))) {
6907 CmdArgs.push_back("-e");
6908 CmdArgs.push_back("_start");
6909 }
6910
6911 if (Args.hasArg(options::OPT_static)) {
6912 CmdArgs.push_back("-Bstatic");
6913 CmdArgs.push_back("-dn");
6914 } else {
6915 CmdArgs.push_back("-Bdynamic");
6916 if (Args.hasArg(options::OPT_shared)) {
6917 CmdArgs.push_back("-shared");
6918 } else {
6919 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006920 CmdArgs.push_back(
6921 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00006922 }
6923 }
6924
6925 if (Output.isFilename()) {
6926 CmdArgs.push_back("-o");
6927 CmdArgs.push_back(Output.getFilename());
6928 } else {
6929 assert(Output.isNothing() && "Invalid output.");
6930 }
6931
6932 if (!Args.hasArg(options::OPT_nostdlib) &&
6933 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006934 if (!Args.hasArg(options::OPT_shared))
6935 CmdArgs.push_back(
6936 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6937
6938 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6939 CmdArgs.push_back(
6940 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
6941 CmdArgs.push_back(
6942 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006943 }
6944
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006945 const ToolChain::path_list &Paths = getToolChain().getFilePaths();
6946 for (const auto &Path : Paths)
6947 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
David Chisnallf571cde2012-02-15 13:39:01 +00006948
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006949 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
6950 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00006951
6952 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6953
6954 if (!Args.hasArg(options::OPT_nostdlib) &&
6955 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006956 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006957 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006958 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00006959 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006960 if (!Args.hasArg(options::OPT_shared)) {
6961 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00006962 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006963 }
David Chisnallf571cde2012-02-15 13:39:01 +00006964 }
6965
6966 if (!Args.hasArg(options::OPT_nostdlib) &&
6967 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006968 CmdArgs.push_back(
6969 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006970 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006971 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006972
Alexey Samsonov7811d192014-02-20 13:57:37 +00006973 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006974
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006975 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006976 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006977}
6978
Douglas Katzman95354292015-06-23 20:42:09 +00006979void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6980 const InputInfo &Output,
6981 const InputInfoList &Inputs,
6982 const ArgList &Args,
6983 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006984 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006985 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006986 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006987
Rafael Espindolacc126272014-02-28 01:55:21 +00006988 switch (getToolChain().getArch()) {
6989 case llvm::Triple::x86:
6990 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6991 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006992 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006993 break;
6994
6995 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006996 CmdArgs.push_back("-mppc");
6997 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006998 break;
6999
7000 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007001 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00007002 CmdArgs.push_back("-32");
7003 NeedsKPIC = true;
7004 break;
7005
7006 case llvm::Triple::sparcv9:
7007 CmdArgs.push_back("-64");
7008 CmdArgs.push_back("-Av9a");
7009 NeedsKPIC = true;
7010 break;
7011
7012 case llvm::Triple::mips64:
7013 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007014 StringRef CPUName;
7015 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007016 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007017
7018 CmdArgs.push_back("-mabi");
7019 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7020
7021 if (getToolChain().getArch() == llvm::Triple::mips64)
7022 CmdArgs.push_back("-EB");
7023 else
7024 CmdArgs.push_back("-EL");
7025
Rafael Espindolacc126272014-02-28 01:55:21 +00007026 NeedsKPIC = true;
7027 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007028 }
7029
Rafael Espindolacc126272014-02-28 01:55:21 +00007030 default:
7031 break;
7032 }
7033
7034 if (NeedsKPIC)
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007035 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007036
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007037 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007038
7039 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007040 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007041
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007042 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007043 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007044
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007045 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007046 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007047}
7048
Douglas Katzman95354292015-06-23 20:42:09 +00007049void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7050 const InputInfo &Output,
7051 const InputInfoList &Inputs,
7052 const ArgList &Args,
7053 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007054 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007055 ArgStringList CmdArgs;
7056
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007057 // Silence warning for "clang -g foo.o -o foo"
7058 Args.ClaimAllArgs(options::OPT_g_Group);
7059 // and "clang -emit-llvm foo.o -o foo"
7060 Args.ClaimAllArgs(options::OPT_emit_llvm);
7061 // and for "clang -w foo.o -o foo". Other warning options are already
7062 // handled somewhere else.
7063 Args.ClaimAllArgs(options::OPT_w);
7064
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007065 if (getToolChain().getArch() == llvm::Triple::mips64)
7066 CmdArgs.push_back("-EB");
7067 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7068 CmdArgs.push_back("-EL");
7069
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007070 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007071 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007072 CmdArgs.push_back("-e");
7073 CmdArgs.push_back("__start");
7074 }
7075
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007076 if (Args.hasArg(options::OPT_static)) {
7077 CmdArgs.push_back("-Bstatic");
7078 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007079 if (Args.hasArg(options::OPT_rdynamic))
7080 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007081 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007082 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007083 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007084 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007085 } else {
7086 CmdArgs.push_back("-dynamic-linker");
7087 CmdArgs.push_back("/usr/libexec/ld.so");
7088 }
7089 }
7090
Rafael Espindola044f7832013-06-05 04:28:55 +00007091 if (Args.hasArg(options::OPT_nopie))
7092 CmdArgs.push_back("-nopie");
7093
Daniel Dunbarb440f562010-08-02 02:38:21 +00007094 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007095 CmdArgs.push_back("-o");
7096 CmdArgs.push_back(Output.getFilename());
7097 } else {
7098 assert(Output.isNothing() && "Invalid output.");
7099 }
7100
7101 if (!Args.hasArg(options::OPT_nostdlib) &&
7102 !Args.hasArg(options::OPT_nostartfiles)) {
7103 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007104 if (Args.hasArg(options::OPT_pg))
7105 CmdArgs.push_back(
7106 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007107 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007108 CmdArgs.push_back(
7109 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7110 CmdArgs.push_back(
7111 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007112 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007113 CmdArgs.push_back(
7114 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007115 }
7116 }
7117
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007118 std::string Triple = getToolChain().getTripleString();
7119 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007120 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007121 CmdArgs.push_back(
7122 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007123
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007124 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7125 options::OPT_e, options::OPT_s, options::OPT_t,
7126 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007127
Daniel Dunbar54423b22010-09-17 00:24:54 +00007128 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007129
7130 if (!Args.hasArg(options::OPT_nostdlib) &&
7131 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007132 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007133 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007134 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007135 CmdArgs.push_back("-lm_p");
7136 else
7137 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007138 }
7139
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007140 // FIXME: For some reason GCC passes -lgcc before adding
7141 // the default system libraries. Just mimic this for now.
7142 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007143
Eric Christopher17674ec2012-09-13 06:32:34 +00007144 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007145 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7146 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007147 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007148 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007149 }
7150
Chandler Carruth45661652011-12-17 22:32:42 +00007151 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007152 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007153 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007154 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007155 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007156 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007157
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007158 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007159 }
7160
7161 if (!Args.hasArg(options::OPT_nostdlib) &&
7162 !Args.hasArg(options::OPT_nostartfiles)) {
7163 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007164 CmdArgs.push_back(
7165 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007166 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007167 CmdArgs.push_back(
7168 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007169 }
7170
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007171 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007172 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007173}
Ed Schoutene33194b2009-04-02 19:13:12 +00007174
Douglas Katzman95354292015-06-23 20:42:09 +00007175void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7176 const InputInfo &Output,
7177 const InputInfoList &Inputs,
7178 const ArgList &Args,
7179 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007180 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007181 ArgStringList CmdArgs;
7182
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007183 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007184
7185 CmdArgs.push_back("-o");
7186 CmdArgs.push_back(Output.getFilename());
7187
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007188 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007189 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007190
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007191 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007192 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007193}
7194
Douglas Katzman95354292015-06-23 20:42:09 +00007195void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7196 const InputInfo &Output,
7197 const InputInfoList &Inputs,
7198 const ArgList &Args,
7199 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007200 const Driver &D = getToolChain().getDriver();
7201 ArgStringList CmdArgs;
7202
7203 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7204 (!Args.hasArg(options::OPT_shared))) {
7205 CmdArgs.push_back("-e");
7206 CmdArgs.push_back("__start");
7207 }
7208
7209 if (Args.hasArg(options::OPT_static)) {
7210 CmdArgs.push_back("-Bstatic");
7211 } else {
7212 if (Args.hasArg(options::OPT_rdynamic))
7213 CmdArgs.push_back("-export-dynamic");
7214 CmdArgs.push_back("--eh-frame-hdr");
7215 CmdArgs.push_back("-Bdynamic");
7216 if (Args.hasArg(options::OPT_shared)) {
7217 CmdArgs.push_back("-shared");
7218 } else {
7219 CmdArgs.push_back("-dynamic-linker");
7220 CmdArgs.push_back("/usr/libexec/ld.so");
7221 }
7222 }
7223
7224 if (Output.isFilename()) {
7225 CmdArgs.push_back("-o");
7226 CmdArgs.push_back(Output.getFilename());
7227 } else {
7228 assert(Output.isNothing() && "Invalid output.");
7229 }
7230
7231 if (!Args.hasArg(options::OPT_nostdlib) &&
7232 !Args.hasArg(options::OPT_nostartfiles)) {
7233 if (!Args.hasArg(options::OPT_shared)) {
7234 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007235 CmdArgs.push_back(
7236 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007237 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007238 CmdArgs.push_back(
7239 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7240 CmdArgs.push_back(
7241 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007242 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007243 CmdArgs.push_back(
7244 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007245 }
7246 }
7247
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007248 Args.AddAllArgs(CmdArgs,
7249 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007250
7251 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7252
7253 if (!Args.hasArg(options::OPT_nostdlib) &&
7254 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007255 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007256 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7257 if (Args.hasArg(options::OPT_pg))
7258 CmdArgs.push_back("-lm_p");
7259 else
7260 CmdArgs.push_back("-lm");
7261 }
7262
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007263 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007264 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007265 CmdArgs.push_back("-lpthread_p");
7266 else
7267 CmdArgs.push_back("-lpthread");
7268 }
7269
Eli Friedman9fa28852012-08-08 23:57:20 +00007270 if (!Args.hasArg(options::OPT_shared)) {
7271 if (Args.hasArg(options::OPT_pg))
7272 CmdArgs.push_back("-lc_p");
7273 else
7274 CmdArgs.push_back("-lc");
7275 }
7276
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007277 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007278 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007279 case llvm::Triple::arm:
7280 MyArch = "arm";
7281 break;
7282 case llvm::Triple::x86:
7283 MyArch = "i386";
7284 break;
7285 case llvm::Triple::x86_64:
7286 MyArch = "amd64";
7287 break;
7288 default:
7289 llvm_unreachable("Unsupported architecture");
7290 }
7291 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007292 }
7293
7294 if (!Args.hasArg(options::OPT_nostdlib) &&
7295 !Args.hasArg(options::OPT_nostartfiles)) {
7296 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007297 CmdArgs.push_back(
7298 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007299 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007300 CmdArgs.push_back(
7301 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007302 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007303
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007304 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007305 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007306}
7307
Douglas Katzman95354292015-06-23 20:42:09 +00007308void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7309 const InputInfo &Output,
7310 const InputInfoList &Inputs,
7311 const ArgList &Args,
7312 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007313 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007314 ArgStringList CmdArgs;
7315
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007316 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7317 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007318 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007319 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007320 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007321 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007322 else if (getToolChain().getArch() == llvm::Triple::mips ||
7323 getToolChain().getArch() == llvm::Triple::mipsel ||
7324 getToolChain().getArch() == llvm::Triple::mips64 ||
7325 getToolChain().getArch() == llvm::Triple::mips64el) {
7326 StringRef CPUName;
7327 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007328 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007329
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007330 CmdArgs.push_back("-march");
7331 CmdArgs.push_back(CPUName.data());
7332
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007333 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007334 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007335
7336 if (getToolChain().getArch() == llvm::Triple::mips ||
7337 getToolChain().getArch() == llvm::Triple::mips64)
7338 CmdArgs.push_back("-EB");
7339 else
7340 CmdArgs.push_back("-EL");
7341
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007342 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007343 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007344 getToolChain().getArch() == llvm::Triple::armeb ||
7345 getToolChain().getArch() == llvm::Triple::thumb ||
7346 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00007347 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007348 const llvm::Triple &Triple = getToolChain().getTriple();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007349 arm::FloatABI ABI = arm::getARMFloatABI(D, Args, Triple);
Renato Golinf4421f72014-02-19 10:44:07 +00007350
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007351 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007352 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007353 else
Renato Golinf4421f72014-02-19 10:44:07 +00007354 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007355
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007356 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007357 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007358 case llvm::Triple::GNUEABI:
7359 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007360 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007361 break;
7362
7363 default:
7364 CmdArgs.push_back("-matpcs");
7365 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007366 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007367 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007368 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007369 if (getToolChain().getArch() == llvm::Triple::sparc)
7370 CmdArgs.push_back("-Av8plusa");
7371 else
7372 CmdArgs.push_back("-Av9a");
7373
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007374 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007375 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007376
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007377 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007378
7379 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007380 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007381
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007382 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007383 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007384
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007385 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007386 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007387}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007388
Douglas Katzman95354292015-06-23 20:42:09 +00007389void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7390 const InputInfo &Output,
7391 const InputInfoList &Inputs,
7392 const ArgList &Args,
7393 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007394 const toolchains::FreeBSD &ToolChain =
7395 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007396 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007397 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007398 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007399 !Args.hasArg(options::OPT_shared) &&
7400 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007401 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007402
7403 // Silence warning for "clang -g foo.o -o foo"
7404 Args.ClaimAllArgs(options::OPT_g_Group);
7405 // and "clang -emit-llvm foo.o -o foo"
7406 Args.ClaimAllArgs(options::OPT_emit_llvm);
7407 // and for "clang -w foo.o -o foo". Other warning options are already
7408 // handled somewhere else.
7409 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007410
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007411 if (!D.SysRoot.empty())
7412 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7413
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007414 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007415 CmdArgs.push_back("-pie");
7416
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007417 if (Args.hasArg(options::OPT_static)) {
7418 CmdArgs.push_back("-Bstatic");
7419 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007420 if (Args.hasArg(options::OPT_rdynamic))
7421 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007422 CmdArgs.push_back("--eh-frame-hdr");
7423 if (Args.hasArg(options::OPT_shared)) {
7424 CmdArgs.push_back("-Bshareable");
7425 } else {
7426 CmdArgs.push_back("-dynamic-linker");
7427 CmdArgs.push_back("/libexec/ld-elf.so.1");
7428 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007429 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007430 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7431 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7432 CmdArgs.push_back("--hash-style=both");
7433 }
7434 }
7435 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007436 }
7437
7438 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7439 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007440 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007441 CmdArgs.push_back("-m");
7442 CmdArgs.push_back("elf_i386_fbsd");
7443 }
7444
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007445 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007446 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007447 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007448 }
7449
Daniel Dunbarb440f562010-08-02 02:38:21 +00007450 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007451 CmdArgs.push_back("-o");
7452 CmdArgs.push_back(Output.getFilename());
7453 } else {
7454 assert(Output.isNothing() && "Invalid output.");
7455 }
7456
7457 if (!Args.hasArg(options::OPT_nostdlib) &&
7458 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007459 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007460 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007461 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007462 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007463 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007464 crt1 = "Scrt1.o";
7465 else
7466 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007467 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007468 if (crt1)
7469 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7470
7471 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7472
Craig Topper92fc2df2014-05-17 16:56:41 +00007473 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007474 if (Args.hasArg(options::OPT_static))
7475 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007476 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007477 crtbegin = "crtbeginS.o";
7478 else
7479 crtbegin = "crtbegin.o";
7480
7481 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007482 }
7483
7484 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007485 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007486 for (const auto &Path : Paths)
7487 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007488 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7489 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007490 Args.AddAllArgs(CmdArgs, options::OPT_s);
7491 Args.AddAllArgs(CmdArgs, options::OPT_t);
7492 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7493 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007494
Alexey Samsonov907880e2015-06-19 19:57:46 +00007495 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007496 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007497
Alexey Samsonov52550342014-09-15 19:58:40 +00007498 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007499 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007500
7501 if (!Args.hasArg(options::OPT_nostdlib) &&
7502 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007503 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007504 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007505 if (Args.hasArg(options::OPT_pg))
7506 CmdArgs.push_back("-lm_p");
7507 else
7508 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007509 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007510 if (NeedsSanitizerDeps)
7511 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007512 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7513 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007514 if (Args.hasArg(options::OPT_pg))
7515 CmdArgs.push_back("-lgcc_p");
7516 else
7517 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007518 if (Args.hasArg(options::OPT_static)) {
7519 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007520 } else if (Args.hasArg(options::OPT_pg)) {
7521 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007522 } else {
7523 CmdArgs.push_back("--as-needed");
7524 CmdArgs.push_back("-lgcc_s");
7525 CmdArgs.push_back("--no-as-needed");
7526 }
7527
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007528 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007529 if (Args.hasArg(options::OPT_pg))
7530 CmdArgs.push_back("-lpthread_p");
7531 else
7532 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007533 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007534
Roman Divacky66f22762011-02-10 16:59:40 +00007535 if (Args.hasArg(options::OPT_pg)) {
7536 if (Args.hasArg(options::OPT_shared))
7537 CmdArgs.push_back("-lc");
7538 else
7539 CmdArgs.push_back("-lc_p");
7540 CmdArgs.push_back("-lgcc_p");
7541 } else {
7542 CmdArgs.push_back("-lc");
7543 CmdArgs.push_back("-lgcc");
7544 }
7545
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007546 if (Args.hasArg(options::OPT_static)) {
7547 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007548 } else if (Args.hasArg(options::OPT_pg)) {
7549 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007550 } else {
7551 CmdArgs.push_back("--as-needed");
7552 CmdArgs.push_back("-lgcc_s");
7553 CmdArgs.push_back("--no-as-needed");
7554 }
7555 }
7556
7557 if (!Args.hasArg(options::OPT_nostdlib) &&
7558 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007559 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007560 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007561 else
7562 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007563 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007564 }
7565
Alexey Samsonov7811d192014-02-20 13:57:37 +00007566 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007567
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007568 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007569 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007570}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007571
Douglas Katzman95354292015-06-23 20:42:09 +00007572void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007573 const InputInfo &Output,
7574 const InputInfoList &Inputs,
7575 const ArgList &Args,
7576 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007577 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007578 ArgStringList CmdArgs;
7579
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007580 // GNU as needs different flags for creating the correct output format
7581 // on architectures with different ABIs or optional feature sets.
7582 switch (getToolChain().getArch()) {
7583 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007584 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007585 break;
7586 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007587 case llvm::Triple::armeb:
7588 case llvm::Triple::thumb:
7589 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007590 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007591 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7592 std::string Arch =
7593 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007594 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007595 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007596 }
7597
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007598 case llvm::Triple::mips:
7599 case llvm::Triple::mipsel:
7600 case llvm::Triple::mips64:
7601 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007602 StringRef CPUName;
7603 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007604 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007605
7606 CmdArgs.push_back("-march");
7607 CmdArgs.push_back(CPUName.data());
7608
7609 CmdArgs.push_back("-mabi");
7610 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7611
7612 if (getToolChain().getArch() == llvm::Triple::mips ||
7613 getToolChain().getArch() == llvm::Triple::mips64)
7614 CmdArgs.push_back("-EB");
7615 else
7616 CmdArgs.push_back("-EL");
7617
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007618 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007619 break;
7620 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007621
7622 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007623 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007624 CmdArgs.push_back("-32");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007625 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007626 break;
7627
7628 case llvm::Triple::sparcv9:
7629 CmdArgs.push_back("-64");
7630 CmdArgs.push_back("-Av9");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007631 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007632 break;
7633
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007634 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007635 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007636 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007637
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007638 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007639
7640 CmdArgs.push_back("-o");
7641 CmdArgs.push_back(Output.getFilename());
7642
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007643 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007644 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007645
David Chisnallddbd68f2011-09-27 22:03:18 +00007646 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007647 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007648}
7649
Douglas Katzman95354292015-06-23 20:42:09 +00007650void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7651 const InputInfo &Output,
7652 const InputInfoList &Inputs,
7653 const ArgList &Args,
7654 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007655 const Driver &D = getToolChain().getDriver();
7656 ArgStringList CmdArgs;
7657
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007658 if (!D.SysRoot.empty())
7659 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7660
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007661 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007662 if (Args.hasArg(options::OPT_static)) {
7663 CmdArgs.push_back("-Bstatic");
7664 } else {
7665 if (Args.hasArg(options::OPT_rdynamic))
7666 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007667 if (Args.hasArg(options::OPT_shared)) {
7668 CmdArgs.push_back("-Bshareable");
7669 } else {
7670 CmdArgs.push_back("-dynamic-linker");
7671 CmdArgs.push_back("/libexec/ld.elf_so");
7672 }
7673 }
7674
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007675 // Many NetBSD architectures support more than one ABI.
7676 // Determine the correct emulation for ld.
7677 switch (getToolChain().getArch()) {
7678 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007679 CmdArgs.push_back("-m");
7680 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007681 break;
7682 case llvm::Triple::arm:
7683 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007684 CmdArgs.push_back("-m");
7685 switch (getToolChain().getTriple().getEnvironment()) {
7686 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007687 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007688 CmdArgs.push_back("armelf_nbsd_eabi");
7689 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007690 case llvm::Triple::EABIHF:
7691 case llvm::Triple::GNUEABIHF:
7692 CmdArgs.push_back("armelf_nbsd_eabihf");
7693 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007694 default:
7695 CmdArgs.push_back("armelf_nbsd");
7696 break;
7697 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007698 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007699 case llvm::Triple::armeb:
7700 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007701 arm::appendEBLinkFlags(
7702 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007703 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007704 CmdArgs.push_back("-m");
7705 switch (getToolChain().getTriple().getEnvironment()) {
7706 case llvm::Triple::EABI:
7707 case llvm::Triple::GNUEABI:
7708 CmdArgs.push_back("armelfb_nbsd_eabi");
7709 break;
7710 case llvm::Triple::EABIHF:
7711 case llvm::Triple::GNUEABIHF:
7712 CmdArgs.push_back("armelfb_nbsd_eabihf");
7713 break;
7714 default:
7715 CmdArgs.push_back("armelfb_nbsd");
7716 break;
7717 }
7718 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007719 case llvm::Triple::mips64:
7720 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007721 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007722 CmdArgs.push_back("-m");
7723 if (getToolChain().getArch() == llvm::Triple::mips64)
7724 CmdArgs.push_back("elf32btsmip");
7725 else
7726 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007727 } else if (mips::hasMipsAbiArg(Args, "64")) {
7728 CmdArgs.push_back("-m");
7729 if (getToolChain().getArch() == llvm::Triple::mips64)
7730 CmdArgs.push_back("elf64btsmip");
7731 else
7732 CmdArgs.push_back("elf64ltsmip");
7733 }
7734 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007735 case llvm::Triple::ppc:
7736 CmdArgs.push_back("-m");
7737 CmdArgs.push_back("elf32ppc_nbsd");
7738 break;
7739
7740 case llvm::Triple::ppc64:
7741 case llvm::Triple::ppc64le:
7742 CmdArgs.push_back("-m");
7743 CmdArgs.push_back("elf64ppc");
7744 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007745
7746 case llvm::Triple::sparc:
7747 CmdArgs.push_back("-m");
7748 CmdArgs.push_back("elf32_sparc");
7749 break;
7750
7751 case llvm::Triple::sparcv9:
7752 CmdArgs.push_back("-m");
7753 CmdArgs.push_back("elf64_sparc");
7754 break;
7755
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007756 default:
7757 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007758 }
7759
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007760 if (Output.isFilename()) {
7761 CmdArgs.push_back("-o");
7762 CmdArgs.push_back(Output.getFilename());
7763 } else {
7764 assert(Output.isNothing() && "Invalid output.");
7765 }
7766
7767 if (!Args.hasArg(options::OPT_nostdlib) &&
7768 !Args.hasArg(options::OPT_nostartfiles)) {
7769 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007770 CmdArgs.push_back(
7771 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7772 CmdArgs.push_back(
7773 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7774 CmdArgs.push_back(
7775 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007776 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007777 CmdArgs.push_back(
7778 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7779 CmdArgs.push_back(
7780 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007781 }
7782 }
7783
7784 Args.AddAllArgs(CmdArgs, options::OPT_L);
7785 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7786 Args.AddAllArgs(CmdArgs, options::OPT_e);
7787 Args.AddAllArgs(CmdArgs, options::OPT_s);
7788 Args.AddAllArgs(CmdArgs, options::OPT_t);
7789 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7790 Args.AddAllArgs(CmdArgs, options::OPT_r);
7791
7792 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7793
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007794 unsigned Major, Minor, Micro;
7795 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7796 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007797 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007798 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007799 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007800 case llvm::Triple::arm:
7801 case llvm::Triple::armeb:
7802 case llvm::Triple::thumb:
7803 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007804 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007805 case llvm::Triple::ppc64:
7806 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007807 case llvm::Triple::x86:
7808 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007809 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007810 break;
7811 default:
7812 break;
7813 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007814 }
7815
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007816 if (!Args.hasArg(options::OPT_nostdlib) &&
7817 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007818 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007819 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7820 CmdArgs.push_back("-lm");
7821 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007822 if (Args.hasArg(options::OPT_pthread))
7823 CmdArgs.push_back("-lpthread");
7824 CmdArgs.push_back("-lc");
7825
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007826 if (useLibgcc) {
7827 if (Args.hasArg(options::OPT_static)) {
7828 // libgcc_eh depends on libc, so resolve as much as possible,
7829 // pull in any new requirements from libc and then get the rest
7830 // of libgcc.
7831 CmdArgs.push_back("-lgcc_eh");
7832 CmdArgs.push_back("-lc");
7833 CmdArgs.push_back("-lgcc");
7834 } else {
7835 CmdArgs.push_back("-lgcc");
7836 CmdArgs.push_back("--as-needed");
7837 CmdArgs.push_back("-lgcc_s");
7838 CmdArgs.push_back("--no-as-needed");
7839 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007840 }
7841 }
7842
7843 if (!Args.hasArg(options::OPT_nostdlib) &&
7844 !Args.hasArg(options::OPT_nostartfiles)) {
7845 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007846 CmdArgs.push_back(
7847 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007848 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007849 CmdArgs.push_back(
7850 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7851 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007852 }
7853
Alexey Samsonov7811d192014-02-20 13:57:37 +00007854 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007855
Logan Chieneb9162f2014-06-26 14:23:45 +00007856 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007857 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007858}
7859
Douglas Katzman95354292015-06-23 20:42:09 +00007860void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7861 const InputInfo &Output,
7862 const InputInfoList &Inputs,
7863 const ArgList &Args,
7864 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007865 claimNoWarnArgs(Args);
7866
James Y Knight2db38f32015-08-15 03:45:25 +00007867 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
7868 llvm::Triple Triple = llvm::Triple(TripleStr);
7869
Rafael Espindola92b00932010-08-10 00:25:48 +00007870 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007871 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007872
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007873 llvm::Reloc::Model RelocationModel;
7874 unsigned PICLevel;
7875 bool IsPIE;
7876 std::tie(RelocationModel, PICLevel, IsPIE) =
7877 ParsePICArgs(getToolChain(), Triple, Args);
7878
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007879 switch (getToolChain().getArch()) {
7880 default:
7881 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007882 // Add --32/--64 to make sure we get the format we want.
7883 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007884 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007885 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007886 break;
7887 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007888 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7889 CmdArgs.push_back("--x32");
7890 else
7891 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007892 break;
7893 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007894 CmdArgs.push_back("-a32");
7895 CmdArgs.push_back("-mppc");
7896 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007897 break;
7898 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007899 CmdArgs.push_back("-a64");
7900 CmdArgs.push_back("-mppc64");
7901 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007902 break;
7903 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007904 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007905 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007906 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007907 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007908 break;
7909 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007910 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007911 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007912 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007913 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007914 break;
7915 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007916 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007917 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007918 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007919 break;
7920 case llvm::Triple::arm:
7921 case llvm::Triple::armeb:
7922 case llvm::Triple::thumb:
7923 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00007924 const llvm::Triple &Triple2 = getToolChain().getTriple();
7925 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00007926 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007927 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007928 break;
7929 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007930 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007931 break;
7932 default:
7933 break;
7934 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007935
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007936 switch (arm::getARMFloatABI(getToolChain().getDriver(), Args, Triple)) {
7937 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
7938 case arm::FloatABI::Soft:
7939 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
7940 break;
7941 case arm::FloatABI::SoftFP:
7942 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
7943 break;
7944 case arm::FloatABI::Hard:
7945 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
7946 break;
7947 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007948
7949 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007950
7951 // FIXME: remove krait check when GNU tools support krait cpu
7952 // for now replace it with -march=armv7-a to avoid a lower
7953 // march from being picked in the absence of a cpu flag.
7954 Arg *A;
7955 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007956 StringRef(A->getValue()).lower() == "krait")
7957 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00007958 else
7959 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007960 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007961 break;
7962 }
7963 case llvm::Triple::mips:
7964 case llvm::Triple::mipsel:
7965 case llvm::Triple::mips64:
7966 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007967 StringRef CPUName;
7968 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007969 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007970 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007971
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007972 CmdArgs.push_back("-march");
7973 CmdArgs.push_back(CPUName.data());
7974
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007975 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007976 CmdArgs.push_back(ABIName.data());
7977
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007978 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7979 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007980 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007981 CmdArgs.push_back("-mno-shared");
7982
Daniel Sanders379d44b2014-07-16 11:52:23 +00007983 // LLVM doesn't support -mplt yet and acts as if it is always given.
7984 // However, -mplt has no effect with the N64 ABI.
7985 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007986
7987 if (getToolChain().getArch() == llvm::Triple::mips ||
7988 getToolChain().getArch() == llvm::Triple::mips64)
7989 CmdArgs.push_back("-EB");
7990 else
7991 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007992
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007993 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7994 if (StringRef(A->getValue()) == "2008")
7995 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7996 }
7997
Daniel Sanders379d44b2014-07-16 11:52:23 +00007998 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
Toma Tabacu94ea6862015-06-16 13:54:13 +00007999 StringRef MIPSFloatABI = getMipsFloatABI(getToolChain().getDriver(), Args);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008000 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8001 options::OPT_mfp64)) {
8002 A->claim();
8003 A->render(Args, CmdArgs);
Toma Tabacu94ea6862015-06-16 13:54:13 +00008004 } else if (mips::shouldUseFPXX(Args, getToolChain().getTriple(), CPUName,
8005 ABIName, MIPSFloatABI))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008006 CmdArgs.push_back("-mfpxx");
8007
8008 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8009 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008010 if (Arg *A =
8011 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008012 if (A->getOption().matches(options::OPT_mips16)) {
8013 A->claim();
8014 A->render(Args, CmdArgs);
8015 } else {
8016 A->claim();
8017 CmdArgs.push_back("-no-mips16");
8018 }
8019 }
8020
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008021 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8022 options::OPT_mno_micromips);
8023 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8024 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8025
Simon Atanasyanbd986632013-11-26 11:58:04 +00008026 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8027 // Do not use AddLastArg because not all versions of MIPS assembler
8028 // support -mmsa / -mno-msa options.
8029 if (A->getOption().matches(options::OPT_mmsa))
8030 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8031 }
8032
Daniel Sanders379d44b2014-07-16 11:52:23 +00008033 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8034 options::OPT_msoft_float);
8035
Toma Tabacub36d6102015-06-11 12:13:18 +00008036 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8037 options::OPT_msingle_float);
8038
Daniel Sanders379d44b2014-07-16 11:52:23 +00008039 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8040 options::OPT_mno_odd_spreg);
8041
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008042 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008043 break;
8044 }
8045 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008046 // Always pass an -march option, since our default of z10 is later
8047 // than the GNU assembler's default.
8048 StringRef CPUName = getSystemZTargetCPU(Args);
8049 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008050 break;
8051 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008052 }
8053
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008054 if (NeedsKPIC) {
8055 if (RelocationModel != llvm::Reloc::Static)
8056 CmdArgs.push_back("-KPIC");
8057 }
Rafael Espindola92b00932010-08-10 00:25:48 +00008058
Renato Golina74bbc72015-07-22 15:32:36 +00008059 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008060 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008061
8062 CmdArgs.push_back("-o");
8063 CmdArgs.push_back(Output.getFilename());
8064
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008065 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008066 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008067
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008068 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008069 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008070
8071 // Handle the debug info splitting at object creation time if we're
8072 // creating an object.
8073 // TODO: Currently only works on linux with newer objcopy.
8074 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008075 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008076 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008077 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008078}
8079
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008080static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008081 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00008082 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Reid Kleckner0213a472015-07-22 16:01:38 +00008083 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008084 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8085 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008086 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008087 CmdArgs.push_back("-lgcc");
8088
Logan Chien3d3373c2012-11-19 12:04:11 +00008089 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008090 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008091 CmdArgs.push_back("-lgcc");
8092 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008093 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008094 CmdArgs.push_back("--as-needed");
8095 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008096 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008097 CmdArgs.push_back("--no-as-needed");
8098 }
8099
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008100 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008101 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008102 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008103 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008104
8105 // According to Android ABI, we have to link with libdl if we are
8106 // linking with non-static libgcc.
8107 //
8108 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8109 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8110 if (isAndroid && !StaticLibgcc)
8111 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008112}
8113
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008114static std::string getLinuxDynamicLinker(const ArgList &Args,
8115 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008116 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8117
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008118 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
8119 if (ToolChain.getTriple().isArch64Bit())
8120 return "/system/bin/linker64";
8121 else
8122 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008123 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8124 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008125 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008126 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008127 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008128 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008129 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008130 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008131 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008132 arm::getARMFloatABI(ToolChain.getDriver(), Args,
8133 ToolChain.getTriple()) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008134 return "/lib/ld-linux-armhf.so.3";
8135 else
8136 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008137 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8138 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008139 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008140 arm::getARMFloatABI(ToolChain.getDriver(), Args,
8141 ToolChain.getTriple()) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008142 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008143 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008144 return "/lib/ld-linux.so.3";
8145 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8146 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008147 StringRef CPUName;
8148 StringRef ABIName;
8149 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
8150 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
8151
8152 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
8153 .Case("o32", "/lib")
8154 .Case("n32", "/lib32")
8155 .Case("n64", "/lib64")
8156 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008157 StringRef LibName;
8158 if (mips::isUCLibc(Args))
8159 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
8160 else
8161 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008162
8163 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008164 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008165 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008166 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008167 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8168 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008169 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008170 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008171 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8172 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008173 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008174 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008175 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008176 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008177 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008178 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008179 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8180 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008181 else
8182 return "/lib64/ld-linux-x86-64.so.2";
8183}
8184
Renato Golinc4b49242014-02-13 10:01:16 +00008185static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008186 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008187 // Make use of compiler-rt if --rtlib option is used
8188 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8189
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008190 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008191 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008192 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008193 default:
8194 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008195 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008196 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008197 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008198 break;
8199 }
Renato Golinc4b49242014-02-13 10:01:16 +00008200 break;
8201 case ToolChain::RLT_Libgcc:
8202 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8203 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008204 }
8205}
8206
Rafael Espindola1e085772014-08-15 17:14:35 +00008207static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8208 switch (T.getArch()) {
8209 case llvm::Triple::x86:
8210 return "elf_i386";
8211 case llvm::Triple::aarch64:
8212 return "aarch64linux";
8213 case llvm::Triple::aarch64_be:
8214 return "aarch64_be_linux";
8215 case llvm::Triple::arm:
8216 case llvm::Triple::thumb:
8217 return "armelf_linux_eabi";
8218 case llvm::Triple::armeb:
8219 case llvm::Triple::thumbeb:
8220 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8221 case llvm::Triple::ppc:
8222 return "elf32ppclinux";
8223 case llvm::Triple::ppc64:
8224 return "elf64ppc";
8225 case llvm::Triple::ppc64le:
8226 return "elf64lppc";
8227 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008228 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008229 return "elf32_sparc";
8230 case llvm::Triple::sparcv9:
8231 return "elf64_sparc";
8232 case llvm::Triple::mips:
8233 return "elf32btsmip";
8234 case llvm::Triple::mipsel:
8235 return "elf32ltsmip";
8236 case llvm::Triple::mips64:
8237 if (mips::hasMipsAbiArg(Args, "n32"))
8238 return "elf32btsmipn32";
8239 return "elf64btsmip";
8240 case llvm::Triple::mips64el:
8241 if (mips::hasMipsAbiArg(Args, "n32"))
8242 return "elf32ltsmipn32";
8243 return "elf64ltsmip";
8244 case llvm::Triple::systemz:
8245 return "elf64_s390";
8246 case llvm::Triple::x86_64:
8247 if (T.getEnvironment() == llvm::Triple::GNUX32)
8248 return "elf32_x86_64";
8249 return "elf_x86_64";
8250 default:
8251 llvm_unreachable("Unexpected arch");
8252 }
8253}
8254
Douglas Katzman95354292015-06-23 20:42:09 +00008255void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8256 const InputInfo &Output,
8257 const InputInfoList &Inputs,
8258 const ArgList &Args,
8259 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008260 const toolchains::Linux &ToolChain =
8261 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008262 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008263
8264 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8265 llvm::Triple Triple = llvm::Triple(TripleStr);
8266
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008267 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008268 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008269 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008270 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008271 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8272 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008273
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008274 ArgStringList CmdArgs;
8275
Rafael Espindolad1002f62010-11-15 18:28:16 +00008276 // Silence warning for "clang -g foo.o -o foo"
8277 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008278 // and "clang -emit-llvm foo.o -o foo"
8279 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008280 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008281 // handled somewhere else.
8282 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008283
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008284 if (!D.SysRoot.empty())
8285 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008286
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008287 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008288 CmdArgs.push_back("-pie");
8289
Rafael Espindola1c76c592010-11-07 22:57:16 +00008290 if (Args.hasArg(options::OPT_rdynamic))
8291 CmdArgs.push_back("-export-dynamic");
8292
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008293 if (Args.hasArg(options::OPT_s))
8294 CmdArgs.push_back("-s");
8295
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008296 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008297 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008298
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008299 for (const auto &Opt : ToolChain.ExtraOpts)
8300 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008301
8302 if (!Args.hasArg(options::OPT_static)) {
8303 CmdArgs.push_back("--eh-frame-hdr");
8304 }
8305
8306 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008307 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008308
8309 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008310 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8311 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008312 CmdArgs.push_back("-Bstatic");
8313 else
8314 CmdArgs.push_back("-static");
8315 } else if (Args.hasArg(options::OPT_shared)) {
8316 CmdArgs.push_back("-shared");
8317 }
8318
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008319 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8320 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008321 (!Args.hasArg(options::OPT_static) &&
8322 !Args.hasArg(options::OPT_shared))) {
8323 CmdArgs.push_back("-dynamic-linker");
8324 CmdArgs.push_back(Args.MakeArgString(
8325 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8326 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008327
8328 CmdArgs.push_back("-o");
8329 CmdArgs.push_back(Output.getFilename());
8330
Rafael Espindola81937ec2010-12-01 01:52:43 +00008331 if (!Args.hasArg(options::OPT_nostdlib) &&
8332 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008333 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008334 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008335 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008336 if (Args.hasArg(options::OPT_pg))
8337 crt1 = "gcrt1.o";
8338 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008339 crt1 = "Scrt1.o";
8340 else
8341 crt1 = "crt1.o";
8342 }
8343 if (crt1)
8344 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008345
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008346 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8347 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008348
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008349 const char *crtbegin;
8350 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008351 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008352 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008353 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008354 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008355 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008356 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008357 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008358 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008359
8360 // Add crtfastmath.o if available and fast math is enabled.
8361 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008362 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008363
8364 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008365 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008366
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008367 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008368
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008369 for (const auto &Path : Paths)
8370 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008371
Alexey Samsonov907880e2015-06-19 19:57:46 +00008372 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008373 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008374
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008375 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8376 CmdArgs.push_back("--no-demangle");
8377
Alexey Samsonov52550342014-09-15 19:58:40 +00008378 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008379 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008380 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008381 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008382
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008383 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008384 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008385 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008386 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008387 if (OnlyLibstdcxxStatic)
8388 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008389 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008390 if (OnlyLibstdcxxStatic)
8391 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008392 CmdArgs.push_back("-lm");
8393 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008394 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8395 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008396
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008397 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008398 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8399 if (Args.hasArg(options::OPT_static))
8400 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008401
Alexey Samsonov52550342014-09-15 19:58:40 +00008402 if (NeedsSanitizerDeps)
8403 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8404
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008405 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8406 Args.hasArg(options::OPT_pthreads);
8407
8408 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8409 options::OPT_fno_openmp, false)) {
8410 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8411 // FIXME: Does this really make sense for all GNU toolchains?
8412 WantPthread = true;
8413
8414 // Also link the particular OpenMP runtimes.
8415 switch (getOpenMPRuntime(ToolChain, Args)) {
8416 case OMPRT_OMP:
8417 CmdArgs.push_back("-lomp");
8418 break;
8419 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008420 CmdArgs.push_back("-lgomp");
8421
8422 // FIXME: Exclude this for platforms with libgomp that don't require
8423 // librt. Most modern Linux platforms require it, but some may not.
8424 CmdArgs.push_back("-lrt");
8425 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008426 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008427 CmdArgs.push_back("-liomp5");
8428 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008429 case OMPRT_Unknown:
8430 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008431 break;
8432 }
Chandler Carruth01538002013-01-17 13:19:29 +00008433 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008434
Renato Golinc4b49242014-02-13 10:01:16 +00008435 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008436
Richard Smith31d1de22015-05-20 22:48:44 +00008437 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008438 CmdArgs.push_back("-lpthread");
8439
8440 CmdArgs.push_back("-lc");
8441
8442 if (Args.hasArg(options::OPT_static))
8443 CmdArgs.push_back("--end-group");
8444 else
Renato Golinc4b49242014-02-13 10:01:16 +00008445 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008446 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008447
Rafael Espindola81937ec2010-12-01 01:52:43 +00008448 if (!Args.hasArg(options::OPT_nostartfiles)) {
8449 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008450 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008451 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008452 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008453 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008454 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008455 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008456
Rafael Espindola81937ec2010-12-01 01:52:43 +00008457 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008458 if (!isAndroid)
8459 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008460 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008461 }
8462
Justin Bognerd3371d82015-07-17 03:35:54 +00008463 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8464 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008465}
8466
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008467// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8468// for the various SFI requirements like register masking. The assembly tool
8469// inserts the file containing the macros as an input into all the assembly
8470// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008471void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8472 const InputInfo &Output,
8473 const InputInfoList &Inputs,
8474 const ArgList &Args,
8475 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008476 const toolchains::NaClToolChain &ToolChain =
8477 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008478 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8479 "nacl-arm-macros.s");
8480 InputInfoList NewInputs;
8481 NewInputs.push_back(NaClMacros);
8482 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008483 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8484 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008485}
8486
Douglas Katzman750cfc52015-06-29 18:42:16 +00008487// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008488// we use static by default, do not yet support sanitizers or LTO, and a few
8489// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008490// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008491void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8492 const InputInfo &Output,
8493 const InputInfoList &Inputs,
8494 const ArgList &Args,
8495 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008496
Douglas Katzman54366072015-07-27 16:53:08 +00008497 const toolchains::NaClToolChain &ToolChain =
8498 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008499 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008500 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008501 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008502 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008503
8504 ArgStringList CmdArgs;
8505
8506 // Silence warning for "clang -g foo.o -o foo"
8507 Args.ClaimAllArgs(options::OPT_g_Group);
8508 // and "clang -emit-llvm foo.o -o foo"
8509 Args.ClaimAllArgs(options::OPT_emit_llvm);
8510 // and for "clang -w foo.o -o foo". Other warning options are already
8511 // handled somewhere else.
8512 Args.ClaimAllArgs(options::OPT_w);
8513
8514 if (!D.SysRoot.empty())
8515 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8516
8517 if (Args.hasArg(options::OPT_rdynamic))
8518 CmdArgs.push_back("-export-dynamic");
8519
8520 if (Args.hasArg(options::OPT_s))
8521 CmdArgs.push_back("-s");
8522
Douglas Katzman54366072015-07-27 16:53:08 +00008523 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8524 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008525 CmdArgs.push_back("--build-id");
8526
8527 if (!IsStatic)
8528 CmdArgs.push_back("--eh-frame-hdr");
8529
8530 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008531 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008532 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008533 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008534 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008535 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008536 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008537 else if (Arch == llvm::Triple::mipsel)
8538 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008539 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008540 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8541 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008542
8543 if (IsStatic)
8544 CmdArgs.push_back("-static");
8545 else if (Args.hasArg(options::OPT_shared))
8546 CmdArgs.push_back("-shared");
8547
8548 CmdArgs.push_back("-o");
8549 CmdArgs.push_back(Output.getFilename());
8550 if (!Args.hasArg(options::OPT_nostdlib) &&
8551 !Args.hasArg(options::OPT_nostartfiles)) {
8552 if (!Args.hasArg(options::OPT_shared))
8553 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8554 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8555
8556 const char *crtbegin;
8557 if (IsStatic)
8558 crtbegin = "crtbeginT.o";
8559 else if (Args.hasArg(options::OPT_shared))
8560 crtbegin = "crtbeginS.o";
8561 else
8562 crtbegin = "crtbegin.o";
8563 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8564 }
8565
8566 Args.AddAllArgs(CmdArgs, options::OPT_L);
8567 Args.AddAllArgs(CmdArgs, options::OPT_u);
8568
8569 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8570
8571 for (const auto &Path : Paths)
8572 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8573
8574 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8575 CmdArgs.push_back("--no-demangle");
8576
8577 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8578
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008579 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008580 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008581 bool OnlyLibstdcxxStatic =
8582 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008583 if (OnlyLibstdcxxStatic)
8584 CmdArgs.push_back("-Bstatic");
8585 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8586 if (OnlyLibstdcxxStatic)
8587 CmdArgs.push_back("-Bdynamic");
8588 CmdArgs.push_back("-lm");
8589 }
8590
8591 if (!Args.hasArg(options::OPT_nostdlib)) {
8592 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8593 // Always use groups, since it has no effect on dynamic libraries.
8594 CmdArgs.push_back("--start-group");
8595 CmdArgs.push_back("-lc");
8596 // NaCl's libc++ currently requires libpthread, so just always include it
8597 // in the group for C++.
8598 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008599 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008600 // Gold, used by Mips, handles nested groups differently than ld, and
8601 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8602 // which is not a desired behaviour here.
8603 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8604 if (getToolChain().getArch() == llvm::Triple::mipsel)
8605 CmdArgs.push_back("-lnacl");
8606
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008607 CmdArgs.push_back("-lpthread");
8608 }
8609
8610 CmdArgs.push_back("-lgcc");
8611 CmdArgs.push_back("--as-needed");
8612 if (IsStatic)
8613 CmdArgs.push_back("-lgcc_eh");
8614 else
8615 CmdArgs.push_back("-lgcc_s");
8616 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008617
8618 // Mips needs to create and use pnacl_legacy library that contains
8619 // definitions from bitcode/pnaclmm.c and definitions for
8620 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8621 if (getToolChain().getArch() == llvm::Triple::mipsel)
8622 CmdArgs.push_back("-lpnacl_legacy");
8623
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008624 CmdArgs.push_back("--end-group");
8625 }
8626
8627 if (!Args.hasArg(options::OPT_nostartfiles)) {
8628 const char *crtend;
8629 if (Args.hasArg(options::OPT_shared))
8630 crtend = "crtendS.o";
8631 else
8632 crtend = "crtend.o";
8633
8634 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8635 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8636 }
8637 }
8638
Justin Bognerd3371d82015-07-17 03:35:54 +00008639 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8640 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008641}
8642
Douglas Katzman95354292015-06-23 20:42:09 +00008643void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8644 const InputInfo &Output,
8645 const InputInfoList &Inputs,
8646 const ArgList &Args,
8647 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008648 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008649 ArgStringList CmdArgs;
8650
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008651 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008652
8653 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008654 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008655
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008656 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008657 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008658
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008659 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008660 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008661}
8662
Douglas Katzman95354292015-06-23 20:42:09 +00008663void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8664 const InputInfo &Output,
8665 const InputInfoList &Inputs,
8666 const ArgList &Args,
8667 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008668 const Driver &D = getToolChain().getDriver();
8669 ArgStringList CmdArgs;
8670
Daniel Dunbarb440f562010-08-02 02:38:21 +00008671 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008672 CmdArgs.push_back("-o");
8673 CmdArgs.push_back(Output.getFilename());
8674 } else {
8675 assert(Output.isNothing() && "Invalid output.");
8676 }
8677
8678 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008679 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008680 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8681 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8682 CmdArgs.push_back(
8683 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8684 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008685 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008686
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008687 Args.AddAllArgs(CmdArgs,
8688 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008689
Daniel Dunbar54423b22010-09-17 00:24:54 +00008690 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008691
Alexey Samsonov7811d192014-02-20 13:57:37 +00008692 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008693
Chris Lattner3e2ee142010-07-07 16:01:42 +00008694 if (!Args.hasArg(options::OPT_nostdlib) &&
8695 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008696 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008697 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008698 CmdArgs.push_back("-lm");
8699 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008700 }
8701
8702 if (!Args.hasArg(options::OPT_nostdlib) &&
8703 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008704 if (Args.hasArg(options::OPT_pthread))
8705 CmdArgs.push_back("-lpthread");
8706 CmdArgs.push_back("-lc");
8707 CmdArgs.push_back("-lCompilerRT-Generic");
8708 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8709 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008710 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008711 }
8712
Logan Chieneb9162f2014-06-26 14:23:45 +00008713 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008714 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008715}
8716
Daniel Dunbarcc912342009-05-02 18:28:39 +00008717/// DragonFly Tools
8718
8719// For now, DragonFly Assemble does just about the same as for
8720// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008721void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8722 const InputInfo &Output,
8723 const InputInfoList &Inputs,
8724 const ArgList &Args,
8725 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008726 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008727 ArgStringList CmdArgs;
8728
8729 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8730 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008731 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008732 CmdArgs.push_back("--32");
8733
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008734 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008735
8736 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008737 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008738
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008739 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008740 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008741
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008742 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008743 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008744}
8745
Douglas Katzman95354292015-06-23 20:42:09 +00008746void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8747 const InputInfo &Output,
8748 const InputInfoList &Inputs,
8749 const ArgList &Args,
8750 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008751 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008752 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008753 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008754
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008755 if (!D.SysRoot.empty())
8756 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8757
John McCall65b8da02013-04-11 22:55:55 +00008758 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008759 if (Args.hasArg(options::OPT_static)) {
8760 CmdArgs.push_back("-Bstatic");
8761 } else {
John McCall65b8da02013-04-11 22:55:55 +00008762 if (Args.hasArg(options::OPT_rdynamic))
8763 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008764 if (Args.hasArg(options::OPT_shared))
8765 CmdArgs.push_back("-Bshareable");
8766 else {
8767 CmdArgs.push_back("-dynamic-linker");
8768 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8769 }
John McCall65b8da02013-04-11 22:55:55 +00008770 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008771 }
8772
8773 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8774 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008775 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008776 CmdArgs.push_back("-m");
8777 CmdArgs.push_back("elf_i386");
8778 }
8779
Daniel Dunbarb440f562010-08-02 02:38:21 +00008780 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008781 CmdArgs.push_back("-o");
8782 CmdArgs.push_back(Output.getFilename());
8783 } else {
8784 assert(Output.isNothing() && "Invalid output.");
8785 }
8786
8787 if (!Args.hasArg(options::OPT_nostdlib) &&
8788 !Args.hasArg(options::OPT_nostartfiles)) {
8789 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008790 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008791 CmdArgs.push_back(
8792 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008793 else {
8794 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008795 CmdArgs.push_back(
8796 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008797 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008798 CmdArgs.push_back(
8799 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008800 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008801 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008802 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008803 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008804 CmdArgs.push_back(
8805 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008806 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008807 CmdArgs.push_back(
8808 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008809 }
8810
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008811 Args.AddAllArgs(CmdArgs,
8812 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00008813
Daniel Dunbar54423b22010-09-17 00:24:54 +00008814 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008815
8816 if (!Args.hasArg(options::OPT_nostdlib) &&
8817 !Args.hasArg(options::OPT_nodefaultlibs)) {
8818 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8819 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008820 if (UseGCC47)
8821 CmdArgs.push_back("-L/usr/lib/gcc47");
8822 else
8823 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008824
8825 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008826 if (UseGCC47) {
8827 CmdArgs.push_back("-rpath");
8828 CmdArgs.push_back("/usr/lib/gcc47");
8829 } else {
8830 CmdArgs.push_back("-rpath");
8831 CmdArgs.push_back("/usr/lib/gcc44");
8832 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008833 }
8834
Hans Wennborg70850d82013-07-18 20:29:38 +00008835 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008836 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008837 CmdArgs.push_back("-lm");
8838 }
8839
Daniel Dunbarcc912342009-05-02 18:28:39 +00008840 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008841 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008842
8843 if (!Args.hasArg(options::OPT_nolibc)) {
8844 CmdArgs.push_back("-lc");
8845 }
8846
John McCall65b8da02013-04-11 22:55:55 +00008847 if (UseGCC47) {
8848 if (Args.hasArg(options::OPT_static) ||
8849 Args.hasArg(options::OPT_static_libgcc)) {
8850 CmdArgs.push_back("-lgcc");
8851 CmdArgs.push_back("-lgcc_eh");
8852 } else {
8853 if (Args.hasArg(options::OPT_shared_libgcc)) {
8854 CmdArgs.push_back("-lgcc_pic");
8855 if (!Args.hasArg(options::OPT_shared))
8856 CmdArgs.push_back("-lgcc");
8857 } else {
8858 CmdArgs.push_back("-lgcc");
8859 CmdArgs.push_back("--as-needed");
8860 CmdArgs.push_back("-lgcc_pic");
8861 CmdArgs.push_back("--no-as-needed");
8862 }
8863 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008864 } else {
John McCall65b8da02013-04-11 22:55:55 +00008865 if (Args.hasArg(options::OPT_shared)) {
8866 CmdArgs.push_back("-lgcc_pic");
8867 } else {
8868 CmdArgs.push_back("-lgcc");
8869 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008870 }
8871 }
8872
8873 if (!Args.hasArg(options::OPT_nostdlib) &&
8874 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008875 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008876 CmdArgs.push_back(
8877 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008878 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008879 CmdArgs.push_back(
8880 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8881 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008882 }
8883
Alexey Samsonov7811d192014-02-20 13:57:37 +00008884 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008885
Logan Chieneb9162f2014-06-26 14:23:45 +00008886 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008887 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008888}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008889
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008890// Try to find Exe from a Visual Studio distribution. This first tries to find
8891// an installed copy of Visual Studio and, failing that, looks in the PATH,
8892// making sure that whatever executable that's found is not a same-named exe
8893// from clang itself to prevent clang from falling back to itself.
8894static std::string FindVisualStudioExecutable(const ToolChain &TC,
8895 const char *Exe,
8896 const char *ClangProgramPath) {
8897 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8898 std::string visualStudioBinDir;
8899 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8900 visualStudioBinDir)) {
8901 SmallString<128> FilePath(visualStudioBinDir);
8902 llvm::sys::path::append(FilePath, Exe);
8903 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8904 return FilePath.str();
8905 }
8906
8907 return Exe;
8908}
8909
Douglas Katzman95354292015-06-23 20:42:09 +00008910void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8911 const InputInfo &Output,
8912 const InputInfoList &Inputs,
8913 const ArgList &Args,
8914 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008915 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008916 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008917
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008918 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8919 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008920 CmdArgs.push_back(
8921 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008922
8923 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008924 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008925 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008926
Zachary Turner10d75b22014-10-22 20:40:43 +00008927 if (!llvm::sys::Process::GetEnv("LIB")) {
8928 // If the VC environment hasn't been configured (perhaps because the user
8929 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008930 // the environment variable is set however, assume the user knows what
8931 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008932 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008933 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008934 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8935 SmallString<128> LibDir(VisualStudioDir);
8936 llvm::sys::path::append(LibDir, "VC", "lib");
8937 switch (MSVC.getArch()) {
8938 case llvm::Triple::x86:
8939 // x86 just puts the libraries directly in lib
8940 break;
8941 case llvm::Triple::x86_64:
8942 llvm::sys::path::append(LibDir, "amd64");
8943 break;
8944 case llvm::Triple::arm:
8945 llvm::sys::path::append(LibDir, "arm");
8946 break;
8947 default:
8948 break;
8949 }
8950 CmdArgs.push_back(
8951 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00008952
8953 if (MSVC.useUniversalCRT(VisualStudioDir)) {
8954 std::string UniversalCRTLibPath;
8955 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
8956 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8957 UniversalCRTLibPath.c_str()));
8958 }
Zachary Turner10d75b22014-10-22 20:40:43 +00008959 }
8960
8961 std::string WindowsSdkLibPath;
8962 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8963 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8964 WindowsSdkLibPath.c_str()));
8965 }
8966
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008967 CmdArgs.push_back("-nologo");
8968
Reid Kleckner124955a2015-08-05 18:51:13 +00008969 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008970 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008971
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008972 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00008973 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008974 if (DLL) {
8975 CmdArgs.push_back(Args.MakeArgString("-dll"));
8976
8977 SmallString<128> ImplibName(Output.getFilename());
8978 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008979 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008980 }
8981
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008982 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008983 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008984 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008985 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008986 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008987 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008988 };
8989 for (const auto &Component : CompilerRTComponents)
8990 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008991 // Make sure the dynamic runtime thunk is not optimized out at link time
8992 // to ensure proper SEH handling.
8993 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008994 } else if (DLL) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008995 CmdArgs.push_back(
8996 Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008997 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008998 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008999 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00009000 };
9001 for (const auto &Component : CompilerRTComponents)
9002 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009003 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009004 }
9005
Hans Wennborg2e274592013-08-13 23:38:57 +00009006 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009007
Alexey Bataevc7e84352015-08-19 04:49:01 +00009008 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9009 options::OPT_fno_openmp, false)) {
9010 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9011 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9012 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9013 TC.getDriver().Dir + "/../lib"));
9014 switch (getOpenMPRuntime(getToolChain(), Args)) {
9015 case OMPRT_OMP:
9016 CmdArgs.push_back("-defaultlib:libomp.lib");
9017 break;
9018 case OMPRT_IOMP5:
9019 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9020 break;
9021 case OMPRT_GOMP:
9022 break;
9023 case OMPRT_Unknown:
9024 // Already diagnosed.
9025 break;
9026 }
9027 }
9028
Reid Kleckner337188f2014-09-16 19:22:00 +00009029 // Add filenames, libraries, and other linker inputs.
9030 for (const auto &Input : Inputs) {
9031 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009032 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009033 continue;
9034 }
9035
9036 const Arg &A = Input.getInputArg();
9037
9038 // Render -l options differently for the MSVC linker.
9039 if (A.getOption().matches(options::OPT_l)) {
9040 StringRef Lib = A.getValue();
9041 const char *LinkLibArg;
9042 if (Lib.endswith(".lib"))
9043 LinkLibArg = Args.MakeArgString(Lib);
9044 else
9045 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9046 CmdArgs.push_back(LinkLibArg);
9047 continue;
9048 }
9049
9050 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9051 // or -L. Render it, even if MSVC doesn't understand it.
9052 A.renderAsInput(Args, CmdArgs);
9053 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009054
Zachary Turner719f58c2014-12-01 23:06:47 +00009055 // We need to special case some linker paths. In the case of lld, we need to
9056 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9057 // linker, we need to use a special search algorithm.
9058 llvm::SmallString<128> linkPath;
9059 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9060 if (Linker.equals_lower("lld"))
9061 Linker = "lld-link";
9062
9063 if (Linker.equals_lower("link")) {
9064 // If we're using the MSVC linker, it's not sufficient to just use link
9065 // from the program PATH, because other environments like GnuWin32 install
9066 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009067 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009068 C.getDriver().getClangProgramPath());
9069 } else {
9070 linkPath = Linker;
9071 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009072 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009073 }
9074
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009075 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009076 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009077}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009078
Douglas Katzman95354292015-06-23 20:42:09 +00009079void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9080 const InputInfo &Output,
9081 const InputInfoList &Inputs,
9082 const ArgList &Args,
9083 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009084 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9085}
9086
Douglas Katzman95354292015-06-23 20:42:09 +00009087std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009088 Compilation &C, const JobAction &JA, const InputInfo &Output,
9089 const InputInfoList &Inputs, const ArgList &Args,
9090 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009091 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009092 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009093 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009094 CmdArgs.push_back("/W0"); // No warnings.
9095
9096 // The goal is to be able to invoke this tool correctly based on
9097 // any flag accepted by clang-cl.
9098
9099 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009100 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009101
9102 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009103 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9104 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9105 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009106 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9107 if (A->getOption().getID() == options::OPT_O0) {
9108 CmdArgs.push_back("/Od");
9109 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009110 CmdArgs.push_back("/Og");
9111
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009112 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009113 if (OptLevel == "s" || OptLevel == "z")
9114 CmdArgs.push_back("/Os");
9115 else
9116 CmdArgs.push_back("/Ot");
9117
9118 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009119 }
9120 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009121 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9122 options::OPT_fno_omit_frame_pointer))
9123 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9124 ? "/Oy"
9125 : "/Oy-");
9126 if (!Args.hasArg(options::OPT_fwritable_strings))
9127 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009128
Nico Weber3f8dafb2015-03-12 19:37:10 +00009129 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009130 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9131
David Majnemerf6072342014-07-01 22:24:56 +00009132 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9133 /*default=*/false))
9134 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009135 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9136 options::OPT_fno_function_sections))
9137 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9138 ? "/Gy"
9139 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009140 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9141 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009142 CmdArgs.push_back(
9143 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009144 if (Args.hasArg(options::OPT_fsyntax_only))
9145 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009146 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9147 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009148 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009149
Nico Weber3f8dafb2015-03-12 19:37:10 +00009150 std::vector<std::string> Includes =
9151 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009152 for (const auto &Include : Includes)
9153 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009154
Hans Wennborg87cfa712013-09-19 20:32:16 +00009155 // Flags that can simply be passed through.
9156 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9157 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009158 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009159 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009160
9161 // The order of these flags is relevant, so pick the last one.
9162 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9163 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9164 A->render(Args, CmdArgs);
9165
Hans Wennborg87cfa712013-09-19 20:32:16 +00009166 // Input filename.
9167 assert(Inputs.size() == 1);
9168 const InputInfo &II = Inputs[0];
9169 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9170 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9171 if (II.isFilename())
9172 CmdArgs.push_back(II.getFilename());
9173 else
9174 II.getInputArg().renderAsInput(Args, CmdArgs);
9175
9176 // Output filename.
9177 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009178 const char *Fo =
9179 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009180 CmdArgs.push_back(Fo);
9181
Hans Wennborg188382e2013-09-20 18:16:35 +00009182 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009183 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9184 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009185 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009186 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009187}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009188
Yaron Keren1c0070c2015-07-02 04:45:27 +00009189/// MinGW Tools
9190void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9191 const InputInfo &Output,
9192 const InputInfoList &Inputs,
9193 const ArgList &Args,
9194 const char *LinkingOutput) const {
9195 claimNoWarnArgs(Args);
9196 ArgStringList CmdArgs;
9197
9198 if (getToolChain().getArch() == llvm::Triple::x86) {
9199 CmdArgs.push_back("--32");
9200 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9201 CmdArgs.push_back("--64");
9202 }
9203
9204 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9205
9206 CmdArgs.push_back("-o");
9207 CmdArgs.push_back(Output.getFilename());
9208
9209 for (const auto &II : Inputs)
9210 CmdArgs.push_back(II.getFilename());
9211
9212 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009213 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009214
9215 if (Args.hasArg(options::OPT_gsplit_dwarf))
9216 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9217 SplitDebugName(Args, Inputs[0]));
9218}
9219
9220void MinGW::Linker::AddLibGCC(const ArgList &Args,
9221 ArgStringList &CmdArgs) const {
9222 if (Args.hasArg(options::OPT_mthreads))
9223 CmdArgs.push_back("-lmingwthrd");
9224 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009225
Yaron Kerenaa281332015-08-09 00:24:07 +00009226 // Make use of compiler-rt if --rtlib option is used
9227 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9228 if (RLT == ToolChain::RLT_Libgcc) {
9229 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9230 Args.hasArg(options::OPT_static);
9231 bool Shared = Args.hasArg(options::OPT_shared);
9232 bool CXX = getToolChain().getDriver().CCCIsCXX();
9233
9234 if (Static || (!CXX && !Shared)) {
9235 CmdArgs.push_back("-lgcc");
9236 CmdArgs.push_back("-lgcc_eh");
9237 } else {
9238 CmdArgs.push_back("-lgcc_s");
9239 CmdArgs.push_back("-lgcc");
9240 }
9241 } else {
9242 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9243 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009244
Yaron Keren1c0070c2015-07-02 04:45:27 +00009245 CmdArgs.push_back("-lmoldname");
9246 CmdArgs.push_back("-lmingwex");
9247 CmdArgs.push_back("-lmsvcrt");
9248}
9249
9250void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9251 const InputInfo &Output,
9252 const InputInfoList &Inputs,
9253 const ArgList &Args,
9254 const char *LinkingOutput) const {
9255 const ToolChain &TC = getToolChain();
9256 const Driver &D = TC.getDriver();
9257 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9258
9259 ArgStringList CmdArgs;
9260
9261 // Silence warning for "clang -g foo.o -o foo"
9262 Args.ClaimAllArgs(options::OPT_g_Group);
9263 // and "clang -emit-llvm foo.o -o foo"
9264 Args.ClaimAllArgs(options::OPT_emit_llvm);
9265 // and for "clang -w foo.o -o foo". Other warning options are already
9266 // handled somewhere else.
9267 Args.ClaimAllArgs(options::OPT_w);
9268
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009269 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9270 if (LinkerName.equals_lower("lld")) {
9271 CmdArgs.push_back("-flavor");
9272 CmdArgs.push_back("gnu");
9273 }
9274
Yaron Keren1c0070c2015-07-02 04:45:27 +00009275 if (!D.SysRoot.empty())
9276 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9277
9278 if (Args.hasArg(options::OPT_s))
9279 CmdArgs.push_back("-s");
9280
9281 CmdArgs.push_back("-m");
9282 if (TC.getArch() == llvm::Triple::x86)
9283 CmdArgs.push_back("i386pe");
9284 if (TC.getArch() == llvm::Triple::x86_64)
9285 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009286 if (TC.getArch() == llvm::Triple::arm)
9287 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009288
9289 if (Args.hasArg(options::OPT_mwindows)) {
9290 CmdArgs.push_back("--subsystem");
9291 CmdArgs.push_back("windows");
9292 } else if (Args.hasArg(options::OPT_mconsole)) {
9293 CmdArgs.push_back("--subsystem");
9294 CmdArgs.push_back("console");
9295 }
9296
9297 if (Args.hasArg(options::OPT_static))
9298 CmdArgs.push_back("-Bstatic");
9299 else {
9300 if (Args.hasArg(options::OPT_mdll))
9301 CmdArgs.push_back("--dll");
9302 else if (Args.hasArg(options::OPT_shared))
9303 CmdArgs.push_back("--shared");
9304 CmdArgs.push_back("-Bdynamic");
9305 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9306 CmdArgs.push_back("-e");
9307 if (TC.getArch() == llvm::Triple::x86)
9308 CmdArgs.push_back("_DllMainCRTStartup@12");
9309 else
9310 CmdArgs.push_back("DllMainCRTStartup");
9311 CmdArgs.push_back("--enable-auto-image-base");
9312 }
9313 }
9314
9315 CmdArgs.push_back("-o");
9316 CmdArgs.push_back(Output.getFilename());
9317
9318 Args.AddAllArgs(CmdArgs, options::OPT_e);
9319 // FIXME: add -N, -n flags
9320 Args.AddLastArg(CmdArgs, options::OPT_r);
9321 Args.AddLastArg(CmdArgs, options::OPT_s);
9322 Args.AddLastArg(CmdArgs, options::OPT_t);
9323 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9324 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9325
9326 if (!Args.hasArg(options::OPT_nostdlib) &&
9327 !Args.hasArg(options::OPT_nostartfiles)) {
9328 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9329 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9330 } else {
9331 if (Args.hasArg(options::OPT_municode))
9332 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9333 else
9334 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9335 }
9336 if (Args.hasArg(options::OPT_pg))
9337 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9338 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9339 }
9340
9341 Args.AddAllArgs(CmdArgs, options::OPT_L);
9342 const ToolChain::path_list Paths = TC.getFilePaths();
9343 for (const auto &Path : Paths)
9344 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9345
9346 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9347
9348 // TODO: Add ASan stuff here
9349
9350 // TODO: Add profile stuff here
9351
9352 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9353 !Args.hasArg(options::OPT_nodefaultlibs)) {
9354 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9355 !Args.hasArg(options::OPT_static);
9356 if (OnlyLibstdcxxStatic)
9357 CmdArgs.push_back("-Bstatic");
9358 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9359 if (OnlyLibstdcxxStatic)
9360 CmdArgs.push_back("-Bdynamic");
9361 }
9362
9363 if (!Args.hasArg(options::OPT_nostdlib)) {
9364 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9365 if (Args.hasArg(options::OPT_static))
9366 CmdArgs.push_back("--start-group");
9367
9368 if (Args.hasArg(options::OPT_fstack_protector) ||
9369 Args.hasArg(options::OPT_fstack_protector_strong) ||
9370 Args.hasArg(options::OPT_fstack_protector_all)) {
9371 CmdArgs.push_back("-lssp_nonshared");
9372 CmdArgs.push_back("-lssp");
9373 }
9374 if (Args.hasArg(options::OPT_fopenmp))
9375 CmdArgs.push_back("-lgomp");
9376
9377 AddLibGCC(Args, CmdArgs);
9378
9379 if (Args.hasArg(options::OPT_pg))
9380 CmdArgs.push_back("-lgmon");
9381
Yaron Kerenadce68e2015-07-06 18:52:19 +00009382 if (Args.hasArg(options::OPT_pthread))
9383 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009384
9385 // add system libraries
9386 if (Args.hasArg(options::OPT_mwindows)) {
9387 CmdArgs.push_back("-lgdi32");
9388 CmdArgs.push_back("-lcomdlg32");
9389 }
9390 CmdArgs.push_back("-ladvapi32");
9391 CmdArgs.push_back("-lshell32");
9392 CmdArgs.push_back("-luser32");
9393 CmdArgs.push_back("-lkernel32");
9394
9395 if (Args.hasArg(options::OPT_static))
9396 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009397 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009398 AddLibGCC(Args, CmdArgs);
9399 }
9400
9401 if (!Args.hasArg(options::OPT_nostartfiles)) {
9402 // Add crtfastmath.o if available and fast math is enabled.
9403 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9404
9405 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9406 }
9407 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009408 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009409 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009410}
9411
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009412/// XCore Tools
9413// We pass assemble and link construction to the xcc tool.
9414
Douglas Katzman95354292015-06-23 20:42:09 +00009415void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9416 const InputInfo &Output,
9417 const InputInfoList &Inputs,
9418 const ArgList &Args,
9419 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009420 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009421 ArgStringList CmdArgs;
9422
9423 CmdArgs.push_back("-o");
9424 CmdArgs.push_back(Output.getFilename());
9425
9426 CmdArgs.push_back("-c");
9427
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009428 if (Args.hasArg(options::OPT_v))
9429 CmdArgs.push_back("-v");
9430
Robert Lytton894d25c2014-05-02 09:33:25 +00009431 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9432 if (!A->getOption().matches(options::OPT_g0))
9433 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009434
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009435 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9436 false))
9437 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009438
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009439 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009440
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009441 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009442 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009443
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009444 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009445 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009446}
9447
Douglas Katzman95354292015-06-23 20:42:09 +00009448void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9449 const InputInfo &Output,
9450 const InputInfoList &Inputs,
9451 const ArgList &Args,
9452 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009453 ArgStringList CmdArgs;
9454
9455 if (Output.isFilename()) {
9456 CmdArgs.push_back("-o");
9457 CmdArgs.push_back(Output.getFilename());
9458 } else {
9459 assert(Output.isNothing() && "Invalid output.");
9460 }
9461
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009462 if (Args.hasArg(options::OPT_v))
9463 CmdArgs.push_back("-v");
9464
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009465 // Pass -fexceptions through to the linker if it was present.
9466 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9467 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009468 CmdArgs.push_back("-fexceptions");
9469
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009470 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9471
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009472 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009473 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009474}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009475
Douglas Katzman95354292015-06-23 20:42:09 +00009476void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9477 const InputInfo &Output,
9478 const InputInfoList &Inputs,
9479 const ArgList &Args,
9480 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009481 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009482 const auto &TC =
9483 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9484 ArgStringList CmdArgs;
9485 const char *Exec;
9486
9487 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009488 default:
9489 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009490 case llvm::Triple::arm:
9491 case llvm::Triple::thumb:
9492 break;
9493 case llvm::Triple::x86:
9494 CmdArgs.push_back("--32");
9495 break;
9496 case llvm::Triple::x86_64:
9497 CmdArgs.push_back("--64");
9498 break;
9499 }
9500
9501 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9502
9503 CmdArgs.push_back("-o");
9504 CmdArgs.push_back(Output.getFilename());
9505
9506 for (const auto &Input : Inputs)
9507 CmdArgs.push_back(Input.getFilename());
9508
9509 const std::string Assembler = TC.GetProgramPath("as");
9510 Exec = Args.MakeArgString(Assembler);
9511
Justin Bognerd3371d82015-07-17 03:35:54 +00009512 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009513}
9514
Douglas Katzman95354292015-06-23 20:42:09 +00009515void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9516 const InputInfo &Output,
9517 const InputInfoList &Inputs,
9518 const ArgList &Args,
9519 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009520 const auto &TC =
9521 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9522 const llvm::Triple &T = TC.getTriple();
9523 const Driver &D = TC.getDriver();
9524 SmallString<128> EntryPoint;
9525 ArgStringList CmdArgs;
9526 const char *Exec;
9527
9528 // Silence warning for "clang -g foo.o -o foo"
9529 Args.ClaimAllArgs(options::OPT_g_Group);
9530 // and "clang -emit-llvm foo.o -o foo"
9531 Args.ClaimAllArgs(options::OPT_emit_llvm);
9532 // and for "clang -w foo.o -o foo"
9533 Args.ClaimAllArgs(options::OPT_w);
9534 // Other warning options are already handled somewhere else.
9535
9536 if (!D.SysRoot.empty())
9537 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9538
9539 if (Args.hasArg(options::OPT_pie))
9540 CmdArgs.push_back("-pie");
9541 if (Args.hasArg(options::OPT_rdynamic))
9542 CmdArgs.push_back("-export-dynamic");
9543 if (Args.hasArg(options::OPT_s))
9544 CmdArgs.push_back("--strip-all");
9545
9546 CmdArgs.push_back("-m");
9547 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009548 default:
9549 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009550 case llvm::Triple::arm:
9551 case llvm::Triple::thumb:
9552 // FIXME: this is incorrect for WinCE
9553 CmdArgs.push_back("thumb2pe");
9554 break;
9555 case llvm::Triple::x86:
9556 CmdArgs.push_back("i386pe");
9557 EntryPoint.append("_");
9558 break;
9559 case llvm::Triple::x86_64:
9560 CmdArgs.push_back("i386pep");
9561 break;
9562 }
9563
9564 if (Args.hasArg(options::OPT_shared)) {
9565 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009566 default:
9567 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009568 case llvm::Triple::arm:
9569 case llvm::Triple::thumb:
9570 case llvm::Triple::x86_64:
9571 EntryPoint.append("_DllMainCRTStartup");
9572 break;
9573 case llvm::Triple::x86:
9574 EntryPoint.append("_DllMainCRTStartup@12");
9575 break;
9576 }
9577
9578 CmdArgs.push_back("-shared");
9579 CmdArgs.push_back("-Bdynamic");
9580
9581 CmdArgs.push_back("--enable-auto-image-base");
9582
9583 CmdArgs.push_back("--entry");
9584 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9585 } else {
9586 EntryPoint.append("mainCRTStartup");
9587
9588 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9589 : "-Bdynamic");
9590
9591 if (!Args.hasArg(options::OPT_nostdlib) &&
9592 !Args.hasArg(options::OPT_nostartfiles)) {
9593 CmdArgs.push_back("--entry");
9594 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9595 }
9596
9597 // FIXME: handle subsystem
9598 }
9599
9600 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009601 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009602
9603 CmdArgs.push_back("-o");
9604 CmdArgs.push_back(Output.getFilename());
9605
9606 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9607 SmallString<261> ImpLib(Output.getFilename());
9608 llvm::sys::path::replace_extension(ImpLib, ".lib");
9609
9610 CmdArgs.push_back("--out-implib");
9611 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9612 }
9613
9614 if (!Args.hasArg(options::OPT_nostdlib) &&
9615 !Args.hasArg(options::OPT_nostartfiles)) {
9616 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9617 const char *CRTBegin;
9618
9619 CRTBegin =
9620 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9621 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9622 }
9623
9624 Args.AddAllArgs(CmdArgs, options::OPT_L);
9625
9626 const auto &Paths = TC.getFilePaths();
9627 for (const auto &Path : Paths)
9628 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9629
9630 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9631
9632 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9633 !Args.hasArg(options::OPT_nodefaultlibs)) {
9634 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9635 !Args.hasArg(options::OPT_static);
9636 if (StaticCXX)
9637 CmdArgs.push_back("-Bstatic");
9638 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9639 if (StaticCXX)
9640 CmdArgs.push_back("-Bdynamic");
9641 }
9642
9643 if (!Args.hasArg(options::OPT_nostdlib)) {
9644 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9645 // TODO handle /MT[d] /MD[d]
9646 CmdArgs.push_back("-lmsvcrt");
9647 AddRunTimeLibs(TC, D, CmdArgs, Args);
9648 }
9649 }
9650
9651 const std::string Linker = TC.GetProgramPath("ld");
9652 Exec = Args.MakeArgString(Linker);
9653
Justin Bognerd3371d82015-07-17 03:35:54 +00009654 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009655}
Douglas Katzman84a75642015-06-19 14:55:19 +00009656
Douglas Katzman95354292015-06-23 20:42:09 +00009657void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9658 const InputInfo &Output,
9659 const InputInfoList &Inputs,
9660 const ArgList &Args,
9661 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009662
9663 ArgStringList CmdArgs;
9664
9665 assert(Inputs.size() == 1);
9666 const InputInfo &II = Inputs[0];
9667 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9668 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9669
Douglas Katzman84a75642015-06-19 14:55:19 +00009670 CmdArgs.push_back("-DMYRIAD2");
9671 CmdArgs.push_back("-mcpu=myriad2");
9672 CmdArgs.push_back("-S");
9673
Douglas Katzmanf6071112015-08-03 14:34:22 +00009674 // Append all -I, -iquote, -isystem paths, defines/undefines,
9675 // 'f' flags, optimize flags, and warning options.
9676 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +00009677 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
9678 options::OPT_D, options::OPT_U,
9679 options::OPT_f_Group, options::OPT_f_clang_Group,
9680 options::OPT_g_Group, options::OPT_M_Group,
9681 options::OPT_O_Group, options::OPT_W_Group});
9682
9683 // If we're producing a dependency file, and assembly is the final action,
9684 // then the name of the target in the dependency file should be the '.o'
9685 // file, not the '.s' file produced by this step. For example, instead of
9686 // /tmp/mumble.s: mumble.c .../someheader.h
9687 // the filename on the lefthand side should be "mumble.o"
9688 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
9689 C.getActions().size() == 1 &&
9690 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
9691 Arg *A = Args.getLastArg(options::OPT_o);
9692 if (A) {
9693 CmdArgs.push_back("-MT");
9694 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
9695 }
9696 }
9697
Douglas Katzman84a75642015-06-19 14:55:19 +00009698 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9699
9700 CmdArgs.push_back(II.getFilename());
9701 CmdArgs.push_back("-o");
9702 CmdArgs.push_back(Output.getFilename());
9703
9704 std::string Exec =
9705 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009706 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9707 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009708}
9709
Douglas Katzman95354292015-06-23 20:42:09 +00009710void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9711 const InputInfo &Output,
9712 const InputInfoList &Inputs,
9713 const ArgList &Args,
9714 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009715 ArgStringList CmdArgs;
9716
9717 assert(Inputs.size() == 1);
9718 const InputInfo &II = Inputs[0];
9719 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9720 assert(Output.getType() == types::TY_Object);
9721
9722 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009723 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +00009724 CmdArgs.push_back("-noSPrefixing");
9725 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009726 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9727 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
9728 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +00009729 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009730 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +00009731 }
9732 CmdArgs.push_back("-elf"); // Output format.
9733 CmdArgs.push_back(II.getFilename());
9734 CmdArgs.push_back(
9735 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9736
9737 std::string Exec =
9738 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009739 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9740 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009741}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009742
9743void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9744 const InputInfo &Output,
9745 const InputInfoList &Inputs,
9746 const ArgList &Args,
9747 const char *LinkingOutput) const {
9748 const auto &TC =
9749 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
9750 const llvm::Triple &T = TC.getTriple();
9751 ArgStringList CmdArgs;
9752 bool UseStartfiles = !Args.hasArg(options::OPT_nostartfiles);
9753
9754 std::string StartFilesDir, BuiltinLibDir;
9755 TC.getCompilerSupportDir(StartFilesDir);
9756 TC.getBuiltinLibDir(BuiltinLibDir);
9757
9758 if (T.getArch() == llvm::Triple::sparc)
9759 CmdArgs.push_back("-EB");
9760 else // SHAVE assumes little-endian, and sparcel is expressly so.
9761 CmdArgs.push_back("-EL");
9762
9763 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
9764 // but we never pass through a --sysroot option and various other bits.
9765 // For example, there are no sanitizers (yet) nor gold linker.
9766
9767 // Eat some arguments that may be present but have no effect.
9768 Args.ClaimAllArgs(options::OPT_g_Group);
9769 Args.ClaimAllArgs(options::OPT_w);
9770 Args.ClaimAllArgs(options::OPT_static_libgcc);
9771
9772 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
9773 CmdArgs.push_back("-s");
9774
9775 CmdArgs.push_back("-o");
9776 CmdArgs.push_back(Output.getFilename());
9777
9778 if (UseStartfiles) {
9779 // If you want startfiles, it means you want the builtin crti and crtbegin,
9780 // but not crt0. Myriad link commands provide their own crt0.o as needed.
9781 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crti.o"));
9782 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtbegin.o"));
9783 }
9784
9785 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
9786 options::OPT_e, options::OPT_s, options::OPT_t,
9787 options::OPT_Z_Flag, options::OPT_r});
9788
9789 // The linker doesn't use these builtin paths unless directed to,
9790 // because it was not compiled for support with sysroots, nor does
9791 // it have a default of little-endian with FPU.
9792 CmdArgs.push_back(Args.MakeArgString("-L" + BuiltinLibDir));
9793 CmdArgs.push_back(Args.MakeArgString("-L" + StartFilesDir));
9794
9795 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9796
9797 if (T.getOS() == llvm::Triple::RTEMS) {
9798 CmdArgs.push_back("--start-group");
9799 CmdArgs.push_back("-lc");
9800 // You must provide your own "-L" option to enable finding these.
9801 CmdArgs.push_back("-lrtemscpu");
9802 CmdArgs.push_back("-lrtemsbsp");
9803 CmdArgs.push_back("--end-group");
9804 } else {
9805 CmdArgs.push_back("-lc");
9806 }
9807 if (C.getDriver().CCCIsCXX())
9808 CmdArgs.push_back("-lstdc++");
9809 CmdArgs.push_back("-lgcc");
9810 if (UseStartfiles) {
9811 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtend.o"));
9812 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtn.o"));
9813 }
9814
9815 std::string Exec =
9816 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
9817 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9818 CmdArgs, Inputs));
9819}