blob: 26e767f54a6314ceed23de686d2b833ff5a3938e [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Daniel Dunbar64198ef2009-09-10 01:21:05 +000055/// CheckPreprocessingOptions - Perform some validation of preprocessing
56/// arguments that is shared with gcc.
57static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000058 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
59 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
60 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000061 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000062 << A->getBaseArg().getAsString(Args)
63 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
64 }
65 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000066}
67
Daniel Dunbar4eadb602009-09-10 01:21:12 +000068/// CheckCodeGenerationOptions - Perform some validation of code generation
69/// arguments that is shared with gcc.
70static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
71 // In gcc, only ARM checks this, but it seems reasonable to check universally.
72 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +000073 if (const Arg *A =
74 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
75 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
76 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +000077}
78
Bob Wilsond5aad2a2014-11-04 22:28:48 +000079// Add backslashes to escape spaces and other backslashes.
80// This is used for the space-separated argument list specified with
81// the -dwarf-debug-flags option.
82static void EscapeSpacesAndBackslashes(const char *Arg,
83 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000084 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +000085 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000086 default:
87 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +000088 case ' ':
89 case '\\':
90 Res.push_back('\\');
91 break;
92 }
93 Res.push_back(*Arg);
94 }
95}
96
Chris Lattnerbf2803f2010-03-29 17:55:58 +000097// Quote target names for inclusion in GNU Make dependency files.
98// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +000099static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000100 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
101 switch (Target[i]) {
102 case ' ':
103 case '\t':
104 // Escape the preceding backslashes
105 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
106 Res.push_back('\\');
107
108 // Escape the space/tab
109 Res.push_back('\\');
110 break;
111 case '$':
112 Res.push_back('$');
113 break;
114 case '#':
115 Res.push_back('\\');
116 break;
117 default:
118 break;
119 }
120
121 Res.push_back(Target[i]);
122 }
123}
124
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000125static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
126 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000127 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000128 bool CombinedArg = false;
129
Bill Wendling281ca292012-03-12 21:22:35 +0000130 if (!DirList)
131 return; // Nothing to do.
132
Chad Rosier616e8a52012-10-30 21:42:09 +0000133 StringRef Name(ArgName);
134 if (Name.equals("-I") || Name.equals("-L"))
135 CombinedArg = true;
136
Bill Wendling281ca292012-03-12 21:22:35 +0000137 StringRef Dirs(DirList);
138 if (Dirs.empty()) // Empty string should not add '.'.
139 return;
140
141 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000142 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000143 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000144 if (CombinedArg) {
145 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
146 } else {
147 CmdArgs.push_back(ArgName);
148 CmdArgs.push_back(".");
149 }
Bill Wendling281ca292012-03-12 21:22:35 +0000150 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000151 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000152 CmdArgs.push_back(
153 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000154 } else {
155 CmdArgs.push_back(ArgName);
156 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
157 }
Bill Wendling281ca292012-03-12 21:22:35 +0000158 }
Nico Weber89355782012-03-19 15:00:03 +0000159 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000160 }
161
162 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000163 if (CombinedArg) {
164 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
165 } else {
166 CmdArgs.push_back(ArgName);
167 CmdArgs.push_back(".");
168 }
Bill Wendling281ca292012-03-12 21:22:35 +0000169 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000170 if (CombinedArg) {
171 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
172 } else {
173 CmdArgs.push_back(ArgName);
174 CmdArgs.push_back(Args.MakeArgString(Dirs));
175 }
Bill Wendling281ca292012-03-12 21:22:35 +0000176 }
177}
178
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000179static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
180 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000181 const Driver &D = TC.getDriver();
182
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000183 // Add extra linker input arguments which are not treated as inputs
184 // (constructed via -Xarch_).
185 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
186
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000187 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000188 if (!TC.HasNativeLLVMSupport()) {
189 // Don't try to pass LLVM inputs unless we have native support.
190 if (II.getType() == types::TY_LLVM_IR ||
191 II.getType() == types::TY_LTO_IR ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000192 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
193 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000194 }
195
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000196 // Add filenames immediately.
197 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000198 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000199 continue;
200 }
201
202 // Otherwise, this is a linker input argument.
203 const Arg &A = II.getInputArg();
204
205 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000206 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000207 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000208 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000209 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000210 else if (A.getOption().matches(options::OPT_z)) {
211 // Pass -z prefix for gcc linker compatibility.
212 A.claim();
213 A.render(Args, CmdArgs);
214 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000215 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000216 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000217 }
Bill Wendling281ca292012-03-12 21:22:35 +0000218
219 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000220 // and only supported on native toolchains.
221 if (!TC.isCrossCompiling())
222 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000223}
224
John McCall31168b02011-06-15 23:02:42 +0000225/// \brief Determine whether Objective-C automated reference counting is
226/// enabled.
227static bool isObjCAutoRefCount(const ArgList &Args) {
228 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
229}
230
Ted Kremeneke65b0862012-03-06 20:05:56 +0000231/// \brief Determine whether we are linking the ObjC runtime.
232static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000233 if (isObjCAutoRefCount(Args)) {
234 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000235 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000236 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000237 return Args.hasArg(options::OPT_fobjc_link_runtime);
238}
239
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000240static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000241 // Don't forward inputs from the original command line. They are added from
242 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000243 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000244 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000245}
246
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000247void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
248 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000249 ArgStringList &CmdArgs,
250 const InputInfo &Output,
251 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000252 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000253
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000254 CheckPreprocessingOptions(D, Args);
255
256 Args.AddLastArg(CmdArgs, options::OPT_C);
257 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000258
259 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000260 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000261 (A = Args.getLastArg(options::OPT_MD)) ||
262 (A = Args.getLastArg(options::OPT_MMD))) {
263 // Determine the output location.
264 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000265 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000266 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000267 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000268 } else if (Output.getType() == types::TY_Dependencies) {
269 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000270 } else if (A->getOption().matches(options::OPT_M) ||
271 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000272 DepFile = "-";
273 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000274 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000275 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000276 }
277 CmdArgs.push_back("-dependency-file");
278 CmdArgs.push_back(DepFile);
279
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000280 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000281 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
282 const char *DepTarget;
283
284 // If user provided -o, that is the dependency target, except
285 // when we are only generating a dependency file.
286 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
287 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000288 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000289 } else {
290 // Otherwise derive from the base input.
291 //
292 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000293 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000294 llvm::sys::path::replace_extension(P, "o");
295 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000296 }
297
298 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000299 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000300 QuoteTarget(DepTarget, Quoted);
301 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000302 }
303
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000304 if (A->getOption().matches(options::OPT_M) ||
305 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000307 if ((isa<PrecompileJobAction>(JA) &&
308 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
309 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000310 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000311 }
312
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000313 if (Args.hasArg(options::OPT_MG)) {
314 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000315 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000316 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000317 CmdArgs.push_back("-MG");
318 }
319
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000320 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000321 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000322
323 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000324 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000325 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000326
Daniel Dunbara442fd52010-06-11 22:00:13 +0000327 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000328 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000329 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000330 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000331 CmdArgs.push_back(Args.MakeArgString(Quoted));
332
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000333 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000334 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000335 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000336 }
337 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000338
Douglas Gregor111af7d2009-04-18 00:34:01 +0000339 // Add -i* options, and automatically translate to
340 // -include-pch/-include-pth for transparent PCH support. It's
341 // wonky, but we include looking for .gch so we can support seamless
342 // replacement into a build system already set up to be generating
343 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000344 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000345 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000346 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000347 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
348 RenderedImplicitInclude = true;
349
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000350 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000351 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000352
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000353 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000354 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000355 SmallString<128> P(A->getValue());
356 // We want the files to have a name like foo.h.pch. Add a dummy extension
357 // so that replace_extension does the right thing.
358 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000359 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000360 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000361 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000362 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000363 }
364
Douglas Gregor111af7d2009-04-18 00:34:01 +0000365 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000366 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000367 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000368 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000369 }
370
Douglas Gregor111af7d2009-04-18 00:34:01 +0000371 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000372 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000373 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000374 FoundPCH = UsePCH;
375 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000376 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000377 }
378
379 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000380 if (IsFirstImplicitInclude) {
381 A->claim();
382 if (UsePCH)
383 CmdArgs.push_back("-include-pch");
384 else
385 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000386 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000387 continue;
388 } else {
389 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000390 D.Diag(diag::warn_drv_pch_not_first_include) << P
391 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000392 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000393 }
394 }
395
396 // Not translated, render as usual.
397 A->claim();
398 A->render(Args, CmdArgs);
399 }
400
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000401 Args.AddAllArgs(CmdArgs,
402 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
403 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000404
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000405 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000406
407 // FIXME: There is a very unfortunate problem here, some troubled
408 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
409 // really support that we would have to parse and then translate
410 // those options. :(
411 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
412 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000413
414 // -I- is a deprecated GCC feature, reject it.
415 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000416 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000417
418 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
419 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000420 StringRef sysroot = C.getSysRoot();
421 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000422 if (!Args.hasArg(options::OPT_isysroot)) {
423 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000424 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000425 }
426 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000427
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000428 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000429 // FIXME: We should probably sink the logic for handling these from the
430 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000431 // CPATH - included following the user specified includes (but prior to
432 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000433 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000434 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000435 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000436 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000437 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000438 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000439 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000440 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000441 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000442
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000443 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000444 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000445 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000446
447 // Add system include arguments.
448 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000449}
450
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000451// FIXME: Move to target hook.
452static bool isSignedCharDefault(const llvm::Triple &Triple) {
453 switch (Triple.getArch()) {
454 default:
455 return true;
456
Tim Northover9bb857a2013-01-31 12:13:10 +0000457 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000458 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000459 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000460 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000461 case llvm::Triple::thumb:
462 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000463 if (Triple.isOSDarwin() || Triple.isOSWindows())
464 return true;
465 return false;
466
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000467 case llvm::Triple::ppc:
468 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000469 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000470 return true;
471 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000472
David Majnemerdcecd932015-05-23 19:23:55 +0000473 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000474 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000475 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000476 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000477 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000478 }
479}
480
Robert Lytton0e076492013-08-13 09:43:10 +0000481static bool isNoCommonDefault(const llvm::Triple &Triple) {
482 switch (Triple.getArch()) {
483 default:
484 return false;
485
486 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000487 case llvm::Triple::wasm32:
488 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000489 return true;
490 }
491}
492
Renato Goline17c5802015-07-27 23:44:42 +0000493// ARM tools start.
494
495// Get SubArch (vN).
496static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
497 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000498 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000499}
500
501// True if M-profile.
502static bool isARMMProfile(const llvm::Triple &Triple) {
503 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000504 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000505 return Profile == llvm::ARM::PK_M;
506}
507
508// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000509static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
510 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000511 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
512 CPU = A->getValue();
513 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
514 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000515 if (!FromAs)
516 return;
517
518 for (const Arg *A :
519 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
520 StringRef Value = A->getValue();
521 if (Value.startswith("-mcpu="))
522 CPU = Value.substr(6);
523 if (Value.startswith("-march="))
524 Arch = Value.substr(7);
525 }
Renato Goline17c5802015-07-27 23:44:42 +0000526}
527
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000528// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000529// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000530static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000531 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000532 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000533 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
534 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000535 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
536}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000537
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000538// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000539static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000540 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000541 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000542 unsigned FPUID = llvm::ARM::parseFPU(FPU);
543 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000544 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
545}
546
Renato Golin7c542b42015-07-27 23:44:45 +0000547// Check if -march is valid by checking if it can be canonicalised and parsed.
548// getARMArch is used here instead of just checking the -march value in order
549// to handle -march=native correctly.
550static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000551 llvm::StringRef ArchName,
552 const llvm::Triple &Triple) {
553 std::string MArch = arm::getARMArch(ArchName, Triple);
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000554 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID)
Renato Goline17c5802015-07-27 23:44:42 +0000555 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000556}
557
Renato Golin7c542b42015-07-27 23:44:45 +0000558// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
559static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
560 llvm::StringRef CPUName, llvm::StringRef ArchName,
Renato Goline17c5802015-07-27 23:44:42 +0000561 const llvm::Triple &Triple) {
562 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Vladimir Sukharev64f68242015-09-23 09:29:32 +0000563 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty())
Renato Goline17c5802015-07-27 23:44:42 +0000564 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000565}
566
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000567static bool useAAPCSForMachO(const llvm::Triple &T) {
568 // The backend is hardwired to assume AAPCS for M-class processors, ensure
569 // the frontend matches that.
570 return T.getEnvironment() == llvm::Triple::EABI ||
571 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
572}
573
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000574// Select the float ABI as determined by -msoft-float, -mhard-float, and
575// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000576arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
577 const Driver &D = TC.getDriver();
578 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000579 auto SubArch = getARMSubArchVersionNumber(Triple);
580 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000581 if (Arg *A =
582 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
583 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000584 if (A->getOption().matches(options::OPT_msoft_float)) {
585 ABI = FloatABI::Soft;
586 } else if (A->getOption().matches(options::OPT_mhard_float)) {
587 ABI = FloatABI::Hard;
588 } else {
589 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
590 .Case("soft", FloatABI::Soft)
591 .Case("softfp", FloatABI::SoftFP)
592 .Case("hard", FloatABI::Hard)
593 .Default(FloatABI::Invalid);
594 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000595 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000596 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000597 }
598 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000599
600 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
601 // "apcs-gnu".
602 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000603 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000604 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
605 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000606 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000607 }
608
609 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000610 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000611 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000612 case llvm::Triple::Darwin:
613 case llvm::Triple::MacOSX:
614 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000615 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000616 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000617 break;
618 }
619
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000620 // FIXME: this is invalid for WindowsCE
621 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000622 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000623 break;
624
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000625 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000626 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000627 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000628 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000629 break;
630 default:
631 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000632 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000633 break;
634 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000635 break;
636
Daniel Dunbar78485922009-09-10 23:00:09 +0000637 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000638 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000639 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000640 case llvm::Triple::EABIHF:
641 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000642 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000643 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000644 case llvm::Triple::EABI:
645 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000646 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000647 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000648 case llvm::Triple::Android:
649 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000650 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000651 default:
652 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000653 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000654 if (Triple.getOS() != llvm::Triple::UnknownOS ||
655 !Triple.isOSBinFormatMachO())
656 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000657 break;
658 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000659 }
660 }
661
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000662 assert(ABI != FloatABI::Invalid && "must select an ABI");
663 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000664}
665
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000666static void getARMTargetFeatures(const ToolChain &TC,
667 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000668 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000669 std::vector<const char *> &Features,
670 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000671 const Driver &D = TC.getDriver();
672
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000673 bool KernelOrKext =
674 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000675 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000676 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
677 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
678
Nico Weber6e0ebae2015-04-29 21:16:40 +0000679 if (!ForAS) {
680 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
681 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
682 // stripped out by the ARM target. We should probably pass this a new
683 // -target-option, which is handled by the -cc1/-cc1as invocation.
684 //
685 // FIXME2: For consistency, it would be ideal if we set up the target
686 // machine state the same when using the frontend or the assembler. We don't
687 // currently do that for the assembler, we pass the options directly to the
688 // backend and never even instantiate the frontend TargetInfo. If we did,
689 // and used its handleTargetFeatures hook, then we could ensure the
690 // assembler and the frontend behave the same.
691
692 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000693 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000694 Features.push_back("+soft-float");
695
696 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000697 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000698 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000699 } else {
700 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
701 // to the assembler correctly.
702 for (const Arg *A :
703 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
704 StringRef Value = A->getValue();
705 if (Value.startswith("-mfpu=")) {
706 WaFPU = A;
707 } else if (Value.startswith("-mcpu=")) {
708 WaCPU = A;
709 } else if (Value.startswith("-mhwdiv=")) {
710 WaHDiv = A;
711 } else if (Value.startswith("-march=")) {
712 WaArch = A;
713 }
714 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000715 }
716
Renato Golin7c542b42015-07-27 23:44:45 +0000717 // Check -march. ClangAs gives preference to -Wa,-march=.
718 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000719 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000720 if (WaArch) {
721 if (ArchArg)
722 D.Diag(clang::diag::warn_drv_unused_argument)
723 << ArchArg->getAsString(Args);
724 ArchName = StringRef(WaArch->getValue()).substr(7);
725 checkARMArchName(D, WaArch, Args, ArchName, Triple);
726 // FIXME: Set Arch.
727 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
728 } else if (ArchArg) {
729 ArchName = ArchArg->getValue();
730 checkARMArchName(D, ArchArg, Args, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000731 }
732
Renato Golin7c542b42015-07-27 23:44:45 +0000733 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
734 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000735 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000736 if (WaCPU) {
737 if (CPUArg)
738 D.Diag(clang::diag::warn_drv_unused_argument)
739 << CPUArg->getAsString(Args);
740 CPUName = StringRef(WaCPU->getValue()).substr(6);
741 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Triple);
742 } else if (CPUArg) {
743 CPUName = CPUArg->getValue();
744 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000745 }
John Brawna95c1a82015-05-08 12:52:18 +0000746
Renato Golin23459c62015-07-30 16:40:17 +0000747 // Add CPU features for generic CPUs
748 if (CPUName == "native") {
749 llvm::StringMap<bool> HostFeatures;
750 if (llvm::sys::getHostCPUFeatures(HostFeatures))
751 for (auto &F : HostFeatures)
752 Features.push_back(
753 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
754 }
755
756 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
757 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
758 if (WaFPU) {
759 if (FPUArg)
760 D.Diag(clang::diag::warn_drv_unused_argument)
761 << FPUArg->getAsString(Args);
762 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
763 Features);
764 } else if (FPUArg) {
765 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
766 }
767
768 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
769 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
770 if (WaHDiv) {
771 if (HDivArg)
772 D.Diag(clang::diag::warn_drv_unused_argument)
773 << HDivArg->getAsString(Args);
774 getARMHWDivFeatures(D, WaHDiv, Args,
775 StringRef(WaHDiv->getValue()).substr(8), Features);
776 } else if (HDivArg)
777 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
778
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000779 // Setting -msoft-float effectively disables NEON because of the GCC
780 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000781 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000782 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000783 // Also need to explicitly disable features which imply NEON.
784 Features.push_back("-crypto");
785 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000786
Eric Christopher269c2a22015-04-04 03:34:43 +0000787 // En/disable crc code generation.
788 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000789 if (A->getOption().matches(options::OPT_mcrc))
790 Features.push_back("+crc");
791 else
792 Features.push_back("-crc");
793 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000794
795 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
796 Features.insert(Features.begin(), "+v8.1a");
797 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000798
Akira Hatanakac2694822015-07-07 08:28:42 +0000799 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
800 // neither options are specified, see if we are compiling for kernel/kext and
801 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000802 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
803 options::OPT_mno_long_calls)) {
804 if (A->getOption().matches(options::OPT_mlong_calls))
805 Features.push_back("+long-calls");
806 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6))) {
807 Features.push_back("+long-calls");
808 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000809
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000810 // Kernel code has more strict alignment requirements.
811 if (KernelOrKext)
812 Features.push_back("+strict-align");
813 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
814 options::OPT_munaligned_access)) {
815 if (A->getOption().matches(options::OPT_munaligned_access)) {
816 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
817 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
818 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
819 } else
820 Features.push_back("+strict-align");
821 } else {
822 // Assume pre-ARMv6 doesn't support unaligned accesses.
823 //
824 // ARMv6 may or may not support unaligned accesses depending on the
825 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
826 // Darwin and NetBSD targets support unaligned accesses, and others don't.
827 //
828 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
829 // which raises an alignment fault on unaligned accesses. Linux
830 // defaults this bit to 0 and handles it as a system-wide (not
831 // per-process) setting. It is therefore safe to assume that ARMv7+
832 // Linux targets support unaligned accesses. The same goes for NaCl.
833 //
834 // The above behavior is consistent with GCC.
835 int VersionNum = getARMSubArchVersionNumber(Triple);
836 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000837 if (VersionNum < 6 ||
838 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000839 Features.push_back("+strict-align");
840 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
841 if (VersionNum < 7)
842 Features.push_back("+strict-align");
843 } else
844 Features.push_back("+strict-align");
845 }
846
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000847 // llvm does not support reserving registers in general. There is support
848 // for reserving r9 on ARM though (defined as a platform-specific register
849 // in ARM EABI).
850 if (Args.hasArg(options::OPT_ffixed_r9))
851 Features.push_back("+reserve-r9");
852
Akira Hatanaka580efb22015-07-16 00:43:00 +0000853 // The kext linker doesn't know how to deal with movw/movt.
854 if (KernelOrKext)
855 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000856}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000857
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000858void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
859 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000860 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000861 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000862 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000863 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000864 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000865 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000866 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000867 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000868 ABIName = "aapcs";
869 } else {
870 ABIName = "apcs-gnu";
871 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000872 } else if (Triple.isOSWindows()) {
873 // FIXME: this is invalid for WindowsCE
874 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000875 } else {
876 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000877 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000878 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000879 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000880 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000881 ABIName = "aapcs-linux";
882 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000883 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000884 case llvm::Triple::EABI:
885 ABIName = "aapcs";
886 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000887 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000888 if (Triple.getOS() == llvm::Triple::NetBSD)
889 ABIName = "apcs-gnu";
890 else
891 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000892 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000893 }
894 }
895 CmdArgs.push_back("-target-abi");
896 CmdArgs.push_back(ABIName);
897
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000898 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000899 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000900 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000901 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000902 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000903 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000904 CmdArgs.push_back("-mfloat-abi");
905 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000906 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000907 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000908 CmdArgs.push_back("-mfloat-abi");
909 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000910 } else {
911 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000912 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000913 CmdArgs.push_back("-mfloat-abi");
914 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000915 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000916
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000917 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000918 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
919 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000920 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000921 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000922 CmdArgs.push_back("-arm-global-merge=false");
923 else
924 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000925 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000926
Bob Wilson9c8af452013-04-11 18:53:25 +0000927 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000928 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000929 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000930}
Renato Goline17c5802015-07-27 23:44:42 +0000931// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000932
Tim Northover573cbee2014-05-24 12:52:07 +0000933/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
934/// targeting.
935static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000936 Arg *A;
937 std::string CPU;
938 // If we have -mtune or -mcpu, use that.
939 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +0000940 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +0000941 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000942 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +0000943 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +0000944 }
945
Kevin Qin110db6f2014-07-18 07:03:22 +0000946 // Handle CPU name is 'native'.
947 if (CPU == "native")
948 return llvm::sys::getHostCPUName();
949 else if (CPU.size())
950 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000951
James Molloy9b1586b2014-04-17 12:51:17 +0000952 // Make sure we pick "cyclone" if -arch is used.
953 // FIXME: Should this be picked by checking the target triple instead?
954 if (Args.getLastArg(options::OPT_arch))
955 return "cyclone";
956
957 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000958}
959
Tim Northover573cbee2014-05-24 12:52:07 +0000960void Clang::AddAArch64TargetArgs(const ArgList &Args,
961 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000962 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
963 llvm::Triple Triple(TripleStr);
964
965 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
966 Args.hasArg(options::OPT_mkernel) ||
967 Args.hasArg(options::OPT_fapple_kext))
968 CmdArgs.push_back("-disable-red-zone");
969
970 if (!Args.hasFlag(options::OPT_mimplicit_float,
971 options::OPT_mno_implicit_float, true))
972 CmdArgs.push_back("-no-implicit-float");
973
Craig Topper92fc2df2014-05-17 16:56:41 +0000974 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000975 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
976 ABIName = A->getValue();
977 else if (Triple.isOSDarwin())
978 ABIName = "darwinpcs";
979 else
980 ABIName = "aapcs";
981
982 CmdArgs.push_back("-target-abi");
983 CmdArgs.push_back(ABIName);
984
Bradley Smith9ff64332014-10-13 10:16:06 +0000985 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
986 options::OPT_mno_fix_cortex_a53_835769)) {
987 CmdArgs.push_back("-backend-option");
988 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
989 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
990 else
991 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000992 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
993 // Enabled A53 errata (835769) workaround by default on android
994 CmdArgs.push_back("-backend-option");
995 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000996 }
997
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000998 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000999 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1000 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001001 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001002 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001003 CmdArgs.push_back("-aarch64-global-merge=false");
1004 else
1005 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001006 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001007}
1008
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001009// Get CPU and ABI names. They are not independent
1010// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001011void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1012 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001013 const char *DefMips32CPU = "mips32r2";
1014 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001015
Daniel Sanders2bf13662014-07-10 14:40:57 +00001016 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1017 // default for mips64(el)?-img-linux-gnu.
1018 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1019 Triple.getEnvironment() == llvm::Triple::GNU) {
1020 DefMips32CPU = "mips32r6";
1021 DefMips64CPU = "mips64r6";
1022 }
Renato Golin7c542b42015-07-27 23:44:45 +00001023
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001024 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
1025 if (Triple.getEnvironment() == llvm::Triple::Android)
1026 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001027
Brad Smithba26f582015-01-06 02:53:17 +00001028 // MIPS3 is the default for mips64*-unknown-openbsd.
1029 if (Triple.getOS() == llvm::Triple::OpenBSD)
1030 DefMips64CPU = "mips3";
1031
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001032 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001033 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001034
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001035 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001036 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001037 // Convert a GNU style Mips ABI name to the name
1038 // accepted by LLVM Mips backend.
1039 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001040 .Case("32", "o32")
1041 .Case("64", "n64")
1042 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001043 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001044
1045 // Setup default CPU and ABI names.
1046 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001047 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001048 default:
1049 llvm_unreachable("Unexpected triple arch name");
1050 case llvm::Triple::mips:
1051 case llvm::Triple::mipsel:
1052 CPUName = DefMips32CPU;
1053 break;
1054 case llvm::Triple::mips64:
1055 case llvm::Triple::mips64el:
1056 CPUName = DefMips64CPU;
1057 break;
1058 }
1059 }
1060
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001061 if (ABIName.empty()) {
1062 // Deduce ABI name from the target triple.
1063 if (Triple.getArch() == llvm::Triple::mips ||
1064 Triple.getArch() == llvm::Triple::mipsel)
1065 ABIName = "o32";
1066 else
1067 ABIName = "n64";
1068 }
1069
1070 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001071 // Deduce CPU name from ABI name.
1072 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001073 .Cases("o32", "eabi", DefMips32CPU)
1074 .Cases("n32", "n64", DefMips64CPU)
1075 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001076 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001077
1078 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001079}
1080
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001081// Convert ABI name to the GNU tools acceptable variant.
1082static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1083 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001084 .Case("o32", "32")
1085 .Case("n64", "64")
1086 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001087}
1088
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001089// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1090// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001091static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1092 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001093 if (Arg *A =
1094 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1095 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001096 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001097 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001098 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001099 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001100 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001101 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1102 .Case("soft", mips::FloatABI::Soft)
1103 .Case("hard", mips::FloatABI::Hard)
1104 .Default(mips::FloatABI::Invalid);
1105 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001106 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001107 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001108 }
1109 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001110 }
1111
1112 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001113 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001114 // Assume "hard", because it's a default value used by gcc.
1115 // When we start to recognize specific target MIPS processors,
1116 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001117 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001118 }
1119
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001120 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1121 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001122}
1123
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001124static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001125 std::vector<const char *> &Features,
1126 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001127 StringRef FeatureName) {
1128 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001129 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001130 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001131 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001132 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001133 }
1134}
1135
Daniel Sanders379d44b2014-07-16 11:52:23 +00001136static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1137 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001138 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001139 StringRef CPUName;
1140 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001141 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001142 ABIName = getGnuCompatibleMipsABIName(ABIName);
1143
Daniel Sandersfeb61302014-08-08 15:47:17 +00001144 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1145 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001146
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001147 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1148 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001149 // FIXME: Note, this is a hack. We need to pass the selected float
1150 // mode to the MipsTargetInfoBase to define appropriate macros there.
1151 // Now it is the only method.
1152 Features.push_back("+soft-float");
1153 }
1154
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001155 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001156 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001157 if (Val == "2008") {
1158 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1159 Features.push_back("+nan2008");
1160 else {
1161 Features.push_back("-nan2008");
1162 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1163 }
1164 } else if (Val == "legacy") {
1165 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1166 Features.push_back("-nan2008");
1167 else {
1168 Features.push_back("+nan2008");
1169 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1170 }
1171 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001172 D.Diag(diag::err_drv_unsupported_option_argument)
1173 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001174 }
1175
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001176 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1177 options::OPT_mdouble_float, "single-float");
1178 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1179 "mips16");
1180 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1181 options::OPT_mno_micromips, "micromips");
1182 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1183 "dsp");
1184 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1185 "dspr2");
1186 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1187 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001188
1189 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1190 // pass -mfpxx
1191 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1192 options::OPT_mfp64)) {
1193 if (A->getOption().matches(options::OPT_mfp32))
1194 Features.push_back(Args.MakeArgString("-fp64"));
1195 else if (A->getOption().matches(options::OPT_mfpxx)) {
1196 Features.push_back(Args.MakeArgString("+fpxx"));
1197 Features.push_back(Args.MakeArgString("+nooddspreg"));
1198 } else
1199 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001200 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001201 Features.push_back(Args.MakeArgString("+fpxx"));
1202 Features.push_back(Args.MakeArgString("+nooddspreg"));
1203 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001204
Daniel Sanders28e5d392014-07-10 10:39:51 +00001205 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1206 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001207}
1208
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001209void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001210 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001211 const Driver &D = getToolChain().getDriver();
1212 StringRef CPUName;
1213 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001214 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001215 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001216
1217 CmdArgs.push_back("-target-abi");
1218 CmdArgs.push_back(ABIName.data());
1219
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001220 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1221 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001222 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001223 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001224 CmdArgs.push_back("-mfloat-abi");
1225 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001226 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001227 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001228 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001229 CmdArgs.push_back("-mfloat-abi");
1230 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001231 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001232
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001233 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1234 if (A->getOption().matches(options::OPT_mxgot)) {
1235 CmdArgs.push_back("-mllvm");
1236 CmdArgs.push_back("-mxgot");
1237 }
1238 }
1239
Simon Atanasyanc580b322013-05-11 06:33:44 +00001240 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1241 options::OPT_mno_ldc1_sdc1)) {
1242 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1243 CmdArgs.push_back("-mllvm");
1244 CmdArgs.push_back("-mno-ldc1-sdc1");
1245 }
1246 }
1247
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001248 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1249 options::OPT_mno_check_zero_division)) {
1250 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1251 CmdArgs.push_back("-mllvm");
1252 CmdArgs.push_back("-mno-check-zero-division");
1253 }
1254 }
1255
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001256 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001257 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001258 CmdArgs.push_back("-mllvm");
1259 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1260 A->claim();
1261 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001262}
1263
Hal Finkel8eb59282012-06-11 22:35:19 +00001264/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1265static std::string getPPCTargetCPU(const ArgList &Args) {
1266 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001267 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001268
1269 if (CPUName == "native") {
1270 std::string CPU = llvm::sys::getHostCPUName();
1271 if (!CPU.empty() && CPU != "generic")
1272 return CPU;
1273 else
1274 return "";
1275 }
1276
1277 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001278 .Case("common", "generic")
1279 .Case("440", "440")
1280 .Case("440fp", "440")
1281 .Case("450", "450")
1282 .Case("601", "601")
1283 .Case("602", "602")
1284 .Case("603", "603")
1285 .Case("603e", "603e")
1286 .Case("603ev", "603ev")
1287 .Case("604", "604")
1288 .Case("604e", "604e")
1289 .Case("620", "620")
1290 .Case("630", "pwr3")
1291 .Case("G3", "g3")
1292 .Case("7400", "7400")
1293 .Case("G4", "g4")
1294 .Case("7450", "7450")
1295 .Case("G4+", "g4+")
1296 .Case("750", "750")
1297 .Case("970", "970")
1298 .Case("G5", "g5")
1299 .Case("a2", "a2")
1300 .Case("a2q", "a2q")
1301 .Case("e500mc", "e500mc")
1302 .Case("e5500", "e5500")
1303 .Case("power3", "pwr3")
1304 .Case("power4", "pwr4")
1305 .Case("power5", "pwr5")
1306 .Case("power5x", "pwr5x")
1307 .Case("power6", "pwr6")
1308 .Case("power6x", "pwr6x")
1309 .Case("power7", "pwr7")
1310 .Case("power8", "pwr8")
1311 .Case("pwr3", "pwr3")
1312 .Case("pwr4", "pwr4")
1313 .Case("pwr5", "pwr5")
1314 .Case("pwr5x", "pwr5x")
1315 .Case("pwr6", "pwr6")
1316 .Case("pwr6x", "pwr6x")
1317 .Case("pwr7", "pwr7")
1318 .Case("pwr8", "pwr8")
1319 .Case("powerpc", "ppc")
1320 .Case("powerpc64", "ppc64")
1321 .Case("powerpc64le", "ppc64le")
1322 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001323 }
1324
1325 return "";
1326}
1327
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001328static void getPPCTargetFeatures(const ArgList &Args,
1329 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001330 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1331 StringRef Name = A->getOption().getName();
1332 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001333
1334 // Skip over "-m".
1335 assert(Name.startswith("m") && "Invalid feature name.");
1336 Name = Name.substr(1);
1337
1338 bool IsNegative = Name.startswith("no-");
1339 if (IsNegative)
1340 Name = Name.substr(3);
1341
1342 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1343 // pass the correct option to the backend while calling the frontend
1344 // option the same.
1345 // TODO: Change the LLVM backend option maybe?
1346 if (Name == "mfcrf")
1347 Name = "mfocrf";
1348
1349 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1350 }
1351
1352 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001353 AddTargetFeature(Args, Features, options::OPT_faltivec,
1354 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001355}
1356
Ulrich Weigand8afad612014-07-28 13:17:52 +00001357void Clang::AddPPCTargetArgs(const ArgList &Args,
1358 ArgStringList &CmdArgs) const {
1359 // Select the ABI to use.
1360 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001361 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001362 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001363 case llvm::Triple::ppc64: {
1364 // When targeting a processor that supports QPX, or if QPX is
1365 // specifically enabled, default to using the ABI that supports QPX (so
1366 // long as it is not specifically disabled).
1367 bool HasQPX = false;
1368 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1369 HasQPX = A->getValue() == StringRef("a2q");
1370 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1371 if (HasQPX) {
1372 ABIName = "elfv1-qpx";
1373 break;
1374 }
1375
Ulrich Weigand8afad612014-07-28 13:17:52 +00001376 ABIName = "elfv1";
1377 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001378 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001379 case llvm::Triple::ppc64le:
1380 ABIName = "elfv2";
1381 break;
1382 default:
1383 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001384 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001385
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001386 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1387 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1388 // the option if given as we don't have backend support for any targets
1389 // that don't use the altivec abi.
1390 if (StringRef(A->getValue()) != "altivec")
1391 ABIName = A->getValue();
1392
Ulrich Weigand8afad612014-07-28 13:17:52 +00001393 if (ABIName) {
1394 CmdArgs.push_back("-target-abi");
1395 CmdArgs.push_back(ABIName);
1396 }
1397}
1398
1399bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1400 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1401 return A && (A->getValue() == StringRef(Value));
1402}
1403
Tom Stellard6674c702013-04-01 20:56:53 +00001404/// Get the (LLVM) name of the R600 gpu we are targeting.
1405static std::string getR600TargetGPU(const ArgList &Args) {
1406 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001407 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001408 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001409 .Cases("rv630", "rv635", "r600")
1410 .Cases("rv610", "rv620", "rs780", "rs880")
1411 .Case("rv740", "rv770")
1412 .Case("palm", "cedar")
1413 .Cases("sumo", "sumo2", "sumo")
1414 .Case("hemlock", "cypress")
1415 .Case("aruba", "cayman")
1416 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001417 }
1418 return "";
1419}
1420
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001421void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001422 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001423 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001424 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001425
James Y Knightb2406522015-06-15 20:51:24 +00001426 bool SoftFloatABI = false;
1427 if (Arg *A =
1428 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001429 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001430 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001431 }
1432
James Y Knightb2406522015-06-15 20:51:24 +00001433 // Only the hard-float ABI on Sparc is standardized, and it is the
1434 // default. GCC also supports a nonstandard soft-float ABI mode, and
1435 // perhaps LLVM should implement that, too. However, since llvm
1436 // currently does not support Sparc soft-float, at all, display an
1437 // error if it's requested.
1438 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001439 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1440 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001441 }
1442}
1443
Richard Sandiford4652d892013-07-19 16:51:51 +00001444static const char *getSystemZTargetCPU(const ArgList &Args) {
1445 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1446 return A->getValue();
1447 return "z10";
1448}
1449
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001450static void getSystemZTargetFeatures(const ArgList &Args,
1451 std::vector<const char *> &Features) {
1452 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001453 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001454 if (A->getOption().matches(options::OPT_mhtm))
1455 Features.push_back("+transactional-execution");
1456 else
1457 Features.push_back("-transactional-execution");
1458 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001459 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001460 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001461 if (A->getOption().matches(options::OPT_mvx))
1462 Features.push_back("+vector");
1463 else
1464 Features.push_back("-vector");
1465 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001466}
1467
Chandler Carruth953fb082013-01-13 11:46:33 +00001468static const char *getX86TargetCPU(const ArgList &Args,
1469 const llvm::Triple &Triple) {
1470 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001471 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001472 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001473 return "core-avx2";
1474
Chandler Carruth953fb082013-01-13 11:46:33 +00001475 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001476 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001477
1478 // FIXME: Reject attempts to use -march=native unless the target matches
1479 // the host.
1480 //
1481 // FIXME: We should also incorporate the detected target features for use
1482 // with -native.
1483 std::string CPU = llvm::sys::getHostCPUName();
1484 if (!CPU.empty() && CPU != "generic")
1485 return Args.MakeArgString(CPU);
1486 }
1487
Reid Kleckner3123eff2015-06-30 16:32:04 +00001488 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1489 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1490 StringRef Arch = A->getValue();
1491 const char *CPU;
1492 if (Triple.getArch() == llvm::Triple::x86) {
1493 CPU = llvm::StringSwitch<const char *>(Arch)
1494 .Case("IA32", "i386")
1495 .Case("SSE", "pentium3")
1496 .Case("SSE2", "pentium4")
1497 .Case("AVX", "sandybridge")
1498 .Case("AVX2", "haswell")
1499 .Default(nullptr);
1500 } else {
1501 CPU = llvm::StringSwitch<const char *>(Arch)
1502 .Case("AVX", "sandybridge")
1503 .Case("AVX2", "haswell")
1504 .Default(nullptr);
1505 }
1506 if (CPU)
1507 return CPU;
1508 }
1509
Chandler Carruth953fb082013-01-13 11:46:33 +00001510 // Select the default CPU if none was given (or detection failed).
1511
1512 if (Triple.getArch() != llvm::Triple::x86_64 &&
1513 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001514 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001515
1516 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1517
1518 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001519 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001520 if (Triple.getArchName() == "x86_64h")
1521 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001522 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001523 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001524
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001525 // Set up default CPU name for PS4 compilers.
1526 if (Triple.isPS4CPU())
1527 return "btver2";
1528
Alexey Bataev286d1b92014-01-31 04:07:13 +00001529 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001530 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001531 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001532
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001533 // Everything else goes to x86-64 in 64-bit mode.
1534 if (Is64Bit)
1535 return "x86-64";
1536
1537 switch (Triple.getOS()) {
1538 case llvm::Triple::FreeBSD:
1539 case llvm::Triple::NetBSD:
1540 case llvm::Triple::OpenBSD:
1541 return "i486";
1542 case llvm::Triple::Haiku:
1543 return "i586";
1544 case llvm::Triple::Bitrig:
1545 return "i686";
1546 default:
1547 // Fallback to p4.
1548 return "pentium4";
1549 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001550}
1551
Dan Gohmanc2853072015-09-03 22:51:53 +00001552/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1553static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1554 // If we have -mcpu=, use that.
1555 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1556 StringRef CPU = A->getValue();
1557
1558#ifdef __wasm__
1559 // Handle "native" by examining the host. "native" isn't meaningful when
1560 // cross compiling, so only support this when the host is also WebAssembly.
1561 if (CPU == "native")
1562 return llvm::sys::getHostCPUName();
1563#endif
1564
1565 return CPU;
1566 }
1567
1568 return "generic";
1569}
1570
Renato Golin7c542b42015-07-27 23:44:45 +00001571static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1572 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001573 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001574 default:
1575 return "";
1576
Amara Emerson703da2e2013-10-31 09:32:33 +00001577 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001578 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001579 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001580
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001581 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001582 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001583 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001584 case llvm::Triple::thumbeb: {
1585 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001586 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001587 return arm::getARMTargetCPU(MCPU, MArch, T);
1588 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001589 case llvm::Triple::mips:
1590 case llvm::Triple::mipsel:
1591 case llvm::Triple::mips64:
1592 case llvm::Triple::mips64el: {
1593 StringRef CPUName;
1594 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001595 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001596 return CPUName;
1597 }
1598
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001599 case llvm::Triple::nvptx:
1600 case llvm::Triple::nvptx64:
1601 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1602 return A->getValue();
1603 return "";
1604
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001605 case llvm::Triple::ppc:
1606 case llvm::Triple::ppc64:
1607 case llvm::Triple::ppc64le: {
1608 std::string TargetCPUName = getPPCTargetCPU(Args);
1609 // LLVM may default to generating code for the native CPU,
1610 // but, like gcc, we default to a more generic option for
1611 // each architecture. (except on Darwin)
1612 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1613 if (T.getArch() == llvm::Triple::ppc64)
1614 TargetCPUName = "ppc64";
1615 else if (T.getArch() == llvm::Triple::ppc64le)
1616 TargetCPUName = "ppc64le";
1617 else
1618 TargetCPUName = "ppc";
1619 }
1620 return TargetCPUName;
1621 }
1622
1623 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001624 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001625 case llvm::Triple::sparcv9:
1626 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001627 return A->getValue();
1628 return "";
1629
1630 case llvm::Triple::x86:
1631 case llvm::Triple::x86_64:
1632 return getX86TargetCPU(Args, T);
1633
1634 case llvm::Triple::hexagon:
Douglas Katzman54366072015-07-27 16:53:08 +00001635 return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001636
1637 case llvm::Triple::systemz:
1638 return getSystemZTargetCPU(Args);
1639
1640 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001641 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001642 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001643
1644 case llvm::Triple::wasm32:
1645 case llvm::Triple::wasm64:
1646 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001647 }
1648}
1649
Alp Tokerce365ca2013-12-02 12:43:03 +00001650static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1651 ArgStringList &CmdArgs) {
1652 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1653 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1654 // forward.
1655 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001656 std::string Plugin =
1657 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001658 CmdArgs.push_back(Args.MakeArgString(Plugin));
1659
1660 // Try to pass driver level flags relevant to LTO code generation down to
1661 // the plugin.
1662
1663 // Handle flags for selecting CPU variants.
1664 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1665 if (!CPU.empty())
1666 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1667}
1668
Sanjay Patel2987c292015-06-11 14:53:41 +00001669/// This is a helper function for validating the optional refinement step
1670/// parameter in reciprocal argument strings. Return false if there is an error
1671/// parsing the refinement step. Otherwise, return true and set the Position
1672/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001673static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001674 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001675 const char RefinementStepToken = ':';
1676 Position = In.find(RefinementStepToken);
1677 if (Position != StringRef::npos) {
1678 StringRef Option = A.getOption().getName();
1679 StringRef RefStep = In.substr(Position + 1);
1680 // Allow exactly one numeric character for the additional refinement
1681 // step parameter. This is reasonable for all currently-supported
1682 // operations and architectures because we would expect that a larger value
1683 // of refinement steps would cause the estimate "optimization" to
1684 // under-perform the native operation. Also, if the estimate does not
1685 // converge quickly, it probably will not ever converge, so further
1686 // refinement steps will not produce a better answer.
1687 if (RefStep.size() != 1) {
1688 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1689 return false;
1690 }
1691 char RefStepChar = RefStep[0];
1692 if (RefStepChar < '0' || RefStepChar > '9') {
1693 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1694 return false;
1695 }
1696 }
1697 return true;
1698}
1699
1700/// The -mrecip flag requires processing of many optional parameters.
1701static void ParseMRecip(const Driver &D, const ArgList &Args,
1702 ArgStringList &OutStrings) {
1703 StringRef DisabledPrefixIn = "!";
1704 StringRef DisabledPrefixOut = "!";
1705 StringRef EnabledPrefixOut = "";
1706 StringRef Out = "-mrecip=";
1707
1708 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1709 if (!A)
1710 return;
1711
1712 unsigned NumOptions = A->getNumValues();
1713 if (NumOptions == 0) {
1714 // No option is the same as "all".
1715 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1716 return;
1717 }
1718
1719 // Pass through "all", "none", or "default" with an optional refinement step.
1720 if (NumOptions == 1) {
1721 StringRef Val = A->getValue(0);
1722 size_t RefStepLoc;
1723 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1724 return;
1725 StringRef ValBase = Val.slice(0, RefStepLoc);
1726 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1727 OutStrings.push_back(Args.MakeArgString(Out + Val));
1728 return;
1729 }
1730 }
1731
1732 // Each reciprocal type may be enabled or disabled individually.
1733 // Check each input value for validity, concatenate them all back together,
1734 // and pass through.
1735
1736 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001737 OptionStrings.insert(std::make_pair("divd", false));
1738 OptionStrings.insert(std::make_pair("divf", false));
1739 OptionStrings.insert(std::make_pair("vec-divd", false));
1740 OptionStrings.insert(std::make_pair("vec-divf", false));
1741 OptionStrings.insert(std::make_pair("sqrtd", false));
1742 OptionStrings.insert(std::make_pair("sqrtf", false));
1743 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1744 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001745
1746 for (unsigned i = 0; i != NumOptions; ++i) {
1747 StringRef Val = A->getValue(i);
1748
1749 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1750 // Ignore the disablement token for string matching.
1751 if (IsDisabled)
1752 Val = Val.substr(1);
1753
1754 size_t RefStep;
1755 if (!getRefinementStep(Val, D, *A, RefStep))
1756 return;
1757
1758 StringRef ValBase = Val.slice(0, RefStep);
1759 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1760 if (OptionIter == OptionStrings.end()) {
1761 // Try again specifying float suffix.
1762 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1763 if (OptionIter == OptionStrings.end()) {
1764 // The input name did not match any known option string.
1765 D.Diag(diag::err_drv_unknown_argument) << Val;
1766 return;
1767 }
1768 // The option was specified without a float or double suffix.
1769 // Make sure that the double entry was not already specified.
1770 // The float entry will be checked below.
1771 if (OptionStrings[ValBase.str() + 'd']) {
1772 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1773 return;
1774 }
1775 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001776
Sanjay Patel2987c292015-06-11 14:53:41 +00001777 if (OptionIter->second == true) {
1778 // Duplicate option specified.
1779 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1780 return;
1781 }
1782
1783 // Mark the matched option as found. Do not allow duplicate specifiers.
1784 OptionIter->second = true;
1785
1786 // If the precision was not specified, also mark the double entry as found.
1787 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1788 OptionStrings[ValBase.str() + 'd'] = true;
1789
1790 // Build the output string.
1791 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1792 Out = Args.MakeArgString(Out + Prefix + Val);
1793 if (i != NumOptions - 1)
1794 Out = Args.MakeArgString(Out + ",");
1795 }
1796
1797 OutStrings.push_back(Args.MakeArgString(Out));
1798}
1799
Eric Christopherc54920a2015-03-23 19:26:05 +00001800static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001801 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001802 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001803 // If -march=native, autodetect the feature list.
1804 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1805 if (StringRef(A->getValue()) == "native") {
1806 llvm::StringMap<bool> HostFeatures;
1807 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1808 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001809 Features.push_back(
1810 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001811 }
1812 }
1813
Jim Grosbach82eee262013-11-16 00:53:35 +00001814 if (Triple.getArchName() == "x86_64h") {
1815 // x86_64h implies quite a few of the more modern subtarget features
1816 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1817 Features.push_back("-rdrnd");
1818 Features.push_back("-aes");
1819 Features.push_back("-pclmul");
1820 Features.push_back("-rtm");
1821 Features.push_back("-hle");
1822 Features.push_back("-fsgsbase");
1823 }
1824
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001825 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001826 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001827 if (Triple.getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001828 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001829 Features.push_back("+sse4.2");
1830 Features.push_back("+popcnt");
1831 } else
1832 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001833 }
1834
Eric Christopherc54920a2015-03-23 19:26:05 +00001835 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001836 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1837 StringRef Arch = A->getValue();
1838 bool ArchUsed = false;
1839 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001840 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001841 if (Arch == "AVX" || Arch == "AVX2") {
1842 ArchUsed = true;
1843 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1844 }
1845 }
1846 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001847 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001848 if (Arch == "IA32") {
1849 ArchUsed = true;
1850 } else if (Arch == "SSE" || Arch == "SSE2") {
1851 ArchUsed = true;
1852 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1853 }
1854 }
1855 if (!ArchUsed)
1856 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1857 }
1858
Jim Grosbach82eee262013-11-16 00:53:35 +00001859 // Now add any that the user explicitly requested on the command line,
1860 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001861 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1862 StringRef Name = A->getOption().getName();
1863 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001864
1865 // Skip over "-m".
1866 assert(Name.startswith("m") && "Invalid feature name.");
1867 Name = Name.substr(1);
1868
1869 bool IsNegative = Name.startswith("no-");
1870 if (IsNegative)
1871 Name = Name.substr(3);
1872
1873 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1874 }
1875}
1876
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001877void Clang::AddX86TargetArgs(const ArgList &Args,
1878 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001879 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001880 Args.hasArg(options::OPT_mkernel) ||
1881 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001882 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001883
Bob Wilson2616e2e2013-02-10 16:01:41 +00001884 // Default to avoid implicit floating-point for kernel/kext code, but allow
1885 // that to be overridden with -mno-soft-float.
1886 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1887 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001888 if (Arg *A = Args.getLastArg(
1889 options::OPT_msoft_float, options::OPT_mno_soft_float,
1890 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001891 const Option &O = A->getOption();
1892 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1893 O.matches(options::OPT_msoft_float));
1894 }
1895 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001896 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001897
1898 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1899 StringRef Value = A->getValue();
1900 if (Value == "intel" || Value == "att") {
1901 CmdArgs.push_back("-mllvm");
1902 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1903 } else {
1904 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1905 << A->getOption().getName() << Value;
1906 }
1907 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001908}
1909
Tony Linthicum76329bf2011-12-12 21:14:55 +00001910void Clang::AddHexagonTargetArgs(const ArgList &Args,
1911 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001912 CmdArgs.push_back("-mqdsp6-compat");
1913 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001914
Douglas Katzman54366072015-07-27 16:53:08 +00001915 if (const char *v =
1916 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001917 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001918 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001919 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001920 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001921 }
1922
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001923 if (!Args.hasArg(options::OPT_fno_short_enums))
1924 CmdArgs.push_back("-fshort-enums");
1925 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001926 CmdArgs.push_back("-mllvm");
1927 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001928 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001929 CmdArgs.push_back("-mllvm");
1930 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001931}
1932
Kevin Qin110db6f2014-07-18 07:03:22 +00001933// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001934static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001935 std::vector<const char *> &Features) {
1936 SmallVector<StringRef, 8> Split;
1937 text.split(Split, StringRef("+"), -1, false);
1938
Benjamin Kramer72e64312015-09-24 14:48:49 +00001939 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00001940 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00001941 .Case("fp", "+fp-armv8")
1942 .Case("simd", "+neon")
1943 .Case("crc", "+crc")
1944 .Case("crypto", "+crypto")
1945 .Case("nofp", "-fp-armv8")
1946 .Case("nosimd", "-neon")
1947 .Case("nocrc", "-crc")
1948 .Case("nocrypto", "-crypto")
1949 .Default(nullptr);
1950 if (result)
1951 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00001952 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00001953 D.Diag(diag::err_drv_no_neon_modifier);
1954 else
1955 return false;
1956 }
1957 return true;
1958}
1959
1960// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1961// decode CPU and feature.
1962static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1963 std::vector<const char *> &Features) {
1964 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1965 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001966 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
1967 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001968 Features.push_back("+neon");
1969 Features.push_back("+crc");
1970 Features.push_back("+crypto");
1971 } else if (CPU == "generic") {
1972 Features.push_back("+neon");
1973 } else {
1974 return false;
1975 }
1976
1977 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1978 return false;
1979
1980 return true;
1981}
1982
1983static bool
1984getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1985 const ArgList &Args,
1986 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00001987 std::string MarchLowerCase = March.lower();
1988 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001989
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001990 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001991 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001992 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001993 Features.push_back("+v8.1a");
1994 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001995 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001996 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001997
1998 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1999 return false;
2000
2001 return true;
2002}
2003
2004static bool
2005getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2006 const ArgList &Args,
2007 std::vector<const char *> &Features) {
2008 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002009 std::string McpuLowerCase = Mcpu.lower();
2010 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002011 return false;
2012
2013 return true;
2014}
2015
2016static bool
2017getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2018 const ArgList &Args,
2019 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002020 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002021 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002022 if (MtuneLowerCase == "native")
2023 MtuneLowerCase = llvm::sys::getHostCPUName();
2024 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002025 Features.push_back("+zcm");
2026 Features.push_back("+zcz");
2027 }
2028 return true;
2029}
2030
2031static bool
2032getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2033 const ArgList &Args,
2034 std::vector<const char *> &Features) {
2035 StringRef CPU;
2036 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002037 std::string McpuLowerCase = Mcpu.lower();
2038 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002039 return false;
2040
2041 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2042}
2043
Akira Hatanaka92500472015-07-27 19:29:04 +00002044static void getAArch64TargetFeatures(const Driver &D,
2045 const llvm::Triple &Triple,
2046 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002047 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002048 Arg *A;
2049 bool success = true;
2050 // Enable NEON by default.
2051 Features.push_back("+neon");
2052 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2053 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2054 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2055 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002056 else if (Args.hasArg(options::OPT_arch))
2057 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2058 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002059
2060 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2061 success =
2062 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2063 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2064 success =
2065 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002066 else if (Args.hasArg(options::OPT_arch))
2067 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2068 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002069
2070 if (!success)
2071 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002072
2073 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2074 Features.push_back("-fp-armv8");
2075 Features.push_back("-crypto");
2076 Features.push_back("-neon");
2077 }
Bradley Smith418c5932014-05-02 15:17:51 +00002078
2079 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002080 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002081 if (A->getOption().matches(options::OPT_mcrc))
2082 Features.push_back("+crc");
2083 else
2084 Features.push_back("-crc");
2085 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002086
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002087 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2088 options::OPT_munaligned_access))
2089 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2090 Features.push_back("+strict-align");
2091
Akira Hatanaka92500472015-07-27 19:29:04 +00002092 if (Args.hasArg(options::OPT_ffixed_x18) || Triple.isOSDarwin())
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002093 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002094}
2095
Dan Gohmanc2853072015-09-03 22:51:53 +00002096static void getWebAssemblyTargetFeatures(const ArgList &Args,
2097 std::vector<const char *> &Features) {
2098 for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) {
2099 StringRef Name = A->getOption().getName();
2100 A->claim();
2101
2102 // Skip over "-m".
2103 assert(Name.startswith("m") && "Invalid feature name.");
2104 Name = Name.substr(1);
2105
2106 bool IsNegative = Name.startswith("no-");
2107 if (IsNegative)
2108 Name = Name.substr(3);
2109
2110 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2111 }
2112}
2113
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002114static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002115 const ArgList &Args, ArgStringList &CmdArgs,
2116 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002117 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002118 std::vector<const char *> Features;
2119 switch (Triple.getArch()) {
2120 default:
2121 break;
2122 case llvm::Triple::mips:
2123 case llvm::Triple::mipsel:
2124 case llvm::Triple::mips64:
2125 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002126 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002127 break;
2128
2129 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002130 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002131 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002132 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002133 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002134 break;
2135
2136 case llvm::Triple::ppc:
2137 case llvm::Triple::ppc64:
2138 case llvm::Triple::ppc64le:
2139 getPPCTargetFeatures(Args, Features);
2140 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002141 case llvm::Triple::systemz:
2142 getSystemZTargetFeatures(Args, Features);
2143 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002144 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002145 case llvm::Triple::aarch64_be:
Akira Hatanaka92500472015-07-27 19:29:04 +00002146 getAArch64TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002147 break;
2148 case llvm::Triple::x86:
2149 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002150 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002151 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002152 case llvm::Triple::wasm32:
2153 case llvm::Triple::wasm64:
2154 getWebAssemblyTargetFeatures(Args, Features);
2155 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002156 }
Rafael Espindola43964802013-08-21 17:34:32 +00002157
2158 // Find the last of each feature.
2159 llvm::StringMap<unsigned> LastOpt;
2160 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2161 const char *Name = Features[I];
2162 assert(Name[0] == '-' || Name[0] == '+');
2163 LastOpt[Name + 1] = I;
2164 }
2165
2166 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2167 // If this feature was overridden, ignore it.
2168 const char *Name = Features[I];
2169 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2170 assert(LastI != LastOpt.end());
2171 unsigned Last = LastI->second;
2172 if (Last != I)
2173 continue;
2174
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002175 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002176 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002177 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002178}
2179
David Majnemerae394812014-12-09 00:12:30 +00002180static bool
2181shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2182 const llvm::Triple &Triple) {
2183 // We use the zero-cost exception tables for Objective-C if the non-fragile
2184 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2185 // later.
2186 if (runtime.isNonFragile())
2187 return true;
2188
2189 if (!Triple.isMacOSX())
2190 return false;
2191
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002192 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002193 (Triple.getArch() == llvm::Triple::x86_64 ||
2194 Triple.getArch() == llvm::Triple::arm));
2195}
2196
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002197/// Adds exception related arguments to the driver command arguments. There's a
2198/// master flag, -fexceptions and also language specific flags to enable/disable
2199/// C++ and Objective-C exceptions. This makes it possible to for example
2200/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002201static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002202 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002203 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002204 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002205 const Driver &D = TC.getDriver();
2206 const llvm::Triple &Triple = TC.getTriple();
2207
Chad Rosier4fab82c2012-03-26 22:04:46 +00002208 if (KernelOrKext) {
2209 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2210 // arguments now to avoid warnings about unused arguments.
2211 Args.ClaimAllArgs(options::OPT_fexceptions);
2212 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2213 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2214 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2215 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2216 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002217 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002218 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002219
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002220 // See if the user explicitly enabled exceptions.
2221 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2222 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002223
David Majnemerae394812014-12-09 00:12:30 +00002224 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2225 // is not necessarily sensible, but follows GCC.
2226 if (types::isObjC(InputType) &&
2227 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002228 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002229 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002230
David Majnemerae394812014-12-09 00:12:30 +00002231 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002232 }
2233
2234 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002235 // Disable C++ EH by default on XCore, PS4, and MSVC.
2236 // FIXME: Remove MSVC from this list once things work.
2237 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2238 !Triple.isPS4CPU() &&
2239 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002240 Arg *ExceptionArg = Args.getLastArg(
2241 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2242 options::OPT_fexceptions, options::OPT_fno_exceptions);
2243 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002244 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002245 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2246 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002247
2248 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002249 if (Triple.isPS4CPU()) {
2250 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2251 assert(ExceptionArg &&
2252 "On the PS4 exceptions should only be enabled if passing "
2253 "an argument");
2254 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2255 const Arg *RTTIArg = TC.getRTTIArg();
2256 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2257 D.Diag(diag::err_drv_argument_not_allowed_with)
2258 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2259 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2260 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2261 } else
2262 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2263
Anders Carlssone96ab552011-02-28 02:27:16 +00002264 CmdArgs.push_back("-fcxx-exceptions");
2265
David Majnemer8de68642014-12-05 08:11:58 +00002266 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002267 }
2268 }
2269
David Majnemer8de68642014-12-05 08:11:58 +00002270 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002271 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002272}
2273
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002274static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002275 bool Default = true;
2276 if (TC.getTriple().isOSDarwin()) {
2277 // The native darwin assembler doesn't support the linker_option directives,
2278 // so we disable them if we think the .s file will be passed to it.
2279 Default = TC.useIntegratedAs();
2280 }
2281 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2282 Default);
2283}
2284
Ted Kremenek62093662013-03-12 17:02:12 +00002285static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2286 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002287 bool UseDwarfDirectory =
2288 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2289 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002290 return !UseDwarfDirectory;
2291}
2292
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002293/// \brief Check whether the given input tree contains any compilation actions.
2294static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002295 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002296 return true;
2297
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002298 for (const auto &Act : *A)
2299 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002300 return true;
2301
2302 return false;
2303}
2304
2305/// \brief Check if -relax-all should be passed to the internal assembler.
2306/// This is done by default when compiling non-assembler source with -O0.
2307static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2308 bool RelaxDefault = true;
2309
2310 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2311 RelaxDefault = A->getOption().matches(options::OPT_O0);
2312
2313 if (RelaxDefault) {
2314 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002315 for (const auto &Act : C.getActions()) {
2316 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002317 RelaxDefault = true;
2318 break;
2319 }
2320 }
2321 }
2322
2323 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002324 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002325}
2326
David Blaikie9260ed62013-07-25 21:19:01 +00002327static void CollectArgsForIntegratedAssembler(Compilation &C,
2328 const ArgList &Args,
2329 ArgStringList &CmdArgs,
2330 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002331 if (UseRelaxAll(C, Args))
2332 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002333
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002334 // When passing -I arguments to the assembler we sometimes need to
2335 // unconditionally take the next argument. For example, when parsing
2336 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2337 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2338 // arg after parsing the '-I' arg.
2339 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002340
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002341 // When using an integrated assembler, translate -Wa, and -Xassembler
2342 // options.
2343 bool CompressDebugSections = false;
2344 for (const Arg *A :
2345 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2346 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002347
Benjamin Kramer72e64312015-09-24 14:48:49 +00002348 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002349 if (TakeNextArg) {
2350 CmdArgs.push_back(Value.data());
2351 TakeNextArg = false;
2352 continue;
2353 }
David Blaikie9260ed62013-07-25 21:19:01 +00002354
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002355 if (Value == "-force_cpusubtype_ALL") {
2356 // Do nothing, this is the default and we don't support anything else.
2357 } else if (Value == "-L") {
2358 CmdArgs.push_back("-msave-temp-labels");
2359 } else if (Value == "--fatal-warnings") {
2360 CmdArgs.push_back("-massembler-fatal-warnings");
2361 } else if (Value == "--noexecstack") {
2362 CmdArgs.push_back("-mnoexecstack");
2363 } else if (Value == "-compress-debug-sections" ||
2364 Value == "--compress-debug-sections") {
2365 CompressDebugSections = true;
2366 } else if (Value == "-nocompress-debug-sections" ||
2367 Value == "--nocompress-debug-sections") {
2368 CompressDebugSections = false;
2369 } else if (Value.startswith("-I")) {
2370 CmdArgs.push_back(Value.data());
2371 // We need to consume the next argument if the current arg is a plain
2372 // -I. The next arg will be the include directory.
2373 if (Value == "-I")
2374 TakeNextArg = true;
2375 } else if (Value.startswith("-gdwarf-")) {
2376 CmdArgs.push_back(Value.data());
Renato Golin7c542b42015-07-27 23:44:45 +00002377 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2378 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2379 // Do nothing, we'll validate it later.
Daniel Sanders4f7cd232015-09-03 12:58:39 +00002380 } else if (Value == "--trap") {
2381 CmdArgs.push_back("-target-feature");
2382 CmdArgs.push_back("+use-tcc-in-div");
2383 } else if (Value == "--break") {
2384 CmdArgs.push_back("-target-feature");
2385 CmdArgs.push_back("-use-tcc-in-div");
Daniel Sanders63f28262015-09-22 13:52:32 +00002386 } else if (Value.startswith("-msoft-float")) {
2387 CmdArgs.push_back("-target-feature");
2388 CmdArgs.push_back("+soft-float");
2389 } else if (Value.startswith("-mhard-float")) {
2390 CmdArgs.push_back("-target-feature");
2391 CmdArgs.push_back("-soft-float");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002392 } else {
2393 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002394 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002395 }
2396 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002397 }
2398 if (CompressDebugSections) {
2399 if (llvm::zlib::isAvailable())
2400 CmdArgs.push_back("-compress-debug-sections");
2401 else
2402 D.Diag(diag::warn_debug_compression_unavailable);
2403 }
David Blaikie9260ed62013-07-25 21:19:01 +00002404}
2405
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00002406static const char *getCompilerRTArgString(const ToolChain &TC,
2407 const llvm::opt::ArgList &Args,
2408 StringRef Component,
2409 bool Shared = false) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002410 return Args.MakeArgString(TC.getCompilerRT(Args, Component, Shared));
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00002411}
2412
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002413// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002414// FIXME: Make sure we can also emit shared objects if they're requested
2415// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002416static void addClangRT(const ToolChain &TC, const ArgList &Args,
2417 ArgStringList &CmdArgs) {
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00002418 CmdArgs.push_back(getCompilerRTArgString(TC, Args, "builtins"));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002419}
2420
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002421static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2422 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002423 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2424 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002425 Args.hasArg(options::OPT_fprofile_generate) ||
Diego Novillo578caf52015-07-09 17:23:53 +00002426 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002427 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002428 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002429 Args.hasArg(options::OPT_fcreate_profile) ||
2430 Args.hasArg(options::OPT_coverage)))
2431 return;
2432
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00002433 CmdArgs.push_back(getCompilerRTArgString(TC, Args, "profile"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002434}
2435
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002436namespace {
2437enum OpenMPRuntimeKind {
2438 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2439 /// without knowing what runtime to target.
2440 OMPRT_Unknown,
2441
2442 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2443 /// the default for Clang.
2444 OMPRT_OMP,
2445
2446 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2447 /// this runtime but can swallow the pragmas, and find and link against the
2448 /// runtime library itself.
2449 OMPRT_GOMP,
2450
Chandler Carruthc6625c62015-05-28 21:10:31 +00002451 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002452 /// OpenMP runtime. We support this mode for users with existing dependencies
2453 /// on this runtime library name.
2454 OMPRT_IOMP5
2455};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002456}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002457
2458/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002459static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2460 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002461 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2462
2463 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2464 if (A)
2465 RuntimeName = A->getValue();
2466
2467 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002468 .Case("libomp", OMPRT_OMP)
2469 .Case("libgomp", OMPRT_GOMP)
2470 .Case("libiomp5", OMPRT_IOMP5)
2471 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002472
2473 if (RT == OMPRT_Unknown) {
2474 if (A)
2475 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002476 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002477 else
2478 // FIXME: We could use a nicer diagnostic here.
2479 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2480 }
2481
2482 return RT;
2483}
2484
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002485static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2486 const ArgList &Args) {
2487 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2488 options::OPT_fno_openmp, false))
2489 return;
2490
2491 switch (getOpenMPRuntime(TC, Args)) {
2492 case OMPRT_OMP:
2493 CmdArgs.push_back("-lomp");
2494 break;
2495 case OMPRT_GOMP:
2496 CmdArgs.push_back("-lgomp");
2497 break;
2498 case OMPRT_IOMP5:
2499 CmdArgs.push_back("-liomp5");
2500 break;
2501 case OMPRT_Unknown:
2502 // Already diagnosed.
2503 break;
2504 }
2505}
2506
Alexey Samsonov52550342014-09-15 19:58:40 +00002507static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2508 ArgStringList &CmdArgs, StringRef Sanitizer,
2509 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002510 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002511 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002512 if (!IsShared)
2513 CmdArgs.push_back("-whole-archive");
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00002514 CmdArgs.push_back(getCompilerRTArgString(TC, Args, Sanitizer, IsShared));
Alexey Samsonov52550342014-09-15 19:58:40 +00002515 if (!IsShared)
2516 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002517}
2518
Alexey Samsonov52550342014-09-15 19:58:40 +00002519// Tries to use a file with the list of dynamic symbols that need to be exported
2520// from the runtime library. Returns true if the file was found.
2521static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2522 ArgStringList &CmdArgs,
2523 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002524 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002525 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2526 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002527 return true;
2528 }
2529 return false;
2530}
2531
2532static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2533 ArgStringList &CmdArgs) {
2534 // Force linking against the system libraries sanitizers depends on
2535 // (see PR15823 why this is necessary).
2536 CmdArgs.push_back("--no-as-needed");
2537 CmdArgs.push_back("-lpthread");
2538 CmdArgs.push_back("-lrt");
2539 CmdArgs.push_back("-lm");
2540 // There's no libdl on FreeBSD.
2541 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2542 CmdArgs.push_back("-ldl");
2543}
2544
2545static void
2546collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2547 SmallVectorImpl<StringRef> &SharedRuntimes,
2548 SmallVectorImpl<StringRef> &StaticRuntimes,
2549 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2550 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2551 // Collect shared runtimes.
2552 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2553 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002554 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002555
Alexey Samsonov52550342014-09-15 19:58:40 +00002556 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002557 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002558 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2559 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002560 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002561 }
2562 if (SanArgs.needsAsanRt()) {
2563 if (SanArgs.needsSharedAsanRt()) {
2564 HelperStaticRuntimes.push_back("asan-preinit");
2565 } else {
2566 StaticRuntimes.push_back("asan");
2567 if (SanArgs.linkCXXRuntimes())
2568 StaticRuntimes.push_back("asan_cxx");
2569 }
2570 }
2571 if (SanArgs.needsDfsanRt())
2572 StaticRuntimes.push_back("dfsan");
2573 if (SanArgs.needsLsanRt())
2574 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002575 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002576 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002577 if (SanArgs.linkCXXRuntimes())
2578 StaticRuntimes.push_back("msan_cxx");
2579 }
2580 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002581 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002582 if (SanArgs.linkCXXRuntimes())
2583 StaticRuntimes.push_back("tsan_cxx");
2584 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002585 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002586 StaticRuntimes.push_back("ubsan_standalone");
2587 if (SanArgs.linkCXXRuntimes())
2588 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002589 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002590 if (SanArgs.needsSafeStackRt())
2591 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002592}
2593
Alexey Samsonov52550342014-09-15 19:58:40 +00002594// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2595// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2596static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002597 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002598 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2599 HelperStaticRuntimes;
2600 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2601 HelperStaticRuntimes);
2602 for (auto RT : SharedRuntimes)
2603 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2604 for (auto RT : HelperStaticRuntimes)
2605 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2606 bool AddExportDynamic = false;
2607 for (auto RT : StaticRuntimes) {
2608 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2609 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2610 }
2611 // If there is a static runtime with no dynamic list, force all the symbols
2612 // to be dynamic to be sure we export sanitizer interface functions.
2613 if (AddExportDynamic)
2614 CmdArgs.push_back("-export-dynamic");
2615 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002616}
2617
Reid Kleckner86ea7702015-02-04 23:45:07 +00002618static bool areOptimizationsEnabled(const ArgList &Args) {
2619 // Find the last -O arg and see if it is non-zero.
2620 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2621 return !A->getOption().matches(options::OPT_O0);
2622 // Defaults to -O0.
2623 return false;
2624}
2625
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002626static bool shouldUseFramePointerForTarget(const ArgList &Args,
2627 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002628 switch (Triple.getArch()) {
2629 case llvm::Triple::xcore:
2630 case llvm::Triple::wasm32:
2631 case llvm::Triple::wasm64:
2632 // XCore never wants frame pointers, regardless of OS.
2633 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002634 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002635 default:
2636 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002637 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002638
2639 if (Triple.isOSLinux()) {
2640 switch (Triple.getArch()) {
2641 // Don't use a frame pointer on linux if optimizing for certain targets.
2642 case llvm::Triple::mips64:
2643 case llvm::Triple::mips64el:
2644 case llvm::Triple::mips:
2645 case llvm::Triple::mipsel:
2646 case llvm::Triple::systemz:
2647 case llvm::Triple::x86:
2648 case llvm::Triple::x86_64:
2649 return !areOptimizationsEnabled(Args);
2650 default:
2651 return true;
2652 }
2653 }
2654
2655 if (Triple.isOSWindows()) {
2656 switch (Triple.getArch()) {
2657 case llvm::Triple::x86:
2658 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002659 case llvm::Triple::arm:
2660 case llvm::Triple::thumb:
2661 // Windows on ARM builds with FPO disabled to aid fast stack walking
2662 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002663 default:
2664 // All other supported Windows ISAs use xdata unwind information, so frame
2665 // pointers are not generally useful.
2666 return false;
2667 }
2668 }
2669
2670 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002671}
2672
Rafael Espindola224dd632011-12-14 21:02:23 +00002673static bool shouldUseFramePointer(const ArgList &Args,
2674 const llvm::Triple &Triple) {
2675 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2676 options::OPT_fomit_frame_pointer))
2677 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2678
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002679 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002680}
2681
Eric Christopherb7d97e92013-04-03 01:58:53 +00002682static bool shouldUseLeafFramePointer(const ArgList &Args,
2683 const llvm::Triple &Triple) {
2684 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2685 options::OPT_momit_leaf_frame_pointer))
2686 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2687
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002688 if (Triple.isPS4CPU())
2689 return false;
2690
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002691 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002692}
2693
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002694/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002695static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002696 SmallString<128> cwd;
2697 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002698 CmdArgs.push_back("-fdebug-compilation-dir");
2699 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002700 }
2701}
2702
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002703static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002704 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2705 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2706 SmallString<128> T(FinalOutput->getValue());
2707 llvm::sys::path::replace_extension(T, "dwo");
2708 return Args.MakeArgString(T);
2709 } else {
2710 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002711 SmallString<128> T(
2712 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002713 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002714 llvm::sys::path::replace_extension(F, "dwo");
2715 T += F;
2716 return Args.MakeArgString(F);
2717 }
2718}
2719
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002720static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2721 const JobAction &JA, const ArgList &Args,
2722 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002723 ArgStringList ExtractArgs;
2724 ExtractArgs.push_back("--extract-dwo");
2725
2726 ArgStringList StripArgs;
2727 StripArgs.push_back("--strip-dwo");
2728
2729 // Grabbing the output of the earlier compile step.
2730 StripArgs.push_back(Output.getFilename());
2731 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002732 ExtractArgs.push_back(OutFile);
2733
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002734 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002735 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002736
2737 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002738 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002739
2740 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002741 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002742}
2743
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002744/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002745/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2746static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002747 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002748 if (A->getOption().matches(options::OPT_O4) ||
2749 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002750 return true;
2751
2752 if (A->getOption().matches(options::OPT_O0))
2753 return false;
2754
2755 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2756
Rafael Espindola91780de2013-08-26 14:05:41 +00002757 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002758 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002759 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002760 return true;
2761
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002762 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002763 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002764 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002765
2766 unsigned OptLevel = 0;
2767 if (S.getAsInteger(10, OptLevel))
2768 return false;
2769
2770 return OptLevel > 1;
2771 }
2772
2773 return false;
2774}
2775
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002776/// Add -x lang to \p CmdArgs for \p Input.
2777static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2778 ArgStringList &CmdArgs) {
2779 // When using -verify-pch, we don't want to provide the type
2780 // 'precompiled-header' if it was inferred from the file extension
2781 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2782 return;
2783
2784 CmdArgs.push_back("-x");
2785 if (Args.hasArg(options::OPT_rewrite_objc))
2786 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2787 else
2788 CmdArgs.push_back(types::getTypeName(Input.getType()));
2789}
2790
David Majnemerc371ff02015-03-22 08:39:22 +00002791static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002792 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002793 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002794
2795 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002796 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002797
2798 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002799 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002800 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002801 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002802}
2803
Rafael Espindola577637a2015-01-03 00:06:04 +00002804// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002805// options that build systems might add but are unused when assembling or only
2806// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002807static void claimNoWarnArgs(const ArgList &Args) {
2808 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002809 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002810 Args.ClaimAllArgs(options::OPT_flto);
2811 Args.ClaimAllArgs(options::OPT_fno_lto);
2812}
2813
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002814static void appendUserToPath(SmallVectorImpl<char> &Result) {
2815#ifdef LLVM_ON_UNIX
2816 const char *Username = getenv("LOGNAME");
2817#else
2818 const char *Username = getenv("USERNAME");
2819#endif
2820 if (Username) {
2821 // Validate that LoginName can be used in a path, and get its length.
2822 size_t Len = 0;
2823 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002824 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002825 Username = nullptr;
2826 break;
2827 }
2828 }
2829
2830 if (Username && Len > 0) {
2831 Result.append(Username, Username + Len);
2832 return;
2833 }
2834 }
2835
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002836// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002837#ifdef LLVM_ON_UNIX
2838 std::string UID = llvm::utostr(getuid());
2839#else
2840 // FIXME: Windows seems to have an 'SID' that might work.
2841 std::string UID = "9999";
2842#endif
2843 Result.append(UID.begin(), UID.end());
2844}
2845
David Majnemere11d3732015-06-08 00:22:46 +00002846VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2847 const llvm::Triple &Triple,
2848 const llvm::opt::ArgList &Args,
2849 bool IsWindowsMSVC) {
2850 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2851 IsWindowsMSVC) ||
2852 Args.hasArg(options::OPT_fmsc_version) ||
2853 Args.hasArg(options::OPT_fms_compatibility_version)) {
2854 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2855 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002856 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002857
2858 if (MSCVersion && MSCompatibilityVersion) {
2859 if (D)
2860 D->Diag(diag::err_drv_argument_not_allowed_with)
2861 << MSCVersion->getAsString(Args)
2862 << MSCompatibilityVersion->getAsString(Args);
2863 return VersionTuple();
2864 }
2865
2866 if (MSCompatibilityVersion) {
2867 VersionTuple MSVT;
2868 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2869 D->Diag(diag::err_drv_invalid_value)
2870 << MSCompatibilityVersion->getAsString(Args)
2871 << MSCompatibilityVersion->getValue();
2872 return MSVT;
2873 }
2874
2875 if (MSCVersion) {
2876 unsigned Version = 0;
2877 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2878 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2879 << MSCVersion->getValue();
2880 return getMSCompatibilityVersion(Version);
2881 }
2882
2883 unsigned Major, Minor, Micro;
2884 Triple.getEnvironmentVersion(Major, Minor, Micro);
2885 if (Major || Minor || Micro)
2886 return VersionTuple(Major, Minor, Micro);
2887
2888 return VersionTuple(18);
2889 }
2890 return VersionTuple();
2891}
2892
Diego Novilloa0545962015-07-10 18:00:07 +00002893static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2894 const InputInfo &Output, const ArgList &Args,
2895 ArgStringList &CmdArgs) {
2896 auto *ProfileGenerateArg = Args.getLastArg(
2897 options::OPT_fprofile_instr_generate,
2898 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00002899 options::OPT_fprofile_generate_EQ,
2900 options::OPT_fno_profile_instr_generate);
2901 if (ProfileGenerateArg &&
2902 ProfileGenerateArg->getOption().matches(
2903 options::OPT_fno_profile_instr_generate))
2904 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002905
2906 auto *ProfileUseArg = Args.getLastArg(
2907 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00002908 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2909 options::OPT_fno_profile_instr_use);
2910 if (ProfileUseArg &&
2911 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2912 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002913
2914 if (ProfileGenerateArg && ProfileUseArg)
2915 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00002916 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00002917
Diego Novillo758f3f52015-08-05 21:49:51 +00002918 if (ProfileGenerateArg) {
2919 if (ProfileGenerateArg->getOption().matches(
2920 options::OPT_fprofile_instr_generate_EQ))
2921 ProfileGenerateArg->render(Args, CmdArgs);
2922 else if (ProfileGenerateArg->getOption().matches(
2923 options::OPT_fprofile_generate_EQ)) {
2924 SmallString<128> Path(ProfileGenerateArg->getValue());
2925 llvm::sys::path::append(Path, "default.profraw");
2926 CmdArgs.push_back(
2927 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
2928 } else
2929 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2930 }
Diego Novilloa0545962015-07-10 18:00:07 +00002931
Diego Novillo758f3f52015-08-05 21:49:51 +00002932 if (ProfileUseArg) {
2933 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
2934 ProfileUseArg->render(Args, CmdArgs);
2935 else if ((ProfileUseArg->getOption().matches(
2936 options::OPT_fprofile_use_EQ) ||
2937 ProfileUseArg->getOption().matches(
2938 options::OPT_fprofile_instr_use))) {
2939 SmallString<128> Path(
2940 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
2941 if (Path.empty() || llvm::sys::fs::is_directory(Path))
2942 llvm::sys::path::append(Path, "default.profdata");
2943 CmdArgs.push_back(
2944 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
2945 }
Diego Novilloa0545962015-07-10 18:00:07 +00002946 }
2947
2948 if (Args.hasArg(options::OPT_ftest_coverage) ||
2949 Args.hasArg(options::OPT_coverage))
2950 CmdArgs.push_back("-femit-coverage-notes");
2951 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2952 false) ||
2953 Args.hasArg(options::OPT_coverage))
2954 CmdArgs.push_back("-femit-coverage-data");
2955
Diego Novilloc4b94da2015-08-05 23:27:40 +00002956 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2957 options::OPT_fno_coverage_mapping, false) &&
2958 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00002959 D.Diag(diag::err_drv_argument_only_allowed_with)
2960 << "-fcoverage-mapping"
2961 << "-fprofile-instr-generate";
2962
Diego Novilloc4b94da2015-08-05 23:27:40 +00002963 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2964 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00002965 CmdArgs.push_back("-fcoverage-mapping");
2966
2967 if (C.getArgs().hasArg(options::OPT_c) ||
2968 C.getArgs().hasArg(options::OPT_S)) {
2969 if (Output.isFilename()) {
2970 CmdArgs.push_back("-coverage-file");
2971 SmallString<128> CoverageFilename;
2972 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
2973 CoverageFilename = FinalOutput->getValue();
2974 } else {
2975 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
2976 }
2977 if (llvm::sys::path::is_relative(CoverageFilename)) {
2978 SmallString<128> Pwd;
2979 if (!llvm::sys::fs::current_path(Pwd)) {
2980 llvm::sys::path::append(Pwd, CoverageFilename);
2981 CoverageFilename.swap(Pwd);
2982 }
2983 }
2984 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
2985 }
2986 }
2987}
2988
James Y Knight5bdf7ab2015-08-19 15:12:02 +00002989/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
2990/// smooshes them together with platform defaults, to decide whether
2991/// this compile should be using PIC mode or not. Returns a tuple of
2992/// (RelocationModel, PICLevel, IsPIE).
2993static std::tuple<llvm::Reloc::Model, unsigned, bool>
2994ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
2995 const ArgList &Args) {
2996 // FIXME: why does this code...and so much everywhere else, use both
2997 // ToolChain.getTriple() and Triple?
2998 bool PIE = ToolChain.isPIEDefault();
2999 bool PIC = PIE || ToolChain.isPICDefault();
3000 bool IsPICLevelTwo = PIC;
3001
3002 bool KernelOrKext =
3003 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3004
3005 // Android-specific defaults for PIC/PIE
3006 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
3007 switch (ToolChain.getArch()) {
3008 case llvm::Triple::arm:
3009 case llvm::Triple::armeb:
3010 case llvm::Triple::thumb:
3011 case llvm::Triple::thumbeb:
3012 case llvm::Triple::aarch64:
3013 case llvm::Triple::mips:
3014 case llvm::Triple::mipsel:
3015 case llvm::Triple::mips64:
3016 case llvm::Triple::mips64el:
3017 PIC = true; // "-fpic"
3018 break;
3019
3020 case llvm::Triple::x86:
3021 case llvm::Triple::x86_64:
3022 PIC = true; // "-fPIC"
3023 IsPICLevelTwo = true;
3024 break;
3025
3026 default:
3027 break;
3028 }
3029 }
3030
3031 // OpenBSD-specific defaults for PIE
3032 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3033 switch (ToolChain.getArch()) {
3034 case llvm::Triple::mips64:
3035 case llvm::Triple::mips64el:
3036 case llvm::Triple::sparcel:
3037 case llvm::Triple::x86:
3038 case llvm::Triple::x86_64:
3039 IsPICLevelTwo = false; // "-fpie"
3040 break;
3041
3042 case llvm::Triple::ppc:
3043 case llvm::Triple::sparc:
3044 case llvm::Triple::sparcv9:
3045 IsPICLevelTwo = true; // "-fPIE"
3046 break;
3047
3048 default:
3049 break;
3050 }
3051 }
3052
3053 // The last argument relating to either PIC or PIE wins, and no
3054 // other argument is used. If the last argument is any flavor of the
3055 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3056 // option implicitly enables PIC at the same level.
3057 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3058 options::OPT_fpic, options::OPT_fno_pic,
3059 options::OPT_fPIE, options::OPT_fno_PIE,
3060 options::OPT_fpie, options::OPT_fno_pie);
3061 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3062 // is forced, then neither PIC nor PIE flags will have no effect.
3063 if (!ToolChain.isPICDefaultForced()) {
3064 if (LastPICArg) {
3065 Option O = LastPICArg->getOption();
3066 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3067 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3068 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3069 PIC =
3070 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3071 IsPICLevelTwo =
3072 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3073 } else {
3074 PIE = PIC = false;
3075 }
3076 }
3077 }
3078
Greg Bedwell80b325c2015-09-25 16:11:00 +00003079 // Introduce a Darwin-specific hack. If the default is PIC, but the
3080 // PIC level would've been set to level 1, force it back to level 2
3081 // PIC instead. This matches the behavior of Darwin GCC (based on
3082 // chandlerc's informal testing in 2012).
3083 if (PIC && ToolChain.getTriple().isOSDarwin())
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003084 IsPICLevelTwo |= ToolChain.isPICDefault();
3085
James Y Knightc4015d32015-08-21 04:14:55 +00003086 // This kernel flags are a trump-card: they will disable PIC/PIE
3087 // generation, independent of the argument order.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003088 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
3089 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003090
3091 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3092 // This is a very special mode. It trumps the other modes, almost no one
3093 // uses it, and it isn't even valid on any OS but Darwin.
3094 if (!ToolChain.getTriple().isOSDarwin())
3095 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3096 << A->getSpelling() << ToolChain.getTriple().str();
3097
3098 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3099
3100 // Only a forced PIC mode can cause the actual compile to have PIC defines
3101 // etc., no flags are sufficient. This behavior was selected to closely
3102 // match that of llvm-gcc and Apple GCC before that.
3103 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3104
3105 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3106 }
3107
3108 if (PIC)
3109 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3110
3111 return std::make_tuple(llvm::Reloc::Static, 0, false);
3112}
3113
3114static const char *RelocationModelName(llvm::Reloc::Model Model) {
3115 switch (Model) {
3116 case llvm::Reloc::Default:
3117 return nullptr;
3118 case llvm::Reloc::Static:
3119 return "static";
3120 case llvm::Reloc::PIC_:
3121 return "pic";
3122 case llvm::Reloc::DynamicNoPIC:
3123 return "dynamic-no-pic";
3124 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003125 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003126}
3127
3128static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3129 ArgStringList &CmdArgs) {
3130 llvm::Reloc::Model RelocationModel;
3131 unsigned PICLevel;
3132 bool IsPIE;
3133 std::tie(RelocationModel, PICLevel, IsPIE) =
3134 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3135
3136 if (RelocationModel != llvm::Reloc::Static)
3137 CmdArgs.push_back("-KPIC");
3138}
3139
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003140void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003141 const InputInfo &Output, const InputInfoList &Inputs,
3142 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003143 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3144 const llvm::Triple Triple(TripleStr);
3145
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003146 bool KernelOrKext =
3147 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003148 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003149 ArgStringList CmdArgs;
3150
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003151 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003152 bool IsWindowsCygnus =
3153 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003154 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
3155
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003156 // Check number of inputs for sanity. We need at least one input.
3157 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003158 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003159 // CUDA compilation may have multiple inputs (source file + results of
3160 // device-side compilations). All other jobs are expected to have exactly one
3161 // input.
3162 bool IsCuda = types::isCuda(Input.getType());
3163 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003164
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003165 // Invoke ourselves in -cc1 mode.
3166 //
3167 // FIXME: Implement custom jobs for internal actions.
3168 CmdArgs.push_back("-cc1");
3169
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003170 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003171 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003172 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003173
James Y Knight2db38f32015-08-15 03:45:25 +00003174 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3175 Triple.getArch() == llvm::Triple::thumb)) {
3176 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003177 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003178 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003179 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003180 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003181 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003182 }
3183
Tim Northover336f1892014-03-29 13:16:12 +00003184 // Push all default warning arguments that are specific to
3185 // the given target. These come before user provided warning options
3186 // are provided.
3187 getToolChain().addClangWarningOptions(CmdArgs);
3188
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003189 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003190 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003191
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003192 if (isa<AnalyzeJobAction>(JA)) {
3193 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3194 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003195 } else if (isa<MigrateJobAction>(JA)) {
3196 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003197 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003198 if (Output.getType() == types::TY_Dependencies)
3199 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003200 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003201 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003202 if (Args.hasArg(options::OPT_rewrite_objc) &&
3203 !Args.hasArg(options::OPT_g_Group))
3204 CmdArgs.push_back("-P");
3205 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003206 } else if (isa<AssembleJobAction>(JA)) {
3207 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003208
David Blaikie9260ed62013-07-25 21:19:01 +00003209 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003210
3211 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003212 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003213 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003214 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003215 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003216
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003217 if (JA.getType() == types::TY_Nothing)
3218 CmdArgs.push_back("-fsyntax-only");
3219 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003220 CmdArgs.push_back("-emit-pch");
3221 else
3222 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003223 } else if (isa<VerifyPCHJobAction>(JA)) {
3224 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003225 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003226 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3227 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003228
Renato Golin7c542b42015-07-27 23:44:45 +00003229 if (JA.getType() == types::TY_LTO_IR || JA.getType() == types::TY_LTO_BC) {
Teresa Johnson8749d8042015-07-06 16:23:00 +00003230 CmdArgs.push_back("-flto");
3231 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003232 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003233 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003234 } else if (JA.getType() == types::TY_LLVM_IR ||
3235 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003236 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003237 } else if (JA.getType() == types::TY_LLVM_BC ||
3238 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003239 CmdArgs.push_back("-emit-llvm-bc");
3240 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003241 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003242 } else if (JA.getType() == types::TY_AST) {
3243 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003244 } else if (JA.getType() == types::TY_ModuleFile) {
3245 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003246 } else if (JA.getType() == types::TY_RewrittenObjC) {
3247 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003248 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003249 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3250 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003251 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003252 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003253 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003254 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003255
3256 // Preserve use-list order by default when emitting bitcode, so that
3257 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3258 // same result as running passes here. For LTO, we don't need to preserve
3259 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003260 if (JA.getType() == types::TY_LLVM_BC)
3261 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003262 }
3263
Justin Bognera88f0122014-06-20 22:59:50 +00003264 // We normally speed up the clang process a bit by skipping destructors at
3265 // exit, but when we're generating diagnostics we can rely on some of the
3266 // cleanup.
3267 if (!C.isForDiagnostics())
3268 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003269
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003270// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003271#ifdef NDEBUG
3272 CmdArgs.push_back("-disable-llvm-verifier");
3273#endif
3274
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003275 // Set the main file name, so that debug info works even with
3276 // -save-temps.
3277 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003278 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003279
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003280 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003281 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003282 if (Args.hasArg(options::OPT_static))
3283 CmdArgs.push_back("-static-define");
3284
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003285 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003286 // Enable region store model by default.
3287 CmdArgs.push_back("-analyzer-store=region");
3288
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003289 // Treat blocks as analysis entry points.
3290 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3291
Ted Kremenek49c79792011-03-24 00:28:47 +00003292 CmdArgs.push_back("-analyzer-eagerly-assume");
3293
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003294 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003295 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003296 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003297
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003298 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003299 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003300
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003301 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003302 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003303
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003304 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003305
Artem Belevichba558952015-05-06 18:20:23 +00003306 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003307 CmdArgs.push_back("-analyzer-checker=cplusplus");
3308
Nico Webere8e53112014-05-11 01:04:02 +00003309 // Enable the following experimental checkers for testing.
3310 CmdArgs.push_back(
3311 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003312 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3313 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003314 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003315 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3316 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003317
3318 // Default nullability checks.
3319 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3320 CmdArgs.push_back(
3321 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003322 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003323
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003324 // Set the output format. The default is plist, for (lame) historical
3325 // reasons.
3326 CmdArgs.push_back("-analyzer-output");
3327 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003328 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003329 else
3330 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003331
Ted Kremenekfe449a22010-03-22 22:32:05 +00003332 // Disable the presentation of standard compiler warnings when
3333 // using --analyze. We only want to show static analyzer diagnostics
3334 // or frontend errors.
3335 CmdArgs.push_back("-w");
3336
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003337 // Add -Xanalyzer arguments when running as analyzer.
3338 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003339 }
3340
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003341 CheckCodeGenerationOptions(D, Args);
3342
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003343 llvm::Reloc::Model RelocationModel;
3344 unsigned PICLevel;
3345 bool IsPIE;
3346 std::tie(RelocationModel, PICLevel, IsPIE) =
3347 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003348
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003349 const char *RMName = RelocationModelName(RelocationModel);
3350 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003351 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003352 CmdArgs.push_back(RMName);
3353 }
3354 if (PICLevel > 0) {
3355 CmdArgs.push_back("-pic-level");
3356 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3357 if (IsPIE) {
3358 CmdArgs.push_back("-pie-level");
3359 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003360 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003361 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003362
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003363 CmdArgs.push_back("-mthread-model");
3364 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3365 CmdArgs.push_back(A->getValue());
3366 else
3367 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3368
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003369 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3370
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003371 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3372 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003373 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003374
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003375 // LLVM Code Generator Options.
3376
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003377 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3378 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003379 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3380 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003381 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003382 CmdArgs.push_back(A->getValue());
3383 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003384 }
3385 }
3386
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003387 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3388 StringRef v = A->getValue();
3389 CmdArgs.push_back("-mllvm");
3390 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3391 A->claim();
3392 }
3393
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003394 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3395 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003396 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003397 }
3398
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003399 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3400 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003401 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003402 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003403 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003404 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3405 CmdArgs.push_back("-fpcc-struct-return");
3406 } else {
3407 assert(A->getOption().matches(options::OPT_freg_struct_return));
3408 CmdArgs.push_back("-freg-struct-return");
3409 }
3410 }
3411
Roman Divacky65b88cd2011-03-01 17:40:53 +00003412 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3413 CmdArgs.push_back("-mrtd");
3414
Rafael Espindola224dd632011-12-14 21:02:23 +00003415 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003416 CmdArgs.push_back("-mdisable-fp-elim");
3417 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3418 options::OPT_fno_zero_initialized_in_bss))
3419 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003420
3421 bool OFastEnabled = isOptimizationLevelFast(Args);
3422 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3423 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003424 OptSpecifier StrictAliasingAliasOption =
3425 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003426 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3427 // doesn't do any TBAA.
3428 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003429 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003430 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003431 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003432 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3433 options::OPT_fno_struct_path_tbaa))
3434 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003435 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3436 false))
3437 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003438 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3439 options::OPT_fno_strict_vtable_pointers,
3440 false))
3441 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003442 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3443 options::OPT_fno_optimize_sibling_calls))
3444 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003445
Eric Christopher006208c2013-04-04 06:29:47 +00003446 // Handle segmented stacks.
3447 if (Args.hasArg(options::OPT_fsplit_stack))
3448 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003449
3450 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3451 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003452 OptSpecifier FastMathAliasOption =
3453 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3454
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003455 // Handle various floating point optimization flags, mapping them to the
3456 // appropriate LLVM code generation flags. The pattern for all of these is to
3457 // default off the codegen optimizations, and if any flag enables them and no
3458 // flag disables them after the flag enabling them, enable the codegen
3459 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003460 if (Arg *A = Args.getLastArg(
3461 options::OPT_ffast_math, FastMathAliasOption,
3462 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3463 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3464 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003465 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3466 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003467 A->getOption().getID() != options::OPT_fhonor_infinities)
3468 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003469 if (Arg *A = Args.getLastArg(
3470 options::OPT_ffast_math, FastMathAliasOption,
3471 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3472 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3473 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003474 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3475 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003476 A->getOption().getID() != options::OPT_fhonor_nans)
3477 CmdArgs.push_back("-menable-no-nans");
3478
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003479 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3480 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003481 if (Arg *A =
3482 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3483 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3484 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003485 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3486 // However, turning *off* -ffast_math merely restores the toolchain default
3487 // (which may be false).
3488 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3489 A->getOption().getID() == options::OPT_ffast_math ||
3490 A->getOption().getID() == options::OPT_Ofast)
3491 MathErrno = false;
3492 else if (A->getOption().getID() == options::OPT_fmath_errno)
3493 MathErrno = true;
3494 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003495 if (MathErrno)
3496 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003497
3498 // There are several flags which require disabling very specific
3499 // optimizations. Any of these being disabled forces us to turn off the
3500 // entire set of LLVM optimizations, so collect them through all the flag
3501 // madness.
3502 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003503 if (Arg *A = Args.getLastArg(
3504 options::OPT_ffast_math, FastMathAliasOption,
3505 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3506 options::OPT_fno_unsafe_math_optimizations,
3507 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003508 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3509 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003510 A->getOption().getID() != options::OPT_fno_associative_math)
3511 AssociativeMath = true;
3512 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003513 if (Arg *A = Args.getLastArg(
3514 options::OPT_ffast_math, FastMathAliasOption,
3515 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3516 options::OPT_fno_unsafe_math_optimizations,
3517 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003518 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3519 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003520 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3521 ReciprocalMath = true;
3522 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003523 if (Arg *A = Args.getLastArg(
3524 options::OPT_ffast_math, FastMathAliasOption,
3525 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3526 options::OPT_fno_unsafe_math_optimizations,
3527 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003528 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3529 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003530 A->getOption().getID() != options::OPT_fsigned_zeros)
3531 SignedZeros = false;
3532 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003533 if (Arg *A = Args.getLastArg(
3534 options::OPT_ffast_math, FastMathAliasOption,
3535 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3536 options::OPT_fno_unsafe_math_optimizations,
3537 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003538 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3539 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003540 A->getOption().getID() != options::OPT_ftrapping_math)
3541 TrappingMath = false;
3542 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3543 !TrappingMath)
3544 CmdArgs.push_back("-menable-unsafe-fp-math");
3545
Sanjay Patel76c9e092015-01-23 16:40:50 +00003546 if (!SignedZeros)
3547 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003548
Sanjay Patel359b1052015-04-09 15:03:23 +00003549 if (ReciprocalMath)
3550 CmdArgs.push_back("-freciprocal-math");
3551
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003552 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003553 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003554 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003555 options::OPT_ffp_contract)) {
3556 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003557 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003558 if (Val == "fast" || Val == "on" || Val == "off") {
3559 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3560 } else {
3561 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003562 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003563 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003564 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3565 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003566 // If fast-math is set then set the fp-contract mode to fast.
3567 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3568 }
3569 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003570
Sanjay Patel2987c292015-06-11 14:53:41 +00003571 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003572
Bob Wilson6a039162012-07-19 03:52:53 +00003573 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3574 // and if we find them, tell the frontend to provide the appropriate
3575 // preprocessor macros. This is distinct from enabling any optimizations as
3576 // these options induce language changes which must survive serialization
3577 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003578 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3579 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003580 if (!A->getOption().matches(options::OPT_fno_fast_math))
3581 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003582 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3583 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003584 if (A->getOption().matches(options::OPT_ffinite_math_only))
3585 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003586
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003587 // Decide whether to use verbose asm. Verbose assembly is the default on
3588 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003589 bool IsIntegratedAssemblerDefault =
3590 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003591 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003592 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003593 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003594 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003595
Rafael Espindolab8a12932015-05-22 20:44:03 +00003596 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3597 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003598 CmdArgs.push_back("-no-integrated-as");
3599
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003600 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3601 CmdArgs.push_back("-mdebug-pass");
3602 CmdArgs.push_back("Structure");
3603 }
3604 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3605 CmdArgs.push_back("-mdebug-pass");
3606 CmdArgs.push_back("Arguments");
3607 }
3608
John McCall8517abc2010-02-19 02:45:38 +00003609 // Enable -mconstructor-aliases except on darwin, where we have to
3610 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003611 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003612 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003613
John McCall7ef5cb32011-03-18 02:56:14 +00003614 // Darwin's kernel doesn't support guard variables; just die if we
3615 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003616 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003617 CmdArgs.push_back("-fforbid-guard-variables");
3618
Douglas Gregordbe39272011-02-01 15:15:22 +00003619 if (Args.hasArg(options::OPT_mms_bitfields)) {
3620 CmdArgs.push_back("-mms-bitfields");
3621 }
John McCall8517abc2010-02-19 02:45:38 +00003622
Daniel Dunbar306945d2009-09-16 06:17:29 +00003623 // This is a coarse approximation of what llvm-gcc actually does, both
3624 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3625 // complicated ways.
3626 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003627 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3628 options::OPT_fno_asynchronous_unwind_tables,
3629 (getToolChain().IsUnwindTablesDefault() ||
3630 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3631 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003632 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3633 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003634 CmdArgs.push_back("-munwind-tables");
3635
Chandler Carruth05fb5852012-11-21 23:40:23 +00003636 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003637
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003638 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3639 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003640 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003641 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003642
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003643 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003644 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003645
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003646 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003647 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003648 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003649 }
3650
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003651 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003652 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003653 if (!CPU.empty()) {
3654 CmdArgs.push_back("-target-cpu");
3655 CmdArgs.push_back(Args.MakeArgString(CPU));
3656 }
3657
Rafael Espindolaeb265472013-08-21 21:59:03 +00003658 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3659 CmdArgs.push_back("-mfpmath");
3660 CmdArgs.push_back(A->getValue());
3661 }
3662
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003663 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003664 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003665
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003666 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003667 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003668 default:
3669 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003670
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003671 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003672 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003673 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003674 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003675 // Use the effective triple, which takes into account the deployment target.
3676 AddARMTargetArgs(Triple, 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)) {
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003761 if (A->getOption().matches(options::OPT_gline_tables_only) &&
David Blaikiece3e7a62015-07-30 21:42:22 +00003762 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003763 // FIXME: we should support specifying dwarf version with
3764 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003765 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003766 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003767 const llvm::Triple &Triple = getToolChain().getTriple();
3768 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003769 Triple.getOS() == llvm::Triple::FreeBSD ||
3770 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003771 CmdArgs.push_back("-gdwarf-2");
David Blaikiece3e7a62015-07-30 21:42:22 +00003772 SplitDwarfArg = nullptr;
Douglas Katzman553927a2015-09-14 20:31:28 +00003773 } else if (A->getOption().matches(options::OPT_gdwarf_2) ||
3774 A->getOption().matches(options::OPT_gdwarf_3) ||
3775 A->getOption().matches(options::OPT_gdwarf_4)) {
3776 A->render(Args, CmdArgs);
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003777 } else if (!A->getOption().matches(options::OPT_g0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003778 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003779 const llvm::Triple &Triple = getToolChain().getTriple();
3780 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003781 Triple.getOS() == llvm::Triple::FreeBSD ||
3782 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003783 CmdArgs.push_back("-gdwarf-2");
3784 else
3785 CmdArgs.push_back("-g");
3786 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003787 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003788
Reid Kleckner124955a2015-08-05 18:51:13 +00003789 // Forward -gcodeview.
3790 Args.AddLastArg(CmdArgs, options::OPT_gcodeview);
3791
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003792 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3793 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003794 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Greg Bedwell80b325c2015-09-25 16:11:00 +00003795 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003796 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003797
Eric Christopher138c32b2013-09-13 22:37:55 +00003798 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003799 if (Args.hasArg(options::OPT_gmodules)) {
3800 CmdArgs.push_back("-g");
3801 CmdArgs.push_back("-dwarf-ext-refs");
3802 CmdArgs.push_back("-fmodule-format=obj");
3803 }
3804
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003805 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3806 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003807 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003808 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003809 CmdArgs.push_back("-g");
3810 CmdArgs.push_back("-backend-option");
3811 CmdArgs.push_back("-split-dwarf=Enable");
3812 }
3813
Eric Christopher138c32b2013-09-13 22:37:55 +00003814 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3815 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3816 CmdArgs.push_back("-backend-option");
3817 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3818 }
Eric Christophereec89c22013-06-18 00:03:50 +00003819
Eric Christopher0d403d22014-02-14 01:27:03 +00003820 // -gdwarf-aranges turns on the emission of the aranges section in the
3821 // backend.
Greg Bedwell80b325c2015-09-25 16:11:00 +00003822 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
Eric Christopher0d403d22014-02-14 01:27:03 +00003823 CmdArgs.push_back("-backend-option");
3824 CmdArgs.push_back("-generate-arange-section");
3825 }
3826
David Blaikief36d9ba2014-01-27 18:52:43 +00003827 if (Args.hasFlag(options::OPT_fdebug_types_section,
3828 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003829 CmdArgs.push_back("-backend-option");
3830 CmdArgs.push_back("-generate-type-units");
3831 }
Eric Christophereec89c22013-06-18 00:03:50 +00003832
Ed Schouten6e576152015-03-26 17:50:28 +00003833 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3834 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3835
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003836 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003837 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003838 CmdArgs.push_back("-ffunction-sections");
3839 }
3840
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003841 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3842 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003843 CmdArgs.push_back("-fdata-sections");
3844 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003845
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003846 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003847 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003848 CmdArgs.push_back("-fno-unique-section-names");
3849
Chris Lattner3c77a352010-06-22 00:03:40 +00003850 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3851
Diego Novilloa0545962015-07-10 18:00:07 +00003852 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003853
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003854 // Pass options for controlling the default header search paths.
3855 if (Args.hasArg(options::OPT_nostdinc)) {
3856 CmdArgs.push_back("-nostdsysteminc");
3857 CmdArgs.push_back("-nobuiltininc");
3858 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003859 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003860 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003861 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3862 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3863 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003864
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003865 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003866 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003867 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003868
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003869 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3870
Ted Kremenekf7639e12012-03-06 20:06:33 +00003871 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003872 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003873 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003874 options::OPT_ccc_arcmt_modify,
3875 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003876 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003877 switch (A->getOption().getID()) {
3878 default:
3879 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003880 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003881 CmdArgs.push_back("-arcmt-check");
3882 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003883 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003884 CmdArgs.push_back("-arcmt-modify");
3885 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003886 case options::OPT_ccc_arcmt_migrate:
3887 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003888 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003889 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003890
3891 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3892 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003893 break;
John McCalld70fb982011-06-15 23:25:17 +00003894 }
3895 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003896 } else {
3897 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3898 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3899 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003900 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003901
Ted Kremenekf7639e12012-03-06 20:06:33 +00003902 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3903 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003904 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3905 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003906 }
3907 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003908 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003909
3910 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003911 options::OPT_objcmt_migrate_subscripting,
3912 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003913 // None specified, means enable them all.
3914 CmdArgs.push_back("-objcmt-migrate-literals");
3915 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003916 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003917 } else {
3918 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3919 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003920 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003921 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003922 } else {
3923 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3924 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3925 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3926 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3927 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3928 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003929 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003930 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3931 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3932 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3933 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3934 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3935 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3936 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003937 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003938 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003939 }
3940
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003941 // Add preprocessing options like -I, -D, etc. if we are using the
3942 // preprocessor.
3943 //
3944 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003945 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003946 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003947
Rafael Espindolaa7431922011-07-21 23:40:37 +00003948 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3949 // that "The compiler can only warn and ignore the option if not recognized".
3950 // When building with ccache, it will pass -D options to clang even on
3951 // preprocessed inputs and configure concludes that -fPIC is not supported.
3952 Args.ClaimAllArgs(options::OPT_D);
3953
Alp Toker7874bdc2013-11-15 20:40:58 +00003954 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003955 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3956 if (A->getOption().matches(options::OPT_O4)) {
3957 CmdArgs.push_back("-O3");
3958 D.Diag(diag::warn_O4_is_O3);
3959 } else {
3960 A->render(Args, CmdArgs);
3961 }
3962 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003963
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003964 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003965 for (const Arg *A :
3966 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3967 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00003968 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003969 }
3970
Rafael Espindola577637a2015-01-03 00:06:04 +00003971 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003972
Richard Smith3be1cb22014-08-07 00:24:21 +00003973 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003974 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003975 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3976 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003977 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003978 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003979
3980 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003981 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003982 //
3983 // If a std is supplied, only add -trigraphs if it follows the
3984 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003985 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003986 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3987 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003988 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003989 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003990 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003991 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003992 else
3993 Std->render(Args, CmdArgs);
3994
Nico Weber00721502014-12-23 22:32:37 +00003995 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003996 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003997 options::OPT_ftrigraphs,
3998 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003999 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004000 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004001 } else {
4002 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004003 //
4004 // FIXME: Clang doesn't correctly handle -std= when the input language
4005 // doesn't match. For the time being just ignore this for C++ inputs;
4006 // eventually we want to do all the standard defaulting here instead of
4007 // splitting it between the driver and clang -cc1.
4008 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004009 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4010 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004011 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004012 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004013
Nico Weber00721502014-12-23 22:32:37 +00004014 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4015 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004016 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004017
Richard Smith282b4492013-09-04 22:50:31 +00004018 // GCC's behavior for -Wwrite-strings is a bit strange:
4019 // * In C, this "warning flag" changes the types of string literals from
4020 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4021 // for the discarded qualifier.
4022 // * In C++, this is just a normal warning flag.
4023 //
4024 // Implementing this warning correctly in C is hard, so we follow GCC's
4025 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4026 // a non-const char* in C, rather than using this crude hack.
4027 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004028 // FIXME: This should behave just like a warning flag, and thus should also
4029 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4030 Arg *WriteStrings =
4031 Args.getLastArg(options::OPT_Wwrite_strings,
4032 options::OPT_Wno_write_strings, options::OPT_w);
4033 if (WriteStrings &&
4034 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004035 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004036 }
4037
Chandler Carruth61fbf622011-04-23 09:27:53 +00004038 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004039 // during C++ compilation, which it is by default. GCC keeps this define even
4040 // in the presence of '-w', match this behavior bug-for-bug.
4041 if (types::isCXX(InputType) &&
4042 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4043 true)) {
4044 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004045 }
4046
Chandler Carruthe0391482010-05-22 02:21:53 +00004047 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4048 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4049 if (Asm->getOption().matches(options::OPT_fasm))
4050 CmdArgs.push_back("-fgnu-keywords");
4051 else
4052 CmdArgs.push_back("-fno-gnu-keywords");
4053 }
4054
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004055 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4056 CmdArgs.push_back("-fno-dwarf-directory-asm");
4057
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004058 if (ShouldDisableAutolink(Args, getToolChain()))
4059 CmdArgs.push_back("-fno-autolink");
4060
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004061 // Add in -fdebug-compilation-dir if necessary.
4062 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004063
Richard Smith9a568822011-11-21 19:36:32 +00004064 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4065 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004066 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004067 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004068 }
4069
Richard Smith79c927b2013-11-06 19:31:51 +00004070 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4071 CmdArgs.push_back("-foperator-arrow-depth");
4072 CmdArgs.push_back(A->getValue());
4073 }
4074
Richard Smith9a568822011-11-21 19:36:32 +00004075 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4076 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004077 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004078 }
4079
Richard Smitha3d3bd22013-05-08 02:12:03 +00004080 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4081 CmdArgs.push_back("-fconstexpr-steps");
4082 CmdArgs.push_back(A->getValue());
4083 }
4084
Richard Smithb3a14522013-02-22 01:59:51 +00004085 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4086 CmdArgs.push_back("-fbracket-depth");
4087 CmdArgs.push_back(A->getValue());
4088 }
4089
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004090 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4091 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004092 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004093 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004094 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4095 } else
4096 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004097 }
4098
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004099 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004100 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004101
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004102 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4103 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004104 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004105 }
David Chisnall5778fce2009-08-31 16:41:57 +00004106
Chris Lattnere23003d2010-01-09 21:54:33 +00004107 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4108 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004109 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004110 }
4111
Chris Lattnerb35583d2010-04-07 20:49:23 +00004112 CmdArgs.push_back("-ferror-limit");
4113 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004114 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004115 else
4116 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004117
Chandler Carrutha77a7272010-05-06 04:55:18 +00004118 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4119 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004120 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004121 }
4122
4123 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4124 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004125 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004126 }
4127
Richard Smithf6f003a2011-12-16 19:06:07 +00004128 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4129 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004130 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004131 }
4132
Nick Lewycky24653262014-12-16 21:39:02 +00004133 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4134 CmdArgs.push_back("-fspell-checking-limit");
4135 CmdArgs.push_back(A->getValue());
4136 }
4137
Daniel Dunbar2c978472009-11-04 06:24:47 +00004138 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004139 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004140 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004141 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004142 } else {
4143 // If -fmessage-length=N was not specified, determine whether this is a
4144 // terminal and, if so, implicitly define -fmessage-length appropriately.
4145 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004146 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004147 }
4148
John McCallb4a99d32013-02-19 01:57:35 +00004149 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4150 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4151 options::OPT_fvisibility_ms_compat)) {
4152 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4153 CmdArgs.push_back("-fvisibility");
4154 CmdArgs.push_back(A->getValue());
4155 } else {
4156 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4157 CmdArgs.push_back("-fvisibility");
4158 CmdArgs.push_back("hidden");
4159 CmdArgs.push_back("-ftype-visibility");
4160 CmdArgs.push_back("default");
4161 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004162 }
4163
Douglas Gregor08329632010-06-15 17:05:35 +00004164 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004165
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004166 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4167
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004168 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004169 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4170 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004171 CmdArgs.push_back("-ffreestanding");
4172
Daniel Dunbare357d562009-12-03 18:42:11 +00004173 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004174 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004175 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00004176 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
4177 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00004178 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004179 // Emulated TLS is enabled by default on Android, and can be enabled manually
4180 // with -femulated-tls.
4181 bool EmulatedTLSDefault = Triple.getEnvironment() == llvm::Triple::Android;
4182 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4183 EmulatedTLSDefault))
4184 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004185 // AltiVec-like language extensions aren't relevant for assembling.
4186 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004187 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004188 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4189 }
Richard Trieu91844232012-06-26 18:18:47 +00004190 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4191 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004192
Alexey Bataevdb390212015-05-20 04:24:19 +00004193 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004194 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4195 options::OPT_fno_openmp, false))
4196 switch (getOpenMPRuntime(getToolChain(), Args)) {
4197 case OMPRT_OMP:
4198 case OMPRT_IOMP5:
4199 // Clang can generate useful OpenMP code for these two runtime libraries.
4200 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004201
4202 // If no option regarding the use of TLS in OpenMP codegeneration is
4203 // given, decide a default based on the target. Otherwise rely on the
4204 // options and pass the right information to the frontend.
4205 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004206 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004207 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004208 break;
4209 default:
4210 // By default, if Clang doesn't know how to generate useful OpenMP code
4211 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4212 // down to the actual compilation.
4213 // FIXME: It would be better to have a mode which *only* omits IR
4214 // generation based on the OpenMP support so that we get consistent
4215 // semantic analysis, etc.
4216 break;
4217 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004218
Peter Collingbourne32701642013-11-01 18:16:25 +00004219 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004220 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004221
Eric Christopher459d2712013-02-19 06:16:53 +00004222 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004223 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4224 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4225 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4226 Arch == llvm::Triple::ppc64le))
4227 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4228 << "ppc/ppc64/ppc64le";
4229 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004230
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004231 // -fzvector is incompatible with -faltivec.
4232 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4233 if (Args.hasArg(options::OPT_faltivec))
4234 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4235 << "-faltivec";
4236
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004237 if (getToolChain().SupportsProfiling())
4238 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004239
4240 // -flax-vector-conversions is default.
4241 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4242 options::OPT_fno_lax_vector_conversions))
4243 CmdArgs.push_back("-fno-lax-vector-conversions");
4244
John Brawna7b4ec02015-08-10 11:11:28 +00004245 if (Args.getLastArg(options::OPT_fapple_kext) ||
4246 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004247 CmdArgs.push_back("-fapple-kext");
4248
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004249 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004250 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004251 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004252 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4253 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004254
4255 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4256 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004257 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004258 }
4259
Bob Wilson14adb362012-02-03 06:27:22 +00004260 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004261
Chandler Carruth6e501032011-03-27 00:04:55 +00004262 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4263 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004264 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004265 if (A->getOption().matches(options::OPT_fwrapv))
4266 CmdArgs.push_back("-fwrapv");
4267 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4268 options::OPT_fno_strict_overflow)) {
4269 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4270 CmdArgs.push_back("-fwrapv");
4271 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004272
4273 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4274 options::OPT_fno_reroll_loops))
4275 if (A->getOption().matches(options::OPT_freroll_loops))
4276 CmdArgs.push_back("-freroll-loops");
4277
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004278 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004279 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4280 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004281
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004282 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4283
Daniel Dunbar4930e332009-11-17 08:07:36 +00004284 // -stack-protector=0 is default.
4285 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004286 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4287 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4288 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4289 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4290 Args.ClaimAllArgs(options::OPT_fstack_protector);
4291 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004292 options::OPT_fstack_protector_all,
4293 options::OPT_fstack_protector_strong,
4294 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004295 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004296 StackProtectorLevel = std::max<unsigned>(
4297 LangOptions::SSPOn,
4298 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004299 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004300 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004301 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004302 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004303 } else {
4304 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004305 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004306 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004307 if (StackProtectorLevel) {
4308 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004309 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004310 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004311
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004312 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004313 for (const Arg *A : Args.filtered(options::OPT__param)) {
4314 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004315 if (Str.startswith("ssp-buffer-size=")) {
4316 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004317 CmdArgs.push_back("-stack-protector-buffer-size");
4318 // FIXME: Verify the argument is a valid integer.
4319 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004320 }
Sean Silva14facf32015-06-09 01:57:17 +00004321 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004322 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004323 }
4324
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004325 // Translate -mstackrealign
4326 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004327 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004328 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004329
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004330 if (Args.hasArg(options::OPT_mstack_alignment)) {
4331 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4332 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004333 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004334
Hans Wennborg77dc2362015-01-20 19:45:50 +00004335 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4336 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4337
4338 if (!Size.empty())
4339 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4340 else
4341 CmdArgs.push_back("-mstack-probe-size=0");
4342 }
4343
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004344 switch (getToolChain().getArch()) {
4345 case llvm::Triple::aarch64:
4346 case llvm::Triple::aarch64_be:
4347 case llvm::Triple::arm:
4348 case llvm::Triple::armeb:
4349 case llvm::Triple::thumb:
4350 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004351 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004352 break;
4353
4354 default:
4355 break;
4356 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004357
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004358 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4359 options::OPT_mno_restrict_it)) {
4360 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4361 CmdArgs.push_back("-backend-option");
4362 CmdArgs.push_back("-arm-restrict-it");
4363 } else {
4364 CmdArgs.push_back("-backend-option");
4365 CmdArgs.push_back("-arm-no-restrict-it");
4366 }
James Y Knight2db38f32015-08-15 03:45:25 +00004367 } else if (Triple.isOSWindows() &&
4368 (Triple.getArch() == llvm::Triple::arm ||
4369 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004370 // Windows on ARM expects restricted IT blocks
4371 CmdArgs.push_back("-backend-option");
4372 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004373 }
4374
Daniel Dunbard18049a2009-04-07 21:16:11 +00004375 // Forward -f options with positive and negative forms; we translate
4376 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004377 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4378 StringRef fname = A->getValue();
4379 if (!llvm::sys::fs::exists(fname))
4380 D.Diag(diag::err_drv_no_such_file) << fname;
4381 else
4382 A->render(Args, CmdArgs);
4383 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004384
John Brawna7b4ec02015-08-10 11:11:28 +00004385 // -fbuiltin is default unless -mkernel is used
4386 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4387 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004388 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004389
Nuno Lopes13c88c72009-12-16 16:59:22 +00004390 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4391 options::OPT_fno_assume_sane_operator_new))
4392 CmdArgs.push_back("-fno-assume-sane-operator-new");
4393
Daniel Dunbar4930e332009-11-17 08:07:36 +00004394 // -fblocks=0 is default.
4395 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004396 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004397 (Args.hasArg(options::OPT_fgnu_runtime) &&
4398 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4399 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004400 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004401
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004402 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004403 !getToolChain().hasBlocksRuntime())
4404 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004405 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004406
Richard Smith47972af2015-06-16 00:08:24 +00004407 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004408 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004409 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004410 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004411 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004412 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4413 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004414 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004415 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004416 HaveModules = true;
4417 }
4418 }
4419
Richard Smith47972af2015-06-16 00:08:24 +00004420 // -fmodule-maps enables implicit reading of module map files. By default,
4421 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004422 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4423 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004424 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004425 }
4426
Daniel Jasperac42b752013-10-21 06:34:34 +00004427 // -fmodules-decluse checks that modules used are declared so (off by
4428 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004429 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004430 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004431 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004432 }
4433
Daniel Jasper962b38e2014-04-11 11:47:45 +00004434 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4435 // all #included headers are part of modules.
4436 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004437 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004438 CmdArgs.push_back("-fmodules-strict-decluse");
4439 }
4440
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004441 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4442 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4443 options::OPT_fno_implicit_modules)) {
4444 CmdArgs.push_back("-fno-implicit-modules");
4445 }
4446
Daniel Jasperac42b752013-10-21 06:34:34 +00004447 // -fmodule-name specifies the module that is currently being built (or
4448 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004449 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004450
Richard Smith9887d792014-10-17 01:42:53 +00004451 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004452 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004453 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004454
Richard Smithe842a472014-10-22 02:05:46 +00004455 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004456 if (HaveModules)
4457 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4458 else
4459 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004460
4461 // -fmodule-cache-path specifies where our implicitly-built module files
4462 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004463 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004464 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004465 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004466 if (HaveModules) {
4467 if (C.isForDiagnostics()) {
4468 // When generating crash reports, we want to emit the modules along with
4469 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004470 Path = Output.getFilename();
4471 llvm::sys::path::replace_extension(Path, ".cache");
4472 llvm::sys::path::append(Path, "modules");
4473 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004474 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004475 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004476 llvm::sys::path::append(Path, "org.llvm.clang.");
4477 appendUserToPath(Path);
4478 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004479 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004480 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004481 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4482 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004483 }
4484
4485 // When building modules and generating crashdumps, we need to dump a module
4486 // dependency VFS alongside the output.
4487 if (HaveModules && C.isForDiagnostics()) {
4488 SmallString<128> VFSDir(Output.getFilename());
4489 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004490 // Add the cache directory as a temp so the crash diagnostics pick it up.
4491 C.addTempFile(Args.MakeArgString(VFSDir));
4492
Justin Bognera88f0122014-06-20 22:59:50 +00004493 llvm::sys::path::append(VFSDir, "vfs");
4494 CmdArgs.push_back("-module-dependency-dir");
4495 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004496 }
4497
Richard Smith9887d792014-10-17 01:42:53 +00004498 if (HaveModules)
4499 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004500
Douglas Gregor35b04d62013-02-07 19:01:24 +00004501 // Pass through all -fmodules-ignore-macro arguments.
4502 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004503 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4504 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004505
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004506 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4507
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004508 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4509 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4510 D.Diag(diag::err_drv_argument_not_allowed_with)
4511 << A->getAsString(Args) << "-fbuild-session-timestamp";
4512
4513 llvm::sys::fs::file_status Status;
4514 if (llvm::sys::fs::status(A->getValue(), Status))
4515 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004516 CmdArgs.push_back(Args.MakeArgString(
4517 "-fbuild-session-timestamp=" +
4518 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004519 }
4520
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004521 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004522 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4523 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004524 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4525
4526 Args.AddLastArg(CmdArgs,
4527 options::OPT_fmodules_validate_once_per_build_session);
4528 }
4529
Ben Langmuirdcf73862014-03-12 00:06:17 +00004530 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4531
John McCalldfea9982010-04-09 19:12:06 +00004532 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004533 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004534 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004535 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004536
Anders Carlssond470fef2010-11-21 00:09:52 +00004537 // -felide-constructors is the default.
4538 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004539 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004540 CmdArgs.push_back("-fno-elide-constructors");
4541
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004542 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004543
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004544 if (KernelOrKext || (types::isCXX(InputType) &&
4545 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4546 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004547 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004548
Tony Linthicum76329bf2011-12-12 21:14:55 +00004549 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004550 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4551 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004552 CmdArgs.push_back("-fshort-enums");
4553
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004554 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004555 if (Arg *A = Args.getLastArg(
4556 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4557 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4558 if (A->getOption().matches(options::OPT_funsigned_char) ||
4559 A->getOption().matches(options::OPT_fno_signed_char)) {
4560 CmdArgs.push_back("-fno-signed-char");
4561 }
4562 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004563 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004564 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004565
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004566 // -fuse-cxa-atexit is default.
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00004567 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4568 options::OPT_fno_use_cxa_atexit,
4569 !IsWindowsCygnus && !IsWindowsGNU &&
4570 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4571 getToolChain().getArch() != llvm::Triple::hexagon &&
4572 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004573 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004574 CmdArgs.push_back("-fno-use-cxa-atexit");
4575
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004576 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004577 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004578 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004579 CmdArgs.push_back("-fms-extensions");
4580
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004581 // -fno-use-line-directives is default.
4582 if (Args.hasFlag(options::OPT_fuse_line_directives,
4583 options::OPT_fno_use_line_directives, false))
4584 CmdArgs.push_back("-fuse-line-directives");
4585
Francois Pichet1b4f1632011-09-17 04:32:15 +00004586 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004587 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004588 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004589 (IsWindowsMSVC &&
4590 Args.hasFlag(options::OPT_fms_extensions,
4591 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004592 CmdArgs.push_back("-fms-compatibility");
4593
David Majnemerc371ff02015-03-22 08:39:22 +00004594 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004595 VersionTuple MSVT = visualstudio::getMSVCVersion(
4596 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4597 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004598 CmdArgs.push_back(
4599 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004600
David Majnemer8db91762015-05-18 04:49:30 +00004601 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4602 if (ImplyVCPPCXXVer) {
4603 if (IsMSVC2015Compatible)
4604 CmdArgs.push_back("-std=c++14");
4605 else
4606 CmdArgs.push_back("-std=c++11");
4607 }
4608
Eric Christopher5ecce122013-02-18 00:38:31 +00004609 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004610 if (Args.hasFlag(options::OPT_fborland_extensions,
4611 options::OPT_fno_borland_extensions, false))
4612 CmdArgs.push_back("-fborland-extensions");
4613
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00004614 // -fno-declspec is default, except for PS4.
4615 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
4616 getToolChain().getTriple().isPS4()))
4617 CmdArgs.push_back("-fdeclspec");
4618 else if (Args.hasArg(options::OPT_fno_declspec))
4619 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
4620
David Majnemerc371ff02015-03-22 08:39:22 +00004621 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4622 // than 19.
4623 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4624 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004625 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004626 CmdArgs.push_back("-fno-threadsafe-statics");
4627
Francois Pichet02744872011-09-01 16:38:08 +00004628 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4629 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004630 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004631 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004632 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004633
Chandler Carruthe03aa552010-04-17 20:17:31 +00004634 // -fgnu-keywords default varies depending on language; only pass if
4635 // specified.
4636 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004637 options::OPT_fno_gnu_keywords))
4638 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004639
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004640 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004641 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004642 CmdArgs.push_back("-fgnu89-inline");
4643
Chad Rosier9c76d242012-03-15 22:31:42 +00004644 if (Args.hasArg(options::OPT_fno_inline))
4645 CmdArgs.push_back("-fno-inline");
4646
Chad Rosier64d6be92012-03-06 21:17:19 +00004647 if (Args.hasArg(options::OPT_fno_inline_functions))
4648 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004649
John McCall5fb5df92012-06-20 06:18:46 +00004650 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004651
John McCall5fb5df92012-06-20 06:18:46 +00004652 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004653 // legacy is the default. Except for deployment taget of 10.5,
4654 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4655 // gets ignored silently.
4656 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004657 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4658 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004659 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004660 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004661 if (getToolChain().UseObjCMixedDispatch())
4662 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4663 else
4664 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4665 }
4666 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004667
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004668 // When ObjectiveC legacy runtime is in effect on MacOSX,
4669 // turn on the option to do Array/Dictionary subscripting
4670 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004671 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004672 getToolChain().getTriple().isMacOSX() &&
4673 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4674 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004675 objcRuntime.isNeXTFamily())
4676 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004677
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004678 // -fencode-extended-block-signature=1 is default.
4679 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4680 CmdArgs.push_back("-fencode-extended-block-signature");
4681 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004682
John McCall24fc0de2011-07-06 00:26:06 +00004683 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4684 // NOTE: This logic is duplicated in ToolChains.cpp.
4685 bool ARC = isObjCAutoRefCount(Args);
4686 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004687 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004688
John McCall24fc0de2011-07-06 00:26:06 +00004689 CmdArgs.push_back("-fobjc-arc");
4690
Chandler Carruth491db322011-11-04 07:34:47 +00004691 // FIXME: It seems like this entire block, and several around it should be
4692 // wrapped in isObjC, but for now we just use it here as this is where it
4693 // was being used previously.
4694 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4695 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4696 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4697 else
4698 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4699 }
4700
John McCall24fc0de2011-07-06 00:26:06 +00004701 // Allow the user to enable full exceptions code emission.
4702 // We define off for Objective-CC, on for Objective-C++.
4703 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4704 options::OPT_fno_objc_arc_exceptions,
4705 /*default*/ types::isCXX(InputType)))
4706 CmdArgs.push_back("-fobjc-arc-exceptions");
4707 }
4708
4709 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4710 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004711 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004712 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004713
John McCall24fc0de2011-07-06 00:26:06 +00004714 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4715 // takes precedence.
4716 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4717 if (!GCArg)
4718 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4719 if (GCArg) {
4720 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004721 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004722 } else if (getToolChain().SupportsObjCGC()) {
4723 GCArg->render(Args, CmdArgs);
4724 } else {
4725 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004726 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004727 }
4728 }
4729
Bob Wilsonb111ec92015-03-02 19:01:14 +00004730 if (Args.hasFlag(options::OPT_fapplication_extension,
4731 options::OPT_fno_application_extension, false))
4732 CmdArgs.push_back("-fapplication-extension");
4733
Reid Klecknerc542d372014-06-27 17:02:02 +00004734 // Handle GCC-style exception args.
4735 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004736 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4737 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004738
4739 if (getToolChain().UseSjLjExceptions())
4740 CmdArgs.push_back("-fsjlj-exceptions");
4741
4742 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004743 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4744 options::OPT_fno_assume_sane_operator_new))
4745 CmdArgs.push_back("-fno-assume-sane-operator-new");
4746
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004747 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4748 // most platforms.
4749 if (Args.hasFlag(options::OPT_fsized_deallocation,
4750 options::OPT_fno_sized_deallocation, false))
4751 CmdArgs.push_back("-fsized-deallocation");
4752
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004753 // -fconstant-cfstrings is default, and may be subject to argument translation
4754 // on Darwin.
4755 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4756 options::OPT_fno_constant_cfstrings) ||
4757 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4758 options::OPT_mno_constant_cfstrings))
4759 CmdArgs.push_back("-fno-constant-cfstrings");
4760
John Thompsoned4e2952009-11-05 20:14:16 +00004761 // -fshort-wchar default varies depending on platform; only
4762 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004763 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4764 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004765 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004766
Hans Wennborg28c96312013-07-31 23:39:13 +00004767 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004768 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004769 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004770 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004771
Daniel Dunbar096ed292011-10-05 21:04:55 +00004772 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4773 // -fno-pack-struct doesn't apply to -fpack-struct=.
4774 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004775 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004776 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004777 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004778 } else if (Args.hasFlag(options::OPT_fpack_struct,
4779 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004780 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004781 }
4782
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004783 // Handle -fmax-type-align=N and -fno-type-align
4784 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4785 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4786 if (!SkipMaxTypeAlign) {
4787 std::string MaxTypeAlignStr = "-fmax-type-align=";
4788 MaxTypeAlignStr += A->getValue();
4789 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4790 }
4791 } else if (getToolChain().getTriple().isOSDarwin()) {
4792 if (!SkipMaxTypeAlign) {
4793 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4794 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4795 }
4796 }
4797
John Brawna7b4ec02015-08-10 11:11:28 +00004798 // -fcommon is the default unless compiling kernel code or the target says so
4799 bool NoCommonDefault =
4800 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
4801 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
4802 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004803 CmdArgs.push_back("-fno-common");
4804
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004805 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004806 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004807 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004808 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004809 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004810 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004811
Daniel Dunbar6358d682010-10-15 22:30:42 +00004812 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004813 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004814 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004815 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004816
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004817 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004818 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4819 StringRef value = inputCharset->getValue();
4820 if (value != "UTF-8")
4821 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4822 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004823 }
4824
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004825 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004826 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4827 StringRef value = execCharset->getValue();
4828 if (value != "UTF-8")
4829 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4830 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004831 }
4832
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004833 // -fcaret-diagnostics is default.
4834 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4835 options::OPT_fno_caret_diagnostics, true))
4836 CmdArgs.push_back("-fno-caret-diagnostics");
4837
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004838 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004839 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004840 options::OPT_fno_diagnostics_fixit_info))
4841 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004842
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004843 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004844 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004845 options::OPT_fno_diagnostics_show_option))
4846 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004847
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004848 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004849 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004850 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004851 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004852 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004853
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004854 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004855 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004856 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004857 }
4858
Chandler Carruthb6766f02011-03-27 01:50:55 +00004859 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004860 options::OPT_fdiagnostics_show_note_include_stack,
4861 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004862 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004863 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004864 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4865 else
4866 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4867 }
4868
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004869 // Color diagnostics are the default, unless the terminal doesn't support
4870 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004871 // Support both clang's -f[no-]color-diagnostics and gcc's
4872 // -f[no-]diagnostics-colors[=never|always|auto].
4873 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004874 for (const auto &Arg : Args) {
4875 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004876 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4877 !O.matches(options::OPT_fdiagnostics_color) &&
4878 !O.matches(options::OPT_fno_color_diagnostics) &&
4879 !O.matches(options::OPT_fno_diagnostics_color) &&
4880 !O.matches(options::OPT_fdiagnostics_color_EQ))
4881 continue;
4882
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004883 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004884 if (O.matches(options::OPT_fcolor_diagnostics) ||
4885 O.matches(options::OPT_fdiagnostics_color)) {
4886 ShowColors = Colors_On;
4887 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4888 O.matches(options::OPT_fno_diagnostics_color)) {
4889 ShowColors = Colors_Off;
4890 } else {
4891 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004892 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004893 if (value == "always")
4894 ShowColors = Colors_On;
4895 else if (value == "never")
4896 ShowColors = Colors_Off;
4897 else if (value == "auto")
4898 ShowColors = Colors_Auto;
4899 else
4900 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004901 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004902 }
4903 }
4904 if (ShowColors == Colors_On ||
4905 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004906 CmdArgs.push_back("-fcolor-diagnostics");
4907
Nico Rieck7857d462013-09-11 00:38:02 +00004908 if (Args.hasArg(options::OPT_fansi_escape_codes))
4909 CmdArgs.push_back("-fansi-escape-codes");
4910
Daniel Dunbardb097022009-06-08 21:13:54 +00004911 if (!Args.hasFlag(options::OPT_fshow_source_location,
4912 options::OPT_fno_show_source_location))
4913 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004914
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004915 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004916 true))
4917 CmdArgs.push_back("-fno-show-column");
4918
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004919 if (!Args.hasFlag(options::OPT_fspell_checking,
4920 options::OPT_fno_spell_checking))
4921 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004922
Chad Rosierc8e56e82012-12-05 21:08:21 +00004923 // -fno-asm-blocks is default.
4924 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4925 false))
4926 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004927
Steven Wucb0d13f2015-01-16 23:05:28 +00004928 // -fgnu-inline-asm is default.
4929 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4930 options::OPT_fno_gnu_inline_asm, true))
4931 CmdArgs.push_back("-fno-gnu-inline-asm");
4932
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004933 // Enable vectorization per default according to the optimization level
4934 // selected. For optimization levels that want vectorization we use the alias
4935 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004936 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004937 OptSpecifier VectorizeAliasOption =
4938 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004939 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004940 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004941 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004942
Chad Rosier136d67d2014-04-28 19:30:57 +00004943 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004944 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004945 OptSpecifier SLPVectAliasOption =
4946 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00004947 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004948 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004949 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004950
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004951 // -fno-slp-vectorize-aggressive is default.
4952 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004953 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004954 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004955
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004956 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4957 A->render(Args, CmdArgs);
4958
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004959 // -fdollars-in-identifiers default varies depending on platform and
4960 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004961 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004962 options::OPT_fno_dollars_in_identifiers)) {
4963 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004964 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004965 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004966 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004967 }
4968
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004969 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4970 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004971 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004972 options::OPT_fno_unit_at_a_time)) {
4973 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004974 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004975 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004976
Eli Friedman055c9702011-11-02 01:53:16 +00004977 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4978 options::OPT_fno_apple_pragma_pack, false))
4979 CmdArgs.push_back("-fapple-pragma-pack");
4980
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004981 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004982 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4983 // by default.
4984 if (getToolChain().getArch() == llvm::Triple::le32) {
4985 CmdArgs.push_back("-fno-math-builtin");
4986 }
4987
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004988// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4989//
4990// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004991#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004992 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004993 (getToolChain().getArch() == llvm::Triple::arm ||
4994 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004995 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4996 CmdArgs.push_back("-fno-builtin-strcat");
4997 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4998 CmdArgs.push_back("-fno-builtin-strcpy");
4999 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005000#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005001
Justin Bognera88f0122014-06-20 22:59:50 +00005002 // Enable rewrite includes if the user's asked for it or if we're generating
5003 // diagnostics.
5004 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5005 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005006 if (Args.hasFlag(options::OPT_frewrite_includes,
5007 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005008 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005009 CmdArgs.push_back("-frewrite-includes");
5010
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005011 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005012 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005013 options::OPT_traditional_cpp)) {
5014 if (isa<PreprocessJobAction>(JA))
5015 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005016 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005017 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005018 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005019
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005020 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005021 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005022
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005023 // Handle serialized diagnostics.
5024 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5025 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005026 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005027 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005028
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005029 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5030 CmdArgs.push_back("-fretain-comments-from-system-headers");
5031
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005032 // Forward -fcomment-block-commands to -cc1.
5033 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005034 // Forward -fparse-all-comments to -cc1.
5035 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005036
John Brawnad31ace2015-09-23 13:55:40 +00005037 // Turn -fplugin=name.so into -load name.so
5038 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5039 CmdArgs.push_back("-load");
5040 CmdArgs.push_back(A->getValue());
5041 A->claim();
5042 }
5043
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005044 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5045 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005046 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005047 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5048 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005049
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005050 // We translate this by hand to the -cc1 argument, since nightly test uses
5051 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005052 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005053 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005054 } else
Sean Silva14facf32015-06-09 01:57:17 +00005055 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005056 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005057
Bob Wilson23a55f12014-12-21 07:00:00 +00005058 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005059 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5060 // by the frontend.
5061 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5062 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005063
Daniel Dunbard67a3222009-03-30 06:36:42 +00005064 if (Output.getType() == types::TY_Dependencies) {
5065 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005066 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005067 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005068 CmdArgs.push_back(Output.getFilename());
5069 } else {
5070 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005071 }
5072
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005073 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005074
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005075 if (Input.isFilename())
5076 CmdArgs.push_back(Input.getFilename());
5077 else
5078 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005079
Chris Lattnere9d7d782009-11-03 19:50:27 +00005080 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5081
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005082 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005083
5084 // Optionally embed the -cc1 level arguments into the debug info, for build
5085 // analysis.
5086 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005087 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005088 for (const auto &Arg : Args)
5089 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005090
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005091 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005092 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005093 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005094 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005095 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005096 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005097 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005098 }
5099 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005100 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005101 }
5102
Eric Christopherd3804002013-02-22 20:12:52 +00005103 // Add the split debug info name to the command lines here so we
5104 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005105 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005106 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5107 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005108 const char *SplitDwarfOut;
5109 if (SplitDwarf) {
5110 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005111 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005112 CmdArgs.push_back(SplitDwarfOut);
5113 }
5114
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005115 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5116 // Include them with -fcuda-include-gpubinary.
5117 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005118 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005119 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005120 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005121 }
5122
Eric Christopherd3804002013-02-22 20:12:52 +00005123 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005124 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005125 Output.getType() == types::TY_Object &&
5126 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005127 auto CLCommand =
5128 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005129 C.addCommand(llvm::make_unique<FallbackCommand>(
5130 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005131 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005132 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005133 }
5134
Eric Christopherf1545832013-02-22 23:50:16 +00005135 // Handle the debug info splitting at object creation time if we're
5136 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005137 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005138 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005139 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005140
Roman Divacky178e01602011-02-10 16:52:03 +00005141 if (Arg *A = Args.getLastArg(options::OPT_pg))
5142 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005143 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5144 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005145
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005146 // Claim some arguments which clang supports automatically.
5147
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005148 // -fpch-preprocess is used with gcc to add a special marker in the output to
5149 // include the PCH file. Clang's PTH solution is completely transparent, so we
5150 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005151 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005152
Daniel Dunbar17731772009-03-23 19:03:36 +00005153 // Claim some arguments which clang doesn't support, but we don't
5154 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005155 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5156 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005157
Rafael Espindolab0092d72013-09-04 19:37:35 +00005158 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005159 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005160}
5161
John McCall5fb5df92012-06-20 06:18:46 +00005162/// Add options related to the Objective-C runtime/ABI.
5163///
5164/// Returns true if the runtime is non-fragile.
5165ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5166 ArgStringList &cmdArgs,
5167 RewriteKind rewriteKind) const {
5168 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005169 Arg *runtimeArg =
5170 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5171 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005172
5173 // Just forward -fobjc-runtime= to the frontend. This supercedes
5174 // options about fragility.
5175 if (runtimeArg &&
5176 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5177 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005178 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005179 if (runtime.tryParse(value)) {
5180 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005181 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005182 }
5183
5184 runtimeArg->render(args, cmdArgs);
5185 return runtime;
5186 }
5187
5188 // Otherwise, we'll need the ABI "version". Version numbers are
5189 // slightly confusing for historical reasons:
5190 // 1 - Traditional "fragile" ABI
5191 // 2 - Non-fragile ABI, version 1
5192 // 3 - Non-fragile ABI, version 2
5193 unsigned objcABIVersion = 1;
5194 // If -fobjc-abi-version= is present, use that to set the version.
5195 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005196 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005197 if (value == "1")
5198 objcABIVersion = 1;
5199 else if (value == "2")
5200 objcABIVersion = 2;
5201 else if (value == "3")
5202 objcABIVersion = 3;
5203 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005204 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005205 } else {
5206 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005207 bool nonFragileABIIsDefault =
5208 (rewriteKind == RK_NonFragile ||
5209 (rewriteKind == RK_None &&
5210 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005211 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5212 options::OPT_fno_objc_nonfragile_abi,
5213 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005214// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005215#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5216 unsigned nonFragileABIVersion = 1;
5217#else
5218 unsigned nonFragileABIVersion = 2;
5219#endif
5220
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005221 if (Arg *abiArg =
5222 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005223 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005224 if (value == "1")
5225 nonFragileABIVersion = 1;
5226 else if (value == "2")
5227 nonFragileABIVersion = 2;
5228 else
5229 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005230 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005231 }
5232
5233 objcABIVersion = 1 + nonFragileABIVersion;
5234 } else {
5235 objcABIVersion = 1;
5236 }
5237 }
5238
5239 // We don't actually care about the ABI version other than whether
5240 // it's non-fragile.
5241 bool isNonFragile = objcABIVersion != 1;
5242
5243 // If we have no runtime argument, ask the toolchain for its default runtime.
5244 // However, the rewriter only really supports the Mac runtime, so assume that.
5245 ObjCRuntime runtime;
5246 if (!runtimeArg) {
5247 switch (rewriteKind) {
5248 case RK_None:
5249 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5250 break;
5251 case RK_Fragile:
5252 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5253 break;
5254 case RK_NonFragile:
5255 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5256 break;
5257 }
5258
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005259 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005260 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5261 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005262 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005263 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5264
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005265 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005266 } else {
5267 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5268 }
5269
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005270 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005271 } else {
5272 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005273 // Legacy behaviour is to target the gnustep runtime if we are i
5274 // non-fragile mode or the GCC runtime in fragile mode.
5275 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005276 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005277 else
5278 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005279 }
5280
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005281 cmdArgs.push_back(
5282 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005283 return runtime;
5284}
5285
Reid Klecknerc542d372014-06-27 17:02:02 +00005286static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5287 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5288 I += HaveDash;
5289 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005290}
Reid Klecknerc542d372014-06-27 17:02:02 +00005291
5292struct EHFlags {
5293 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5294 bool Synch;
5295 bool Asynch;
5296 bool NoExceptC;
5297};
5298
5299/// /EH controls whether to run destructor cleanups when exceptions are
5300/// thrown. There are three modifiers:
5301/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5302/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5303/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5304/// - c: Assume that extern "C" functions are implicitly noexcept. This
5305/// modifier is an optimization, so we ignore it for now.
5306/// The default is /EHs-c-, meaning cleanups are disabled.
5307static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5308 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005309
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005310 std::vector<std::string> EHArgs =
5311 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005312 for (auto EHVal : EHArgs) {
5313 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5314 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005315 case 'a':
5316 EH.Asynch = maybeConsumeDash(EHVal, I);
5317 continue;
5318 case 'c':
5319 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5320 continue;
5321 case 's':
5322 EH.Synch = maybeConsumeDash(EHVal, I);
5323 continue;
5324 default:
5325 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005326 }
5327 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5328 break;
5329 }
5330 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005331
Reid Kleckner5c6efed2015-07-14 18:16:48 +00005332 // FIXME: Disable C++ EH completely, until it becomes more reliable. Users
5333 // can use -Xclang to manually enable C++ EH until then.
5334 EH = EHFlags();
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005335
Reid Klecknerc542d372014-06-27 17:02:02 +00005336 return EH;
5337}
5338
Hans Wennborg75958c42013-08-08 00:17:41 +00005339void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5340 unsigned RTOptionID = options::OPT__SLASH_MT;
5341
Hans Wennborgf1a74252013-09-10 20:18:04 +00005342 if (Args.hasArg(options::OPT__SLASH_LDd))
5343 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5344 // but defining _DEBUG is sticky.
5345 RTOptionID = options::OPT__SLASH_MTd;
5346
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005347 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005348 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005349
David Majnemere2afb472015-07-24 06:49:13 +00005350 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005351 switch (RTOptionID) {
5352 case options::OPT__SLASH_MD:
5353 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005354 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005355 CmdArgs.push_back("-D_MT");
5356 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005357 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005358 break;
5359 case options::OPT__SLASH_MDd:
5360 CmdArgs.push_back("-D_DEBUG");
5361 CmdArgs.push_back("-D_MT");
5362 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005363 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005364 break;
5365 case options::OPT__SLASH_MT:
5366 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005367 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005368 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005369 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005370 break;
5371 case options::OPT__SLASH_MTd:
5372 CmdArgs.push_back("-D_DEBUG");
5373 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005374 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005375 break;
5376 default:
5377 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005378 }
5379
David Majnemere2afb472015-07-24 06:49:13 +00005380 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5381 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5382 } else {
5383 CmdArgs.push_back(FlagForCRT.data());
5384
5385 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5386 // users want. The /Za flag to cl.exe turns this off, but it's not
5387 // implemented in clang.
5388 CmdArgs.push_back("--dependent-lib=oldnames");
5389 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005390
Hans Wennborg8858a032014-07-21 23:42:07 +00005391 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5392 // would produce interleaved output, so ignore /showIncludes in such cases.
5393 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5394 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5395 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005396
David Majnemerf6072342014-07-01 22:24:56 +00005397 // This controls whether or not we emit RTTI data for polymorphic types.
5398 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5399 /*default=*/false))
5400 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005401
Reid Kleckner124955a2015-08-05 18:51:13 +00005402 // Emit CodeView if -Z7 is present.
5403 bool EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
5404 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5405 // If we are emitting CV but not DWARF, don't build information that LLVM
5406 // can't yet process.
5407 if (EmitCodeView && !EmitDwarf)
5408 CmdArgs.push_back("-gline-tables-only");
5409 if (EmitCodeView)
5410 CmdArgs.push_back("-gcodeview");
5411
Reid Klecknerc542d372014-06-27 17:02:02 +00005412 const Driver &D = getToolChain().getDriver();
5413 EHFlags EH = parseClangCLEHFlags(D, Args);
5414 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005415 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005416 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005417 CmdArgs.push_back("-fexceptions");
5418 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005419
Hans Wennborge50cec32014-06-13 20:59:54 +00005420 // /EP should expand to -E -P.
5421 if (Args.hasArg(options::OPT__SLASH_EP)) {
5422 CmdArgs.push_back("-E");
5423 CmdArgs.push_back("-P");
5424 }
5425
David Majnemera5b195a2015-02-14 01:35:12 +00005426 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005427 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5428 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005429 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5430 else
5431 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5432
5433 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5434 VolatileOptionID = A->getOption().getID();
5435
5436 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5437 CmdArgs.push_back("-fms-volatile");
5438
David Majnemer86c318f2014-02-11 21:05:00 +00005439 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5440 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5441 if (MostGeneralArg && BestCaseArg)
5442 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5443 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5444
5445 if (MostGeneralArg) {
5446 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5447 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5448 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5449
5450 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5451 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5452 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5453 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5454 << FirstConflict->getAsString(Args)
5455 << SecondConflict->getAsString(Args);
5456
5457 if (SingleArg)
5458 CmdArgs.push_back("-fms-memptr-rep=single");
5459 else if (MultipleArg)
5460 CmdArgs.push_back("-fms-memptr-rep=multiple");
5461 else
5462 CmdArgs.push_back("-fms-memptr-rep=virtual");
5463 }
5464
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005465 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5466 A->render(Args, CmdArgs);
5467
Hans Wennborg81f74482013-09-10 01:07:07 +00005468 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5469 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005470 if (Args.hasArg(options::OPT__SLASH_fallback))
5471 CmdArgs.push_back("msvc-fallback");
5472 else
5473 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005474 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005475}
5476
Douglas Katzman95354292015-06-23 20:42:09 +00005477visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005478 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005479 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005480 return CLFallback.get();
5481}
5482
Daniel Sanders7f933f42015-01-30 17:35:23 +00005483void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5484 ArgStringList &CmdArgs) const {
5485 StringRef CPUName;
5486 StringRef ABIName;
5487 const llvm::Triple &Triple = getToolChain().getTriple();
5488 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5489
5490 CmdArgs.push_back("-target-abi");
5491 CmdArgs.push_back(ABIName.data());
5492}
5493
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005494void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005495 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005496 const ArgList &Args,
5497 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005498 ArgStringList CmdArgs;
5499
5500 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5501 const InputInfo &Input = Inputs[0];
5502
James Y Knight2db38f32015-08-15 03:45:25 +00005503 std::string TripleStr =
5504 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5505 const llvm::Triple Triple(TripleStr);
5506
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005507 // Don't warn about "clang -w -c foo.s"
5508 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005509 // and "clang -emit-llvm -c foo.s"
5510 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005511
Rafael Espindola577637a2015-01-03 00:06:04 +00005512 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005513
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005514 // Invoke ourselves in -cc1as mode.
5515 //
5516 // FIXME: Implement custom jobs for internal actions.
5517 CmdArgs.push_back("-cc1as");
5518
5519 // Add the "effective" target triple.
5520 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005521 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5522
5523 // Set the output mode, we currently only expect to be used as a real
5524 // assembler.
5525 CmdArgs.push_back("-filetype");
5526 CmdArgs.push_back("obj");
5527
Eric Christopher45f2e712012-12-18 00:31:10 +00005528 // Set the main file name, so that debug info works even with
5529 // -save-temps or preprocessed assembly.
5530 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005531 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005532
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005533 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005534 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005535 if (!CPU.empty()) {
5536 CmdArgs.push_back("-target-cpu");
5537 CmdArgs.push_back(Args.MakeArgString(CPU));
5538 }
5539
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005540 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005541 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005542
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005543 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005544 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005545
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005546 // Pass along any -I options so we get proper .include search paths.
5547 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5548
Eric Christopherfc3ee562012-01-10 00:38:01 +00005549 // Determine the original source input.
5550 const Action *SourceAction = &JA;
5551 while (SourceAction->getKind() != Action::InputClass) {
5552 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5553 SourceAction = SourceAction->getInputs()[0];
5554 }
5555
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005556 // Forward -g and handle debug info related flags, assuming we are dealing
5557 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005558 if (SourceAction->getType() == types::TY_Asm ||
5559 SourceAction->getType() == types::TY_PP_Asm) {
5560 Args.ClaimAllArgs(options::OPT_g_Group);
5561 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5562 if (!A->getOption().matches(options::OPT_g0))
5563 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005564
Douglas Katzman553927a2015-09-14 20:31:28 +00005565 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
5566 options::OPT_gdwarf_4))
5567 A->render(Args, CmdArgs);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005568
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005569 // Add the -fdebug-compilation-dir flag if needed.
5570 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005571
5572 // Set the AT_producer to the clang version when using the integrated
5573 // assembler on assembly source files.
5574 CmdArgs.push_back("-dwarf-debug-producer");
5575 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005576
5577 // And pass along -I options
5578 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005579 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005580
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005581 // Handle -fPIC et al -- the relocation-model affects the assembler
5582 // for some targets.
5583 llvm::Reloc::Model RelocationModel;
5584 unsigned PICLevel;
5585 bool IsPIE;
5586 std::tie(RelocationModel, PICLevel, IsPIE) =
5587 ParsePICArgs(getToolChain(), Triple, Args);
5588
5589 const char *RMName = RelocationModelName(RelocationModel);
5590 if (RMName) {
5591 CmdArgs.push_back("-mrelocation-model");
5592 CmdArgs.push_back(RMName);
5593 }
5594
Kevin Enderby292dc082011-12-22 19:31:58 +00005595 // Optionally embed the -cc1as level arguments into the debug info, for build
5596 // analysis.
5597 if (getToolChain().UseDwarfDebugFlags()) {
5598 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005599 for (const auto &Arg : Args)
5600 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005601
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005602 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005603 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5604 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005605 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005606 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005607 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005608 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005609 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005610 }
5611 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005612 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005613 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005614
5615 // FIXME: Add -static support, once we have it.
5616
Daniel Sanders7f933f42015-01-30 17:35:23 +00005617 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005618 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005619 default:
5620 break;
5621
5622 case llvm::Triple::mips:
5623 case llvm::Triple::mipsel:
5624 case llvm::Triple::mips64:
5625 case llvm::Triple::mips64el:
5626 AddMIPSTargetArgs(Args, CmdArgs);
5627 break;
5628 }
5629
David Blaikie372d9502014-01-17 03:17:40 +00005630 // Consume all the warning flags. Usually this would be handled more
5631 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5632 // doesn't handle that so rather than warning about unused flags that are
5633 // actually used, we'll lie by omission instead.
5634 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005635 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5636 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005637
David Blaikie9260ed62013-07-25 21:19:01 +00005638 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5639 getToolChain().getDriver());
5640
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005641 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005642
5643 assert(Output.isFilename() && "Unexpected lipo output.");
5644 CmdArgs.push_back("-o");
5645 CmdArgs.push_back(Output.getFilename());
5646
Daniel Dunbarb440f562010-08-02 02:38:21 +00005647 assert(Input.isFilename() && "Invalid input.");
5648 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005649
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005650 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005651 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005652
5653 // Handle the debug info splitting at object creation time if we're
5654 // creating an object.
5655 // TODO: Currently only works on linux with newer objcopy.
5656 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005657 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005658 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005659 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005660}
5661
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005662void GnuTool::anchor() {}
5663
Daniel Dunbara3246a02009-03-18 08:07:30 +00005664void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005665 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005666 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005667 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005668 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005669 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005670
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005671 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005672 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005673 // Don't forward any -g arguments to assembly steps.
5674 if (isa<AssembleJobAction>(JA) &&
5675 A->getOption().matches(options::OPT_g_Group))
5676 continue;
5677
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005678 // Don't forward any -W arguments to assembly and link steps.
5679 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5680 A->getOption().matches(options::OPT_W_Group))
5681 continue;
5682
Daniel Dunbar2da02722009-03-19 07:55:12 +00005683 // It is unfortunate that we have to claim here, as this means
5684 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005685 // platforms using a generic gcc, even if we are just using gcc
5686 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005687 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005688 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005689 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005690 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005691
Daniel Dunbar4e295052010-01-25 22:35:08 +00005692 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005693
5694 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005695 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005696 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005697 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005698 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005699 }
5700
Daniel Dunbar5716d872009-05-02 21:41:52 +00005701 // Try to force gcc to match the tool chain we want, if we recognize
5702 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005703 //
5704 // FIXME: The triple class should directly provide the information we want
5705 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005706 switch (getToolChain().getArch()) {
5707 default:
5708 break;
5709 case llvm::Triple::x86:
5710 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005711 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005712 break;
5713 case llvm::Triple::x86_64:
5714 case llvm::Triple::ppc64:
5715 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005716 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005717 break;
5718 case llvm::Triple::sparcel:
5719 CmdArgs.push_back("-EL");
5720 break;
5721 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005722
Daniel Dunbarb440f562010-08-02 02:38:21 +00005723 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005724 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005725 CmdArgs.push_back(Output.getFilename());
5726 } else {
5727 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005728 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005729 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005730
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005731 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005732
5733 // Only pass -x if gcc will understand it; otherwise hope gcc
5734 // understands the suffix correctly. The main use case this would go
5735 // wrong in is for linker inputs if they happened to have an odd
5736 // suffix; really the only way to get this to happen is a command
5737 // like '-x foobar a.c' which will treat a.c like a linker input.
5738 //
5739 // FIXME: For the linker case specifically, can we safely convert
5740 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005741 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005742 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005743 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5744 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005745 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005746 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005747 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005748 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005749 else if (II.getType() == types::TY_ModuleFile)
5750 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005751 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005752
Daniel Dunbara3246a02009-03-18 08:07:30 +00005753 if (types::canTypeBeUserSpecified(II.getType())) {
5754 CmdArgs.push_back("-x");
5755 CmdArgs.push_back(types::getTypeName(II.getType()));
5756 }
5757
Daniel Dunbarb440f562010-08-02 02:38:21 +00005758 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005759 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005760 else {
5761 const Arg &A = II.getInputArg();
5762
5763 // Reverse translate some rewritten options.
5764 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5765 CmdArgs.push_back("-lstdc++");
5766 continue;
5767 }
5768
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005769 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005770 A.render(Args, CmdArgs);
5771 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005772 }
5773
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005774 const std::string customGCCName = D.getCCCGenericGCCName();
5775 const char *GCCName;
5776 if (!customGCCName.empty())
5777 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005778 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005779 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005780 } else
5781 GCCName = "gcc";
5782
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005783 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005784 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005785}
5786
Douglas Katzman95354292015-06-23 20:42:09 +00005787void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5788 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005789 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005790}
5791
Douglas Katzman95354292015-06-23 20:42:09 +00005792void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5793 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005794 const Driver &D = getToolChain().getDriver();
5795
Eric Christophercc7ff502015-01-29 00:56:17 +00005796 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005797 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005798 case types::TY_LLVM_IR:
5799 case types::TY_LTO_IR:
5800 case types::TY_LLVM_BC:
5801 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005802 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005803 break;
5804 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005805 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005806 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005807 case types::TY_Nothing:
5808 CmdArgs.push_back("-fsyntax-only");
5809 break;
5810 default:
5811 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005812 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005813}
5814
Douglas Katzman95354292015-06-23 20:42:09 +00005815void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5816 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005817 // The types are (hopefully) good enough.
5818}
5819
Tony Linthicum76329bf2011-12-12 21:14:55 +00005820// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005821void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5822 ArgStringList &CmdArgs) const {}
5823void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5824 const InputInfo &Output,
5825 const InputInfoList &Inputs,
5826 const ArgList &Args,
5827 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005828 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005829
5830 const Driver &D = getToolChain().getDriver();
5831 ArgStringList CmdArgs;
5832
5833 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005834 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005835 CmdArgs.push_back(Args.MakeArgString(MarchString));
5836
5837 RenderExtraToolArgs(JA, CmdArgs);
5838
5839 if (Output.isFilename()) {
5840 CmdArgs.push_back("-o");
5841 CmdArgs.push_back(Output.getFilename());
5842 } else {
5843 assert(Output.isNothing() && "Unexpected output");
5844 CmdArgs.push_back("-fsyntax-only");
5845 }
5846
Douglas Katzman54366072015-07-27 16:53:08 +00005847 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005848 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005849
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005850 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005851
Tony Linthicum76329bf2011-12-12 21:14:55 +00005852 // Only pass -x if gcc will understand it; otherwise hope gcc
5853 // understands the suffix correctly. The main use case this would go
5854 // wrong in is for linker inputs if they happened to have an odd
5855 // suffix; really the only way to get this to happen is a command
5856 // like '-x foobar a.c' which will treat a.c like a linker input.
5857 //
5858 // FIXME: For the linker case specifically, can we safely convert
5859 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005860 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005861 // Don't try to pass LLVM or AST inputs to a generic gcc.
5862 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5863 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5864 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005865 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005866 else if (II.getType() == types::TY_AST)
5867 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005868 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005869 else if (II.getType() == types::TY_ModuleFile)
5870 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005871 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005872
5873 if (II.isFilename())
5874 CmdArgs.push_back(II.getFilename());
5875 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005876 // Don't render as input, we need gcc to do the translations.
5877 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005878 II.getInputArg().render(Args, CmdArgs);
5879 }
5880
5881 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005882 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005883 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005884}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005885
Douglas Katzman95354292015-06-23 20:42:09 +00005886void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5887 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005888 // The types are (hopefully) good enough.
5889}
5890
Douglas Katzman54366072015-07-27 16:53:08 +00005891static void
5892constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5893 const toolchains::HexagonToolChain &ToolChain,
5894 const InputInfo &Output, const InputInfoList &Inputs,
5895 const ArgList &Args, ArgStringList &CmdArgs,
5896 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005897
Matthew Curtise689b052012-12-06 15:46:07 +00005898 const Driver &D = ToolChain.getDriver();
5899
Matthew Curtise689b052012-12-06 15:46:07 +00005900 //----------------------------------------------------------------------------
5901 //
5902 //----------------------------------------------------------------------------
5903 bool hasStaticArg = Args.hasArg(options::OPT_static);
5904 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005905 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005906 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5907 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5908 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005909 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005910 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005911
Matthew Curtise689b052012-12-06 15:46:07 +00005912 //----------------------------------------------------------------------------
5913 // Silence warnings for various options
5914 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005915
Matthew Curtise689b052012-12-06 15:46:07 +00005916 Args.ClaimAllArgs(options::OPT_g_Group);
5917 Args.ClaimAllArgs(options::OPT_emit_llvm);
5918 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5919 // handled somewhere else.
5920 Args.ClaimAllArgs(options::OPT_static_libgcc);
5921
5922 //----------------------------------------------------------------------------
5923 //
5924 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005925 for (const auto &Opt : ToolChain.ExtraOpts)
5926 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005927
Douglas Katzman54366072015-07-27 16:53:08 +00005928 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00005929 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005930
Matthew Curtise689b052012-12-06 15:46:07 +00005931 if (buildingLib) {
5932 CmdArgs.push_back("-shared");
5933 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5934 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005935 }
5936
Matthew Curtise689b052012-12-06 15:46:07 +00005937 if (hasStaticArg)
5938 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005939
Matthew Curtise8f80a12012-12-06 17:49:03 +00005940 if (buildPIE && !buildingLib)
5941 CmdArgs.push_back("-pie");
5942
Douglas Katzman54366072015-07-27 16:53:08 +00005943 if (const char *v =
5944 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005945 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00005946 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005947 }
5948
Matthew Curtise689b052012-12-06 15:46:07 +00005949 //----------------------------------------------------------------------------
5950 //
5951 //----------------------------------------------------------------------------
5952 CmdArgs.push_back("-o");
5953 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005954
Matthew Curtise689b052012-12-06 15:46:07 +00005955 const std::string MarchSuffix = "/" + MarchString;
5956 const std::string G0Suffix = "/G0";
5957 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00005958 const std::string RootDir = ToolChain.GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005959 const std::string StartFilesDir =
5960 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005961
5962 //----------------------------------------------------------------------------
5963 // moslib
5964 //----------------------------------------------------------------------------
5965 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005966 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005967
Sean Silva14facf32015-06-09 01:57:17 +00005968 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5969 A->claim();
5970 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005971 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005972 }
Matthew Curtise689b052012-12-06 15:46:07 +00005973 if (oslibs.empty()) {
5974 oslibs.push_back("standalone");
5975 hasStandalone = true;
5976 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005977
Matthew Curtise689b052012-12-06 15:46:07 +00005978 //----------------------------------------------------------------------------
5979 // Start Files
5980 //----------------------------------------------------------------------------
5981 if (incStdLib && incStartFiles) {
5982
5983 if (!buildingLib) {
5984 if (hasStandalone) {
5985 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005986 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00005987 }
5988 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5989 }
5990 std::string initObj = useShared ? "/initS.o" : "/init.o";
5991 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5992 }
5993
5994 //----------------------------------------------------------------------------
5995 // Library Search Paths
5996 //----------------------------------------------------------------------------
5997 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005998 for (const auto &LibPath : LibPaths)
5999 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006000
6001 //----------------------------------------------------------------------------
6002 //
6003 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006004 Args.AddAllArgs(CmdArgs,
6005 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6006 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006007
6008 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6009
6010 //----------------------------------------------------------------------------
6011 // Libraries
6012 //----------------------------------------------------------------------------
6013 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006014 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00006015 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6016 CmdArgs.push_back("-lm");
6017 }
6018
6019 CmdArgs.push_back("--start-group");
6020
6021 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00006022 for (const std::string &Lib : oslibs)
6023 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006024 CmdArgs.push_back("-lc");
6025 }
6026 CmdArgs.push_back("-lgcc");
6027
6028 CmdArgs.push_back("--end-group");
6029 }
6030
6031 //----------------------------------------------------------------------------
6032 // End files
6033 //----------------------------------------------------------------------------
6034 if (incStdLib && incStartFiles) {
6035 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
6036 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
6037 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006038}
6039
Douglas Katzman95354292015-06-23 20:42:09 +00006040void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6041 const InputInfo &Output,
6042 const InputInfoList &Inputs,
6043 const ArgList &Args,
6044 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006045
Douglas Katzman54366072015-07-27 16:53:08 +00006046 const toolchains::HexagonToolChain &ToolChain =
6047 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006048
6049 ArgStringList CmdArgs;
6050 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
6051 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006052
6053 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00006054 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006055 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006056}
6057// Hexagon tools end.
6058
Tom Stellard8fa33092015-07-18 01:49:05 +00006059void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6060 const InputInfo &Output,
6061 const InputInfoList &Inputs,
6062 const ArgList &Args,
6063 const char *LinkingOutput) const {
6064
6065 std::string Linker = getToolChain().GetProgramPath(getShortName());
6066 ArgStringList CmdArgs;
6067 CmdArgs.push_back("-flavor");
6068 CmdArgs.push_back("gnu");
6069 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006070 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006071 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6072 CmdArgs.push_back("-o");
6073 CmdArgs.push_back(Output.getFilename());
6074 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6075 CmdArgs, Inputs));
6076}
6077// AMDGPU tools end.
6078
Renato Golin7c542b42015-07-27 23:44:45 +00006079const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006080 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006081 if (!Arch.empty())
6082 MArch = Arch;
6083 else
Bernard Ogden31561762013-12-12 13:27:11 +00006084 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006085 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00006086
6087 // Handle -march=native.
6088 if (MArch == "native") {
6089 std::string CPU = llvm::sys::getHostCPUName();
6090 if (CPU != "generic") {
6091 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006092 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006093 // If there is no valid architecture suffix for this CPU we don't know how
6094 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006095 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006096 MArch = "";
6097 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006098 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006099 }
6100 }
6101
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006102 return MArch;
6103}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006104
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006105/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006106StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006107 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006108 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6109 // here means an -march=native that we can't handle, so instead return no CPU.
6110 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006111 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006112
John Brawna95c1a82015-05-08 12:52:18 +00006113 // We need to return an empty string here on invalid MArch values as the
6114 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006115 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006116}
6117
6118/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006119std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006120 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006121 // FIXME: Warn on inconsistent use of -mcpu and -march.
6122 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006123 if (!CPU.empty()) {
6124 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006125 // Handle -mcpu=native.
6126 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006127 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006128 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006129 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006130 }
6131
Renato Goline17c5802015-07-27 23:44:42 +00006132 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006133}
6134
6135/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006136/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006137// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006138StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6139 const llvm::Triple &Triple) {
6140 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006141 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006142 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006143 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006144 if (ArchKind == llvm::ARM::AK_INVALID)
6145 // In case of generic Arch, i.e. "arm",
6146 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006147 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006148 } else {
6149 ArchKind = llvm::ARM::parseCPUArch(CPU);
6150 }
Renato Golin3c007252015-05-28 15:05:53 +00006151 if (ArchKind == llvm::ARM::AK_INVALID)
6152 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006153 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006154}
6155
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006156void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006157 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006158 if (Args.hasArg(options::OPT_r))
6159 return;
6160
John Brawn94fd9632015-05-21 12:19:49 +00006161 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6162 // to generate BE-8 executables.
6163 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6164 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006165}
6166
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006167mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006168 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6169 // was first introduced in Release 3. However, other compilers have
6170 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006171 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6172 .Case("mips1", NanLegacy)
6173 .Case("mips2", NanLegacy)
6174 .Case("mips3", NanLegacy)
6175 .Case("mips4", NanLegacy)
6176 .Case("mips5", NanLegacy)
6177 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006178 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006179 .Case("mips32r3", NanLegacy | Nan2008)
6180 .Case("mips32r5", NanLegacy | Nan2008)
6181 .Case("mips32r6", Nan2008)
6182 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006183 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006184 .Case("mips64r3", NanLegacy | Nan2008)
6185 .Case("mips64r5", NanLegacy | Nan2008)
6186 .Case("mips64r6", Nan2008)
6187 .Default(NanLegacy);
6188}
6189
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006190bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6191 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6192 return A && (A->getValue() == StringRef(Value));
6193}
6194
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006195bool mips::isUCLibc(const ArgList &Args) {
6196 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006197 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006198}
6199
Daniel Sanders2bf13662014-07-10 14:40:57 +00006200bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006201 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6202 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006203 .Case("2008", true)
6204 .Case("legacy", false)
6205 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006206
6207 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006208 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006209 .Cases("mips32r6", "mips64r6", true)
6210 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006211
6212 return false;
6213}
6214
Daniel Sanders379d44b2014-07-16 11:52:23 +00006215bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006216 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006217 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006218 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006219 return false;
6220
6221 if (ABIName != "32")
6222 return false;
6223
Toma Tabacu94ea6862015-06-16 13:54:13 +00006224 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6225 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006226 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006227 return false;
6228
Daniel Sanders379d44b2014-07-16 11:52:23 +00006229 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006230 .Cases("mips2", "mips3", "mips4", "mips5", true)
6231 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6232 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6233 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006234}
6235
Toma Tabacu94ea6862015-06-16 13:54:13 +00006236bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6237 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006238 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006239 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6240
6241 // FPXX shouldn't be used if -msingle-float is present.
6242 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6243 options::OPT_mdouble_float))
6244 if (A->getOption().matches(options::OPT_msingle_float))
6245 UseFPXX = false;
6246
6247 return UseFPXX;
6248}
6249
Tim Northover157d9112014-01-16 08:48:16 +00006250llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006251 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6252 // archs which Darwin doesn't use.
6253
6254 // The matching this routine does is fairly pointless, since it is neither the
6255 // complete architecture list, nor a reasonable subset. The problem is that
6256 // historically the driver driver accepts this and also ties its -march=
6257 // handling to the architecture name, so we need to be careful before removing
6258 // support for it.
6259
6260 // This code must be kept in sync with Clang's Darwin specific argument
6261 // translation.
6262
6263 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006264 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6265 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6266 .Case("ppc64", llvm::Triple::ppc64)
6267 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6268 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6269 llvm::Triple::x86)
6270 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6271 // This is derived from the driver driver.
6272 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6273 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6274 .Cases("armv7s", "xscale", llvm::Triple::arm)
6275 .Case("arm64", llvm::Triple::aarch64)
6276 .Case("r600", llvm::Triple::r600)
6277 .Case("amdgcn", llvm::Triple::amdgcn)
6278 .Case("nvptx", llvm::Triple::nvptx)
6279 .Case("nvptx64", llvm::Triple::nvptx64)
6280 .Case("amdil", llvm::Triple::amdil)
6281 .Case("spir", llvm::Triple::spir)
6282 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006283}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006284
Tim Northover157d9112014-01-16 08:48:16 +00006285void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006286 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006287 T.setArch(Arch);
6288
6289 if (Str == "x86_64h")
6290 T.setArchName(Str);
6291 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6292 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006293 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006294 }
6295}
6296
Bob Wilsondecc03e2012-11-23 06:14:39 +00006297const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006298 const InputInfo &Input) {
6299 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006300}
6301
Bob Wilsondecc03e2012-11-23 06:14:39 +00006302const char *Clang::getBaseInputStem(const ArgList &Args,
6303 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006304 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006305
Chris Lattner906bb902011-01-16 08:14:11 +00006306 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006307 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006308
6309 return Str;
6310}
6311
Bob Wilsondecc03e2012-11-23 06:14:39 +00006312const char *Clang::getDependencyFileName(const ArgList &Args,
6313 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006314 // FIXME: Think about this more.
6315 std::string Res;
6316
6317 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006318 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006319 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006320 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006321 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006322 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006323 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006324}
6325
Douglas Katzman95354292015-06-23 20:42:09 +00006326void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6327 const InputInfo &Output,
6328 const InputInfoList &Inputs,
6329 const ArgList &Args,
6330 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006331 const ToolChain &ToolChain = getToolChain();
6332 const Driver &D = ToolChain.getDriver();
6333 ArgStringList CmdArgs;
6334
6335 // Silence warning for "clang -g foo.o -o foo"
6336 Args.ClaimAllArgs(options::OPT_g_Group);
6337 // and "clang -emit-llvm foo.o -o foo"
6338 Args.ClaimAllArgs(options::OPT_emit_llvm);
6339 // and for "clang -w foo.o -o foo". Other warning options are already
6340 // handled somewhere else.
6341 Args.ClaimAllArgs(options::OPT_w);
6342
6343 if (!D.SysRoot.empty())
6344 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6345
6346 // CloudABI only supports static linkage.
6347 CmdArgs.push_back("-Bstatic");
6348 CmdArgs.push_back("--eh-frame-hdr");
6349 CmdArgs.push_back("--gc-sections");
6350
6351 if (Output.isFilename()) {
6352 CmdArgs.push_back("-o");
6353 CmdArgs.push_back(Output.getFilename());
6354 } else {
6355 assert(Output.isNothing() && "Invalid output.");
6356 }
6357
6358 if (!Args.hasArg(options::OPT_nostdlib) &&
6359 !Args.hasArg(options::OPT_nostartfiles)) {
6360 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6361 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6362 }
6363
6364 Args.AddAllArgs(CmdArgs, options::OPT_L);
6365 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6366 for (const auto &Path : Paths)
6367 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006368 Args.AddAllArgs(CmdArgs,
6369 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6370 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006371
Alexey Samsonov907880e2015-06-19 19:57:46 +00006372 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006373 AddGoldPlugin(ToolChain, Args, CmdArgs);
6374
6375 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6376
6377 if (!Args.hasArg(options::OPT_nostdlib) &&
6378 !Args.hasArg(options::OPT_nodefaultlibs)) {
6379 if (D.CCCIsCXX())
6380 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6381 CmdArgs.push_back("-lc");
6382 CmdArgs.push_back("-lcompiler_rt");
6383 }
6384
6385 if (!Args.hasArg(options::OPT_nostdlib) &&
6386 !Args.hasArg(options::OPT_nostartfiles))
6387 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6388
6389 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006390 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006391}
6392
Douglas Katzman95354292015-06-23 20:42:09 +00006393void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6394 const InputInfo &Output,
6395 const InputInfoList &Inputs,
6396 const ArgList &Args,
6397 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006398 ArgStringList CmdArgs;
6399
6400 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6401 const InputInfo &Input = Inputs[0];
6402
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006403 // Determine the original source input.
6404 const Action *SourceAction = &JA;
6405 while (SourceAction->getKind() != Action::InputClass) {
6406 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6407 SourceAction = SourceAction->getInputs()[0];
6408 }
6409
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006410 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006411 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006412 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6413 // FIXME: at run-time detect assembler capabilities or rely on version
6414 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006415 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006416 const llvm::Triple &T(getToolChain().getTriple());
6417 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006418 CmdArgs.push_back("-Q");
6419 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006420
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006421 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006422 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006423 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006424 if (Args.hasArg(options::OPT_gstabs))
6425 CmdArgs.push_back("--gstabs");
6426 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006427 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006428 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006429
Daniel Dunbarbe220842009-03-20 16:06:39 +00006430 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006431 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006432
Daniel Dunbar6d484762010-07-22 01:47:22 +00006433 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006434 if (getToolChain().getArch() == llvm::Triple::x86 ||
6435 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006436 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6437 CmdArgs.push_back("-force_cpusubtype_ALL");
6438
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006439 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006440 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006441 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006442 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006443 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006444 CmdArgs.push_back("-static");
6445
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006446 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006447
6448 assert(Output.isFilename() && "Unexpected lipo output.");
6449 CmdArgs.push_back("-o");
6450 CmdArgs.push_back(Output.getFilename());
6451
Daniel Dunbarb440f562010-08-02 02:38:21 +00006452 assert(Input.isFilename() && "Invalid input.");
6453 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006454
6455 // asm_final spec is empty.
6456
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006457 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006458 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006459}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006460
Tim Northover157d9112014-01-16 08:48:16 +00006461void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006462
Tim Northover157d9112014-01-16 08:48:16 +00006463void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6464 ArgStringList &CmdArgs) const {
6465 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006466
Daniel Dunbarc1964212009-03-26 16:23:12 +00006467 // Derived from darwin_arch spec.
6468 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006469 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006470
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006471 // FIXME: Is this needed anymore?
6472 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006473 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006474}
6475
Douglas Katzman95354292015-06-23 20:42:09 +00006476bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006477 // We only need to generate a temp path for LTO if we aren't compiling object
6478 // files. When compiling source files, we run 'dsymutil' after linking. We
6479 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006480 for (const auto &Input : Inputs)
6481 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006482 return true;
6483
6484 return false;
6485}
6486
Douglas Katzman95354292015-06-23 20:42:09 +00006487void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6488 ArgStringList &CmdArgs,
6489 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006490 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006491 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006492
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006493 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006494 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6495 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006496 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6497 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006498 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006499 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006500 }
6501
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006502 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006503 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006504 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6505 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006506
Bob Wilson3d27dad2013-08-02 22:25:34 +00006507 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6508 CmdArgs.push_back("-export_dynamic");
6509
Bob Wilsonb111ec92015-03-02 19:01:14 +00006510 // If we are using App Extension restrictions, pass a flag to the linker
6511 // telling it that the compiled code has been audited.
6512 if (Args.hasFlag(options::OPT_fapplication_extension,
6513 options::OPT_fno_application_extension, false))
6514 CmdArgs.push_back("-application_extension");
6515
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00006516 if (D.IsUsingLTO(Args)) {
6517 // If we are using LTO, then automatically create a temporary file path for
6518 // the linker to use, so that it's lifetime will extend past a possible
6519 // dsymutil step.
6520 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6521 const char *TmpPath = C.getArgs().MakeArgString(
6522 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6523 C.addTempFile(TmpPath);
6524 CmdArgs.push_back("-object_path_lto");
6525 CmdArgs.push_back(TmpPath);
6526 }
6527
6528 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6529 // it in clang installed libraries. If not found, the option is not used
6530 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6531 if (Version[0] >= 133) {
6532 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6533 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6534 SmallString<128> LibLTOPath(P);
6535 llvm::sys::path::append(LibLTOPath, "lib");
6536 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
6537 if (llvm::sys::fs::exists(LibLTOPath)) {
6538 CmdArgs.push_back("-lto_library");
6539 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
6540 } else {
6541 D.Diag(diag::warn_drv_lto_libpath);
6542 }
6543 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00006544 }
6545
Daniel Dunbarc1964212009-03-26 16:23:12 +00006546 // Derived from the "link" spec.
6547 Args.AddAllArgs(CmdArgs, options::OPT_static);
6548 if (!Args.hasArg(options::OPT_static))
6549 CmdArgs.push_back("-dynamic");
6550 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6551 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6552 // here. How do we wish to handle such things?
6553 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006554
Daniel Dunbarc1964212009-03-26 16:23:12 +00006555 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006556 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006557 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006558 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006559
6560 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6561 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6562 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6563
6564 Arg *A;
6565 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6566 (A = Args.getLastArg(options::OPT_current__version)) ||
6567 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006568 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6569 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006570
6571 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6572 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6573 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6574 } else {
6575 CmdArgs.push_back("-dylib");
6576
6577 Arg *A;
6578 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6579 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6580 (A = Args.getLastArg(options::OPT_client__name)) ||
6581 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6582 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6583 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006584 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6585 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006586
Daniel Dunbarc1964212009-03-26 16:23:12 +00006587 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6588 "-dylib_compatibility_version");
6589 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6590 "-dylib_current_version");
6591
Tim Northover157d9112014-01-16 08:48:16 +00006592 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006593
6594 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6595 "-dylib_install_name");
6596 }
6597
6598 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6599 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6600 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006601 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006602 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006603 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6604 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6605 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6606 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6607 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6608 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006609 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006610 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6611 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6612 Args.AddAllArgs(CmdArgs, options::OPT_init);
6613
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006614 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006615 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006616
Daniel Dunbarc1964212009-03-26 16:23:12 +00006617 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6618 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6619 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6620 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6621 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006622
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006623 if (const Arg *A =
6624 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6625 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006626 if (A->getOption().matches(options::OPT_fpie) ||
6627 A->getOption().matches(options::OPT_fPIE))
6628 CmdArgs.push_back("-pie");
6629 else
6630 CmdArgs.push_back("-no_pie");
6631 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006632
6633 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6634 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6635 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6636 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6637 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6638 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6639 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6640 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6641 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6642 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6643 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6644 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6645 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6646 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6647 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6648 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006649
Daniel Dunbar84384642011-05-02 21:03:47 +00006650 // Give --sysroot= preference, over the Apple specific behavior to also use
6651 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006652 StringRef sysroot = C.getSysRoot();
6653 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006654 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006655 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006656 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6657 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006658 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006659 }
6660
Daniel Dunbarc1964212009-03-26 16:23:12 +00006661 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6662 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6663 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6664 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6665 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006666 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006667 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6668 Args.AddAllArgs(CmdArgs, options::OPT_y);
6669 Args.AddLastArg(CmdArgs, options::OPT_w);
6670 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6671 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6672 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6673 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6674 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6675 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6676 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6677 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6678 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6679 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6680 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6681 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6682}
6683
Douglas Katzman95354292015-06-23 20:42:09 +00006684void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6685 const InputInfo &Output,
6686 const InputInfoList &Inputs,
6687 const ArgList &Args,
6688 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006689 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006690
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006691 // If the number of arguments surpasses the system limits, we will encode the
6692 // input files in a separate file, shortening the command line. To this end,
6693 // build a list of input file names that can be passed via a file with the
6694 // -filelist linker option.
6695 llvm::opt::ArgStringList InputFileList;
6696
Daniel Dunbarc1964212009-03-26 16:23:12 +00006697 // The logic here is derived from gcc's behavior; most of which
6698 // comes from specs (starting with link_command). Consult gcc for
6699 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006700 ArgStringList CmdArgs;
6701
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006702 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6703 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6704 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006705 for (const auto &Arg : Args)
6706 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006707 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006708 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006709 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006710 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006711 return;
6712 }
6713
Daniel Dunbarc1964212009-03-26 16:23:12 +00006714 // I'm not sure why this particular decomposition exists in gcc, but
6715 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006716 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006717
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006718 // It seems that the 'e' option is completely ignored for dynamic executables
6719 // (the default), and with static executables, the last one wins, as expected.
6720 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6721 options::OPT_Z_Flag, options::OPT_u_Group,
6722 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006723
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006724 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6725 // members of static archive libraries which implement Objective-C classes or
6726 // categories.
6727 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6728 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006729
Daniel Dunbarc1964212009-03-26 16:23:12 +00006730 CmdArgs.push_back("-o");
6731 CmdArgs.push_back(Output.getFilename());
6732
Chad Rosier06fd3c62012-05-16 23:45:12 +00006733 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006734 !Args.hasArg(options::OPT_nostartfiles))
6735 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006736
Peter Collingbournec4122c12015-06-15 21:08:13 +00006737 // SafeStack requires its own runtime libraries
6738 // These libraries should be linked first, to make sure the
6739 // __safestack_init constructor executes before everything else
6740 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6741 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6742 "libclang_rt.safestack_osx.a",
6743 /*AlwaysLink=*/true);
6744 }
6745
Daniel Dunbarc1964212009-03-26 16:23:12 +00006746 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006747
Douglas Gregor9295df02012-05-15 21:00:27 +00006748 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006749 // Build the input file for -filelist (list of linker input files) in case we
6750 // need it later
6751 for (const auto &II : Inputs) {
6752 if (!II.isFilename()) {
6753 // This is a linker input argument.
6754 // We cannot mix input arguments and file names in a -filelist input, thus
6755 // we prematurely stop our list (remaining files shall be passed as
6756 // arguments).
6757 if (InputFileList.size() > 0)
6758 break;
6759
6760 continue;
6761 }
6762
6763 InputFileList.push_back(II.getFilename());
6764 }
6765
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00006766 if (!Args.hasArg(options::OPT_nostdlib) &&
6767 !Args.hasArg(options::OPT_nodefaultlibs))
6768 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
6769
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006770 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006771 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006772 // We use arclite library for both ARC and subscripting support.
6773 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6774
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006775 CmdArgs.push_back("-framework");
6776 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006777 // Link libobj.
6778 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006779 }
John McCall31168b02011-06-15 23:02:42 +00006780
Daniel Dunbarc1964212009-03-26 16:23:12 +00006781 if (LinkingOutput) {
6782 CmdArgs.push_back("-arch_multiple");
6783 CmdArgs.push_back("-final_output");
6784 CmdArgs.push_back(LinkingOutput);
6785 }
6786
Daniel Dunbarc1964212009-03-26 16:23:12 +00006787 if (Args.hasArg(options::OPT_fnested_functions))
6788 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006789
Justin Bognerc7701242015-05-12 05:44:36 +00006790 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6791 // paths are different enough from other toolchains that this needs a fair
6792 // amount of refactoring done first.
6793 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6794
Daniel Dunbarc1964212009-03-26 16:23:12 +00006795 if (!Args.hasArg(options::OPT_nostdlib) &&
6796 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006797 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006798 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006799
Daniel Dunbarc1964212009-03-26 16:23:12 +00006800 // link_ssp spec is empty.
6801
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006802 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006803 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006804 }
6805
Chad Rosier06fd3c62012-05-16 23:45:12 +00006806 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006807 !Args.hasArg(options::OPT_nostartfiles)) {
6808 // endfile_spec is empty.
6809 }
6810
6811 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6812 Args.AddAllArgs(CmdArgs, options::OPT_F);
6813
Steven Wu3ffb61b2015-02-06 18:08:29 +00006814 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006815 for (const Arg *A : Args.filtered(options::OPT_iframework))
6816 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006817
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006818 if (!Args.hasArg(options::OPT_nostdlib) &&
6819 !Args.hasArg(options::OPT_nodefaultlibs)) {
6820 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6821 if (A->getValue() == StringRef("Accelerate")) {
6822 CmdArgs.push_back("-framework");
6823 CmdArgs.push_back("Accelerate");
6824 }
6825 }
6826 }
6827
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006828 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006829 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006830 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006831 Cmd->setInputFileList(std::move(InputFileList));
6832 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006833}
6834
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006835void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006836 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006837 const InputInfoList &Inputs,
6838 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006839 const char *LinkingOutput) const {
6840 ArgStringList CmdArgs;
6841
6842 CmdArgs.push_back("-create");
6843 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006844
6845 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006846 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006847
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006848 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006849 assert(II.isFilename() && "Unexpected lipo input.");
6850 CmdArgs.push_back(II.getFilename());
6851 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006852
6853 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006854 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006855}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006856
Daniel Dunbar88299622010-06-04 18:28:36 +00006857void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006858 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006859 const InputInfoList &Inputs,
6860 const ArgList &Args,
6861 const char *LinkingOutput) const {
6862 ArgStringList CmdArgs;
6863
Daniel Dunbareb86b042011-05-09 17:23:16 +00006864 CmdArgs.push_back("-o");
6865 CmdArgs.push_back(Output.getFilename());
6866
Daniel Dunbar88299622010-06-04 18:28:36 +00006867 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6868 const InputInfo &Input = Inputs[0];
6869 assert(Input.isFilename() && "Unexpected dsymutil input.");
6870 CmdArgs.push_back(Input.getFilename());
6871
Daniel Dunbar88299622010-06-04 18:28:36 +00006872 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006873 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006874 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006875}
6876
Eric Christopher551ef452011-08-23 17:56:55 +00006877void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006878 const InputInfo &Output,
6879 const InputInfoList &Inputs,
6880 const ArgList &Args,
6881 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006882 ArgStringList CmdArgs;
6883 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006884 CmdArgs.push_back("--debug-info");
6885 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006886 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006887
6888 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6889 const InputInfo &Input = Inputs[0];
6890 assert(Input.isFilename() && "Unexpected verify input");
6891
6892 // Grabbing the output of the earlier dsymutil run.
6893 CmdArgs.push_back(Input.getFilename());
6894
6895 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006896 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006897 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00006898}
6899
Douglas Katzman95354292015-06-23 20:42:09 +00006900void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006901 const InputInfo &Output,
6902 const InputInfoList &Inputs,
6903 const ArgList &Args,
6904 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006905 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006906 ArgStringList CmdArgs;
6907
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006908 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006909
6910 CmdArgs.push_back("-o");
6911 CmdArgs.push_back(Output.getFilename());
6912
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006913 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006914 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006915
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006916 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006917 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006918}
6919
Douglas Katzman95354292015-06-23 20:42:09 +00006920void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6921 const InputInfo &Output,
6922 const InputInfoList &Inputs,
6923 const ArgList &Args,
6924 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006925 ArgStringList CmdArgs;
6926
David Chisnall272a0712012-02-29 15:06:12 +00006927 // Demangle C++ names in errors
6928 CmdArgs.push_back("-C");
6929
David Chisnallf571cde2012-02-15 13:39:01 +00006930 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6931 (!Args.hasArg(options::OPT_shared))) {
6932 CmdArgs.push_back("-e");
6933 CmdArgs.push_back("_start");
6934 }
6935
6936 if (Args.hasArg(options::OPT_static)) {
6937 CmdArgs.push_back("-Bstatic");
6938 CmdArgs.push_back("-dn");
6939 } else {
6940 CmdArgs.push_back("-Bdynamic");
6941 if (Args.hasArg(options::OPT_shared)) {
6942 CmdArgs.push_back("-shared");
6943 } else {
6944 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006945 CmdArgs.push_back(
6946 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00006947 }
6948 }
6949
6950 if (Output.isFilename()) {
6951 CmdArgs.push_back("-o");
6952 CmdArgs.push_back(Output.getFilename());
6953 } else {
6954 assert(Output.isNothing() && "Invalid output.");
6955 }
6956
6957 if (!Args.hasArg(options::OPT_nostdlib) &&
6958 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006959 if (!Args.hasArg(options::OPT_shared))
6960 CmdArgs.push_back(
6961 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6962
6963 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6964 CmdArgs.push_back(
6965 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
6966 CmdArgs.push_back(
6967 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006968 }
6969
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006970 const ToolChain::path_list &Paths = getToolChain().getFilePaths();
6971 for (const auto &Path : Paths)
6972 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
David Chisnallf571cde2012-02-15 13:39:01 +00006973
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006974 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
6975 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00006976
6977 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6978
6979 if (!Args.hasArg(options::OPT_nostdlib) &&
6980 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006981 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006982 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006983 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00006984 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006985 if (!Args.hasArg(options::OPT_shared)) {
6986 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00006987 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006988 }
David Chisnallf571cde2012-02-15 13:39:01 +00006989 }
6990
6991 if (!Args.hasArg(options::OPT_nostdlib) &&
6992 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006993 CmdArgs.push_back(
6994 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006995 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006996 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006997
Alexey Samsonov7811d192014-02-20 13:57:37 +00006998 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006999
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007000 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007001 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007002}
7003
Douglas Katzman95354292015-06-23 20:42:09 +00007004void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7005 const InputInfo &Output,
7006 const InputInfoList &Inputs,
7007 const ArgList &Args,
7008 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007009 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007010 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00007011 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007012
Rafael Espindolacc126272014-02-28 01:55:21 +00007013 switch (getToolChain().getArch()) {
7014 case llvm::Triple::x86:
7015 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7016 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007017 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007018 break;
7019
7020 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007021 CmdArgs.push_back("-mppc");
7022 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007023 break;
7024
7025 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007026 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00007027 CmdArgs.push_back("-32");
7028 NeedsKPIC = true;
7029 break;
7030
7031 case llvm::Triple::sparcv9:
7032 CmdArgs.push_back("-64");
7033 CmdArgs.push_back("-Av9a");
7034 NeedsKPIC = true;
7035 break;
7036
7037 case llvm::Triple::mips64:
7038 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007039 StringRef CPUName;
7040 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007041 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007042
7043 CmdArgs.push_back("-mabi");
7044 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7045
7046 if (getToolChain().getArch() == llvm::Triple::mips64)
7047 CmdArgs.push_back("-EB");
7048 else
7049 CmdArgs.push_back("-EL");
7050
Rafael Espindolacc126272014-02-28 01:55:21 +00007051 NeedsKPIC = true;
7052 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007053 }
7054
Rafael Espindolacc126272014-02-28 01:55:21 +00007055 default:
7056 break;
7057 }
7058
7059 if (NeedsKPIC)
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007060 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007061
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007062 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007063
7064 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007065 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007066
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007067 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007068 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007069
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007070 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007071 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007072}
7073
Douglas Katzman95354292015-06-23 20:42:09 +00007074void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7075 const InputInfo &Output,
7076 const InputInfoList &Inputs,
7077 const ArgList &Args,
7078 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007079 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007080 ArgStringList CmdArgs;
7081
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007082 // Silence warning for "clang -g foo.o -o foo"
7083 Args.ClaimAllArgs(options::OPT_g_Group);
7084 // and "clang -emit-llvm foo.o -o foo"
7085 Args.ClaimAllArgs(options::OPT_emit_llvm);
7086 // and for "clang -w foo.o -o foo". Other warning options are already
7087 // handled somewhere else.
7088 Args.ClaimAllArgs(options::OPT_w);
7089
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007090 if (getToolChain().getArch() == llvm::Triple::mips64)
7091 CmdArgs.push_back("-EB");
7092 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7093 CmdArgs.push_back("-EL");
7094
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007095 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007096 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007097 CmdArgs.push_back("-e");
7098 CmdArgs.push_back("__start");
7099 }
7100
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007101 if (Args.hasArg(options::OPT_static)) {
7102 CmdArgs.push_back("-Bstatic");
7103 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007104 if (Args.hasArg(options::OPT_rdynamic))
7105 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007106 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007107 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007108 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007109 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007110 } else {
7111 CmdArgs.push_back("-dynamic-linker");
7112 CmdArgs.push_back("/usr/libexec/ld.so");
7113 }
7114 }
7115
Rafael Espindola044f7832013-06-05 04:28:55 +00007116 if (Args.hasArg(options::OPT_nopie))
7117 CmdArgs.push_back("-nopie");
7118
Daniel Dunbarb440f562010-08-02 02:38:21 +00007119 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007120 CmdArgs.push_back("-o");
7121 CmdArgs.push_back(Output.getFilename());
7122 } else {
7123 assert(Output.isNothing() && "Invalid output.");
7124 }
7125
7126 if (!Args.hasArg(options::OPT_nostdlib) &&
7127 !Args.hasArg(options::OPT_nostartfiles)) {
7128 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007129 if (Args.hasArg(options::OPT_pg))
7130 CmdArgs.push_back(
7131 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007132 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007133 CmdArgs.push_back(
7134 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7135 CmdArgs.push_back(
7136 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007137 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007138 CmdArgs.push_back(
7139 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007140 }
7141 }
7142
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007143 std::string Triple = getToolChain().getTripleString();
7144 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007145 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007146 CmdArgs.push_back(
7147 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007148
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007149 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7150 options::OPT_e, options::OPT_s, options::OPT_t,
7151 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007152
Daniel Dunbar54423b22010-09-17 00:24:54 +00007153 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007154
7155 if (!Args.hasArg(options::OPT_nostdlib) &&
7156 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007157 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007158 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007159 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007160 CmdArgs.push_back("-lm_p");
7161 else
7162 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007163 }
7164
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007165 // FIXME: For some reason GCC passes -lgcc before adding
7166 // the default system libraries. Just mimic this for now.
7167 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007168
Eric Christopher17674ec2012-09-13 06:32:34 +00007169 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007170 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7171 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007172 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007173 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007174 }
7175
Chandler Carruth45661652011-12-17 22:32:42 +00007176 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007177 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007178 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007179 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007180 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007181 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007182
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007183 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007184 }
7185
7186 if (!Args.hasArg(options::OPT_nostdlib) &&
7187 !Args.hasArg(options::OPT_nostartfiles)) {
7188 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007189 CmdArgs.push_back(
7190 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007191 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007192 CmdArgs.push_back(
7193 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007194 }
7195
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007196 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007197 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007198}
Ed Schoutene33194b2009-04-02 19:13:12 +00007199
Douglas Katzman95354292015-06-23 20:42:09 +00007200void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7201 const InputInfo &Output,
7202 const InputInfoList &Inputs,
7203 const ArgList &Args,
7204 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007205 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007206 ArgStringList CmdArgs;
7207
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007208 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007209
7210 CmdArgs.push_back("-o");
7211 CmdArgs.push_back(Output.getFilename());
7212
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007213 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007214 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007215
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007216 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007217 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007218}
7219
Douglas Katzman95354292015-06-23 20:42:09 +00007220void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7221 const InputInfo &Output,
7222 const InputInfoList &Inputs,
7223 const ArgList &Args,
7224 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007225 const Driver &D = getToolChain().getDriver();
7226 ArgStringList CmdArgs;
7227
7228 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7229 (!Args.hasArg(options::OPT_shared))) {
7230 CmdArgs.push_back("-e");
7231 CmdArgs.push_back("__start");
7232 }
7233
7234 if (Args.hasArg(options::OPT_static)) {
7235 CmdArgs.push_back("-Bstatic");
7236 } else {
7237 if (Args.hasArg(options::OPT_rdynamic))
7238 CmdArgs.push_back("-export-dynamic");
7239 CmdArgs.push_back("--eh-frame-hdr");
7240 CmdArgs.push_back("-Bdynamic");
7241 if (Args.hasArg(options::OPT_shared)) {
7242 CmdArgs.push_back("-shared");
7243 } else {
7244 CmdArgs.push_back("-dynamic-linker");
7245 CmdArgs.push_back("/usr/libexec/ld.so");
7246 }
7247 }
7248
7249 if (Output.isFilename()) {
7250 CmdArgs.push_back("-o");
7251 CmdArgs.push_back(Output.getFilename());
7252 } else {
7253 assert(Output.isNothing() && "Invalid output.");
7254 }
7255
7256 if (!Args.hasArg(options::OPT_nostdlib) &&
7257 !Args.hasArg(options::OPT_nostartfiles)) {
7258 if (!Args.hasArg(options::OPT_shared)) {
7259 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007260 CmdArgs.push_back(
7261 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007262 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007263 CmdArgs.push_back(
7264 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7265 CmdArgs.push_back(
7266 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007267 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007268 CmdArgs.push_back(
7269 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007270 }
7271 }
7272
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007273 Args.AddAllArgs(CmdArgs,
7274 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007275
7276 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7277
7278 if (!Args.hasArg(options::OPT_nostdlib) &&
7279 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007280 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007281 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7282 if (Args.hasArg(options::OPT_pg))
7283 CmdArgs.push_back("-lm_p");
7284 else
7285 CmdArgs.push_back("-lm");
7286 }
7287
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007288 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007289 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007290 CmdArgs.push_back("-lpthread_p");
7291 else
7292 CmdArgs.push_back("-lpthread");
7293 }
7294
Eli Friedman9fa28852012-08-08 23:57:20 +00007295 if (!Args.hasArg(options::OPT_shared)) {
7296 if (Args.hasArg(options::OPT_pg))
7297 CmdArgs.push_back("-lc_p");
7298 else
7299 CmdArgs.push_back("-lc");
7300 }
7301
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007302 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007303 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007304 case llvm::Triple::arm:
7305 MyArch = "arm";
7306 break;
7307 case llvm::Triple::x86:
7308 MyArch = "i386";
7309 break;
7310 case llvm::Triple::x86_64:
7311 MyArch = "amd64";
7312 break;
7313 default:
7314 llvm_unreachable("Unsupported architecture");
7315 }
7316 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007317 }
7318
7319 if (!Args.hasArg(options::OPT_nostdlib) &&
7320 !Args.hasArg(options::OPT_nostartfiles)) {
7321 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007322 CmdArgs.push_back(
7323 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007324 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007325 CmdArgs.push_back(
7326 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007327 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007328
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007329 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007330 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007331}
7332
Douglas Katzman95354292015-06-23 20:42:09 +00007333void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7334 const InputInfo &Output,
7335 const InputInfoList &Inputs,
7336 const ArgList &Args,
7337 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007338 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007339 ArgStringList CmdArgs;
7340
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007341 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7342 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007343 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007344 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007345 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007346 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007347 else if (getToolChain().getArch() == llvm::Triple::mips ||
7348 getToolChain().getArch() == llvm::Triple::mipsel ||
7349 getToolChain().getArch() == llvm::Triple::mips64 ||
7350 getToolChain().getArch() == llvm::Triple::mips64el) {
7351 StringRef CPUName;
7352 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007353 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007354
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007355 CmdArgs.push_back("-march");
7356 CmdArgs.push_back(CPUName.data());
7357
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007358 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007359 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007360
7361 if (getToolChain().getArch() == llvm::Triple::mips ||
7362 getToolChain().getArch() == llvm::Triple::mips64)
7363 CmdArgs.push_back("-EB");
7364 else
7365 CmdArgs.push_back("-EL");
7366
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007367 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007368 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007369 getToolChain().getArch() == llvm::Triple::armeb ||
7370 getToolChain().getArch() == llvm::Triple::thumb ||
7371 getToolChain().getArch() == llvm::Triple::thumbeb) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007372 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007373
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007374 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007375 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007376 else
Renato Golinf4421f72014-02-19 10:44:07 +00007377 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007378
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007379 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007380 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007381 case llvm::Triple::GNUEABI:
7382 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007383 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007384 break;
7385
7386 default:
7387 CmdArgs.push_back("-matpcs");
7388 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007389 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007390 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007391 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007392 if (getToolChain().getArch() == llvm::Triple::sparc)
7393 CmdArgs.push_back("-Av8plusa");
7394 else
7395 CmdArgs.push_back("-Av9a");
7396
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007397 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007398 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007399
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007400 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007401
7402 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007403 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007404
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007405 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007406 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007407
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007408 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007409 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007410}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007411
Douglas Katzman95354292015-06-23 20:42:09 +00007412void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7413 const InputInfo &Output,
7414 const InputInfoList &Inputs,
7415 const ArgList &Args,
7416 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007417 const toolchains::FreeBSD &ToolChain =
7418 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007419 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007420 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007421 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007422 !Args.hasArg(options::OPT_shared) &&
7423 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007424 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007425
7426 // Silence warning for "clang -g foo.o -o foo"
7427 Args.ClaimAllArgs(options::OPT_g_Group);
7428 // and "clang -emit-llvm foo.o -o foo"
7429 Args.ClaimAllArgs(options::OPT_emit_llvm);
7430 // and for "clang -w foo.o -o foo". Other warning options are already
7431 // handled somewhere else.
7432 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007433
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007434 if (!D.SysRoot.empty())
7435 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7436
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007437 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007438 CmdArgs.push_back("-pie");
7439
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007440 if (Args.hasArg(options::OPT_static)) {
7441 CmdArgs.push_back("-Bstatic");
7442 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007443 if (Args.hasArg(options::OPT_rdynamic))
7444 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007445 CmdArgs.push_back("--eh-frame-hdr");
7446 if (Args.hasArg(options::OPT_shared)) {
7447 CmdArgs.push_back("-Bshareable");
7448 } else {
7449 CmdArgs.push_back("-dynamic-linker");
7450 CmdArgs.push_back("/libexec/ld-elf.so.1");
7451 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007452 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007453 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7454 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7455 CmdArgs.push_back("--hash-style=both");
7456 }
7457 }
7458 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007459 }
7460
7461 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7462 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007463 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007464 CmdArgs.push_back("-m");
7465 CmdArgs.push_back("elf_i386_fbsd");
7466 }
7467
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007468 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007469 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007470 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007471 }
7472
Daniel Dunbarb440f562010-08-02 02:38:21 +00007473 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007474 CmdArgs.push_back("-o");
7475 CmdArgs.push_back(Output.getFilename());
7476 } else {
7477 assert(Output.isNothing() && "Invalid output.");
7478 }
7479
7480 if (!Args.hasArg(options::OPT_nostdlib) &&
7481 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007482 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007483 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007484 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007485 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007486 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007487 crt1 = "Scrt1.o";
7488 else
7489 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007490 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007491 if (crt1)
7492 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7493
7494 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7495
Craig Topper92fc2df2014-05-17 16:56:41 +00007496 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007497 if (Args.hasArg(options::OPT_static))
7498 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007499 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007500 crtbegin = "crtbeginS.o";
7501 else
7502 crtbegin = "crtbegin.o";
7503
7504 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007505 }
7506
7507 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007508 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007509 for (const auto &Path : Paths)
7510 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007511 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7512 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007513 Args.AddAllArgs(CmdArgs, options::OPT_s);
7514 Args.AddAllArgs(CmdArgs, options::OPT_t);
7515 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7516 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007517
Alexey Samsonov907880e2015-06-19 19:57:46 +00007518 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007519 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007520
Alexey Samsonov52550342014-09-15 19:58:40 +00007521 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007522 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007523
7524 if (!Args.hasArg(options::OPT_nostdlib) &&
7525 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007526 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007527 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007528 if (Args.hasArg(options::OPT_pg))
7529 CmdArgs.push_back("-lm_p");
7530 else
7531 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007532 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007533 if (NeedsSanitizerDeps)
7534 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007535 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7536 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007537 if (Args.hasArg(options::OPT_pg))
7538 CmdArgs.push_back("-lgcc_p");
7539 else
7540 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007541 if (Args.hasArg(options::OPT_static)) {
7542 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007543 } else if (Args.hasArg(options::OPT_pg)) {
7544 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007545 } else {
7546 CmdArgs.push_back("--as-needed");
7547 CmdArgs.push_back("-lgcc_s");
7548 CmdArgs.push_back("--no-as-needed");
7549 }
7550
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007551 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007552 if (Args.hasArg(options::OPT_pg))
7553 CmdArgs.push_back("-lpthread_p");
7554 else
7555 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007556 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007557
Roman Divacky66f22762011-02-10 16:59:40 +00007558 if (Args.hasArg(options::OPT_pg)) {
7559 if (Args.hasArg(options::OPT_shared))
7560 CmdArgs.push_back("-lc");
7561 else
7562 CmdArgs.push_back("-lc_p");
7563 CmdArgs.push_back("-lgcc_p");
7564 } else {
7565 CmdArgs.push_back("-lc");
7566 CmdArgs.push_back("-lgcc");
7567 }
7568
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007569 if (Args.hasArg(options::OPT_static)) {
7570 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007571 } else if (Args.hasArg(options::OPT_pg)) {
7572 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007573 } else {
7574 CmdArgs.push_back("--as-needed");
7575 CmdArgs.push_back("-lgcc_s");
7576 CmdArgs.push_back("--no-as-needed");
7577 }
7578 }
7579
7580 if (!Args.hasArg(options::OPT_nostdlib) &&
7581 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007582 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007583 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007584 else
7585 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007586 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007587 }
7588
Alexey Samsonov7811d192014-02-20 13:57:37 +00007589 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007590
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007591 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007592 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007593}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007594
Douglas Katzman95354292015-06-23 20:42:09 +00007595void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007596 const InputInfo &Output,
7597 const InputInfoList &Inputs,
7598 const ArgList &Args,
7599 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007600 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007601 ArgStringList CmdArgs;
7602
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007603 // GNU as needs different flags for creating the correct output format
7604 // on architectures with different ABIs or optional feature sets.
7605 switch (getToolChain().getArch()) {
7606 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007607 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007608 break;
7609 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007610 case llvm::Triple::armeb:
7611 case llvm::Triple::thumb:
7612 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007613 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007614 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7615 std::string Arch =
7616 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007617 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007618 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007619 }
7620
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007621 case llvm::Triple::mips:
7622 case llvm::Triple::mipsel:
7623 case llvm::Triple::mips64:
7624 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007625 StringRef CPUName;
7626 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007627 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007628
7629 CmdArgs.push_back("-march");
7630 CmdArgs.push_back(CPUName.data());
7631
7632 CmdArgs.push_back("-mabi");
7633 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7634
7635 if (getToolChain().getArch() == llvm::Triple::mips ||
7636 getToolChain().getArch() == llvm::Triple::mips64)
7637 CmdArgs.push_back("-EB");
7638 else
7639 CmdArgs.push_back("-EL");
7640
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007641 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007642 break;
7643 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007644
7645 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007646 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007647 CmdArgs.push_back("-32");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007648 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007649 break;
7650
7651 case llvm::Triple::sparcv9:
7652 CmdArgs.push_back("-64");
7653 CmdArgs.push_back("-Av9");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007654 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007655 break;
7656
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007657 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007658 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007659 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007660
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007661 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007662
7663 CmdArgs.push_back("-o");
7664 CmdArgs.push_back(Output.getFilename());
7665
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007666 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007667 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007668
David Chisnallddbd68f2011-09-27 22:03:18 +00007669 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007670 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007671}
7672
Douglas Katzman95354292015-06-23 20:42:09 +00007673void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7674 const InputInfo &Output,
7675 const InputInfoList &Inputs,
7676 const ArgList &Args,
7677 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007678 const Driver &D = getToolChain().getDriver();
7679 ArgStringList CmdArgs;
7680
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007681 if (!D.SysRoot.empty())
7682 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7683
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007684 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007685 if (Args.hasArg(options::OPT_static)) {
7686 CmdArgs.push_back("-Bstatic");
7687 } else {
7688 if (Args.hasArg(options::OPT_rdynamic))
7689 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007690 if (Args.hasArg(options::OPT_shared)) {
7691 CmdArgs.push_back("-Bshareable");
7692 } else {
7693 CmdArgs.push_back("-dynamic-linker");
7694 CmdArgs.push_back("/libexec/ld.elf_so");
7695 }
7696 }
7697
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007698 // Many NetBSD architectures support more than one ABI.
7699 // Determine the correct emulation for ld.
7700 switch (getToolChain().getArch()) {
7701 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007702 CmdArgs.push_back("-m");
7703 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007704 break;
7705 case llvm::Triple::arm:
7706 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007707 CmdArgs.push_back("-m");
7708 switch (getToolChain().getTriple().getEnvironment()) {
7709 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007710 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007711 CmdArgs.push_back("armelf_nbsd_eabi");
7712 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007713 case llvm::Triple::EABIHF:
7714 case llvm::Triple::GNUEABIHF:
7715 CmdArgs.push_back("armelf_nbsd_eabihf");
7716 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007717 default:
7718 CmdArgs.push_back("armelf_nbsd");
7719 break;
7720 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007721 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007722 case llvm::Triple::armeb:
7723 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007724 arm::appendEBLinkFlags(
7725 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007726 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007727 CmdArgs.push_back("-m");
7728 switch (getToolChain().getTriple().getEnvironment()) {
7729 case llvm::Triple::EABI:
7730 case llvm::Triple::GNUEABI:
7731 CmdArgs.push_back("armelfb_nbsd_eabi");
7732 break;
7733 case llvm::Triple::EABIHF:
7734 case llvm::Triple::GNUEABIHF:
7735 CmdArgs.push_back("armelfb_nbsd_eabihf");
7736 break;
7737 default:
7738 CmdArgs.push_back("armelfb_nbsd");
7739 break;
7740 }
7741 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007742 case llvm::Triple::mips64:
7743 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007744 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007745 CmdArgs.push_back("-m");
7746 if (getToolChain().getArch() == llvm::Triple::mips64)
7747 CmdArgs.push_back("elf32btsmip");
7748 else
7749 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007750 } else if (mips::hasMipsAbiArg(Args, "64")) {
7751 CmdArgs.push_back("-m");
7752 if (getToolChain().getArch() == llvm::Triple::mips64)
7753 CmdArgs.push_back("elf64btsmip");
7754 else
7755 CmdArgs.push_back("elf64ltsmip");
7756 }
7757 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007758 case llvm::Triple::ppc:
7759 CmdArgs.push_back("-m");
7760 CmdArgs.push_back("elf32ppc_nbsd");
7761 break;
7762
7763 case llvm::Triple::ppc64:
7764 case llvm::Triple::ppc64le:
7765 CmdArgs.push_back("-m");
7766 CmdArgs.push_back("elf64ppc");
7767 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007768
7769 case llvm::Triple::sparc:
7770 CmdArgs.push_back("-m");
7771 CmdArgs.push_back("elf32_sparc");
7772 break;
7773
7774 case llvm::Triple::sparcv9:
7775 CmdArgs.push_back("-m");
7776 CmdArgs.push_back("elf64_sparc");
7777 break;
7778
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007779 default:
7780 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007781 }
7782
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007783 if (Output.isFilename()) {
7784 CmdArgs.push_back("-o");
7785 CmdArgs.push_back(Output.getFilename());
7786 } else {
7787 assert(Output.isNothing() && "Invalid output.");
7788 }
7789
7790 if (!Args.hasArg(options::OPT_nostdlib) &&
7791 !Args.hasArg(options::OPT_nostartfiles)) {
7792 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007793 CmdArgs.push_back(
7794 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7795 CmdArgs.push_back(
7796 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7797 CmdArgs.push_back(
7798 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007799 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007800 CmdArgs.push_back(
7801 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7802 CmdArgs.push_back(
7803 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007804 }
7805 }
7806
7807 Args.AddAllArgs(CmdArgs, options::OPT_L);
7808 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7809 Args.AddAllArgs(CmdArgs, options::OPT_e);
7810 Args.AddAllArgs(CmdArgs, options::OPT_s);
7811 Args.AddAllArgs(CmdArgs, options::OPT_t);
7812 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7813 Args.AddAllArgs(CmdArgs, options::OPT_r);
7814
7815 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7816
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007817 unsigned Major, Minor, Micro;
7818 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7819 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007820 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007821 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007822 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007823 case llvm::Triple::arm:
7824 case llvm::Triple::armeb:
7825 case llvm::Triple::thumb:
7826 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007827 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007828 case llvm::Triple::ppc64:
7829 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007830 case llvm::Triple::x86:
7831 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007832 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007833 break;
7834 default:
7835 break;
7836 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007837 }
7838
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007839 if (!Args.hasArg(options::OPT_nostdlib) &&
7840 !Args.hasArg(options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00007841 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007842 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007843 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7844 CmdArgs.push_back("-lm");
7845 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007846 if (Args.hasArg(options::OPT_pthread))
7847 CmdArgs.push_back("-lpthread");
7848 CmdArgs.push_back("-lc");
7849
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007850 if (useLibgcc) {
7851 if (Args.hasArg(options::OPT_static)) {
7852 // libgcc_eh depends on libc, so resolve as much as possible,
7853 // pull in any new requirements from libc and then get the rest
7854 // of libgcc.
7855 CmdArgs.push_back("-lgcc_eh");
7856 CmdArgs.push_back("-lc");
7857 CmdArgs.push_back("-lgcc");
7858 } else {
7859 CmdArgs.push_back("-lgcc");
7860 CmdArgs.push_back("--as-needed");
7861 CmdArgs.push_back("-lgcc_s");
7862 CmdArgs.push_back("--no-as-needed");
7863 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007864 }
7865 }
7866
7867 if (!Args.hasArg(options::OPT_nostdlib) &&
7868 !Args.hasArg(options::OPT_nostartfiles)) {
7869 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007870 CmdArgs.push_back(
7871 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007872 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007873 CmdArgs.push_back(
7874 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7875 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007876 }
7877
Alexey Samsonov7811d192014-02-20 13:57:37 +00007878 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007879
Logan Chieneb9162f2014-06-26 14:23:45 +00007880 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007881 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007882}
7883
Douglas Katzman95354292015-06-23 20:42:09 +00007884void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7885 const InputInfo &Output,
7886 const InputInfoList &Inputs,
7887 const ArgList &Args,
7888 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007889 claimNoWarnArgs(Args);
7890
James Y Knight2db38f32015-08-15 03:45:25 +00007891 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
7892 llvm::Triple Triple = llvm::Triple(TripleStr);
7893
Rafael Espindola92b00932010-08-10 00:25:48 +00007894 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007895 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007896
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007897 llvm::Reloc::Model RelocationModel;
7898 unsigned PICLevel;
7899 bool IsPIE;
7900 std::tie(RelocationModel, PICLevel, IsPIE) =
7901 ParsePICArgs(getToolChain(), Triple, Args);
7902
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007903 switch (getToolChain().getArch()) {
7904 default:
7905 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007906 // Add --32/--64 to make sure we get the format we want.
7907 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007908 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007909 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007910 break;
7911 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007912 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7913 CmdArgs.push_back("--x32");
7914 else
7915 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007916 break;
7917 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007918 CmdArgs.push_back("-a32");
7919 CmdArgs.push_back("-mppc");
7920 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007921 break;
7922 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007923 CmdArgs.push_back("-a64");
7924 CmdArgs.push_back("-mppc64");
7925 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007926 break;
7927 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007928 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007929 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007930 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007931 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007932 break;
7933 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007934 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007935 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007936 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007937 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007938 break;
7939 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007940 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007941 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007942 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007943 break;
7944 case llvm::Triple::arm:
7945 case llvm::Triple::armeb:
7946 case llvm::Triple::thumb:
7947 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00007948 const llvm::Triple &Triple2 = getToolChain().getTriple();
7949 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00007950 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007951 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007952 break;
7953 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007954 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007955 break;
7956 default:
7957 break;
7958 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007959
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007960 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007961 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
7962 case arm::FloatABI::Soft:
7963 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
7964 break;
7965 case arm::FloatABI::SoftFP:
7966 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
7967 break;
7968 case arm::FloatABI::Hard:
7969 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
7970 break;
7971 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007972
7973 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007974
7975 // FIXME: remove krait check when GNU tools support krait cpu
7976 // for now replace it with -march=armv7-a to avoid a lower
7977 // march from being picked in the absence of a cpu flag.
7978 Arg *A;
7979 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007980 StringRef(A->getValue()).lower() == "krait")
7981 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00007982 else
7983 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007984 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007985 break;
7986 }
7987 case llvm::Triple::mips:
7988 case llvm::Triple::mipsel:
7989 case llvm::Triple::mips64:
7990 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007991 StringRef CPUName;
7992 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007993 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007994 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007995
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007996 CmdArgs.push_back("-march");
7997 CmdArgs.push_back(CPUName.data());
7998
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007999 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008000 CmdArgs.push_back(ABIName.data());
8001
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008002 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8003 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008004 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008005 CmdArgs.push_back("-mno-shared");
8006
Daniel Sanders379d44b2014-07-16 11:52:23 +00008007 // LLVM doesn't support -mplt yet and acts as if it is always given.
8008 // However, -mplt has no effect with the N64 ABI.
8009 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008010
8011 if (getToolChain().getArch() == llvm::Triple::mips ||
8012 getToolChain().getArch() == llvm::Triple::mips64)
8013 CmdArgs.push_back("-EB");
8014 else
8015 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008016
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008017 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8018 if (StringRef(A->getValue()) == "2008")
8019 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8020 }
8021
Daniel Sanders379d44b2014-07-16 11:52:23 +00008022 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8023 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8024 options::OPT_mfp64)) {
8025 A->claim();
8026 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008027 } else if (mips::shouldUseFPXX(
8028 Args, getToolChain().getTriple(), CPUName, ABIName,
8029 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008030 CmdArgs.push_back("-mfpxx");
8031
8032 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8033 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008034 if (Arg *A =
8035 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008036 if (A->getOption().matches(options::OPT_mips16)) {
8037 A->claim();
8038 A->render(Args, CmdArgs);
8039 } else {
8040 A->claim();
8041 CmdArgs.push_back("-no-mips16");
8042 }
8043 }
8044
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008045 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8046 options::OPT_mno_micromips);
8047 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8048 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8049
Simon Atanasyanbd986632013-11-26 11:58:04 +00008050 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8051 // Do not use AddLastArg because not all versions of MIPS assembler
8052 // support -mmsa / -mno-msa options.
8053 if (A->getOption().matches(options::OPT_mmsa))
8054 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8055 }
8056
Daniel Sanders379d44b2014-07-16 11:52:23 +00008057 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8058 options::OPT_msoft_float);
8059
Toma Tabacub36d6102015-06-11 12:13:18 +00008060 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8061 options::OPT_msingle_float);
8062
Daniel Sanders379d44b2014-07-16 11:52:23 +00008063 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8064 options::OPT_mno_odd_spreg);
8065
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008066 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008067 break;
8068 }
8069 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008070 // Always pass an -march option, since our default of z10 is later
8071 // than the GNU assembler's default.
8072 StringRef CPUName = getSystemZTargetCPU(Args);
8073 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008074 break;
8075 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008076 }
8077
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008078 if (NeedsKPIC) {
8079 if (RelocationModel != llvm::Reloc::Static)
8080 CmdArgs.push_back("-KPIC");
8081 }
Rafael Espindola92b00932010-08-10 00:25:48 +00008082
Renato Golina74bbc72015-07-22 15:32:36 +00008083 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008084 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008085
8086 CmdArgs.push_back("-o");
8087 CmdArgs.push_back(Output.getFilename());
8088
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008089 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008090 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008091
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008092 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008093 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008094
8095 // Handle the debug info splitting at object creation time if we're
8096 // creating an object.
8097 // TODO: Currently only works on linux with newer objcopy.
8098 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008099 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008100 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008101 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008102}
8103
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008104static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008105 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00008106 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Reid Kleckner0213a472015-07-22 16:01:38 +00008107 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008108 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8109 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008110 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008111 CmdArgs.push_back("-lgcc");
8112
Logan Chien3d3373c2012-11-19 12:04:11 +00008113 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008114 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008115 CmdArgs.push_back("-lgcc");
8116 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008117 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008118 CmdArgs.push_back("--as-needed");
8119 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008120 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008121 CmdArgs.push_back("--no-as-needed");
8122 }
8123
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008124 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008125 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008126 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008127 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008128
8129 // According to Android ABI, we have to link with libdl if we are
8130 // linking with non-static libgcc.
8131 //
8132 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8133 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8134 if (isAndroid && !StaticLibgcc)
8135 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008136}
8137
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008138static std::string getLinuxDynamicLinker(const ArgList &Args,
8139 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008140 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8141
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008142 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
8143 if (ToolChain.getTriple().isArch64Bit())
8144 return "/system/bin/linker64";
8145 else
8146 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008147 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8148 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008149 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008150 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008151 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008152 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008153 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008154 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008155 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008156 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008157 return "/lib/ld-linux-armhf.so.3";
8158 else
8159 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008160 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8161 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008162 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008163 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008164 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008165 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008166 return "/lib/ld-linux.so.3";
8167 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8168 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00008169 StringRef CPUName;
8170 StringRef ABIName;
8171 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
Vasileios Kalintiris69675272015-10-05 09:12:36 +00008172 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00008173
8174 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
8175 .Case("o32", "/lib")
8176 .Case("n32", "/lib32")
8177 .Case("n64", "/lib64")
8178 .Default("/lib");
8179 StringRef LibName;
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008180 if (mips::isUCLibc(Args))
8181 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00008182 else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008183 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008184
8185 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008186 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008187 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008188 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008189 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8190 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008191 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008192 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008193 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8194 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008195 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008196 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008197 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008198 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008199 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008200 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008201 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8202 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008203 else
8204 return "/lib64/ld-linux-x86-64.so.2";
8205}
8206
Renato Golinc4b49242014-02-13 10:01:16 +00008207static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008208 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008209 // Make use of compiler-rt if --rtlib option is used
8210 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8211
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008212 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008213 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008214 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008215 default:
8216 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008217 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008218 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008219 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008220 break;
8221 }
Renato Golinc4b49242014-02-13 10:01:16 +00008222 break;
8223 case ToolChain::RLT_Libgcc:
8224 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8225 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008226 }
8227}
8228
Rafael Espindola1e085772014-08-15 17:14:35 +00008229static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8230 switch (T.getArch()) {
8231 case llvm::Triple::x86:
8232 return "elf_i386";
8233 case llvm::Triple::aarch64:
8234 return "aarch64linux";
8235 case llvm::Triple::aarch64_be:
8236 return "aarch64_be_linux";
8237 case llvm::Triple::arm:
8238 case llvm::Triple::thumb:
8239 return "armelf_linux_eabi";
8240 case llvm::Triple::armeb:
8241 case llvm::Triple::thumbeb:
8242 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8243 case llvm::Triple::ppc:
8244 return "elf32ppclinux";
8245 case llvm::Triple::ppc64:
8246 return "elf64ppc";
8247 case llvm::Triple::ppc64le:
8248 return "elf64lppc";
8249 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008250 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008251 return "elf32_sparc";
8252 case llvm::Triple::sparcv9:
8253 return "elf64_sparc";
8254 case llvm::Triple::mips:
8255 return "elf32btsmip";
8256 case llvm::Triple::mipsel:
8257 return "elf32ltsmip";
8258 case llvm::Triple::mips64:
8259 if (mips::hasMipsAbiArg(Args, "n32"))
8260 return "elf32btsmipn32";
8261 return "elf64btsmip";
8262 case llvm::Triple::mips64el:
8263 if (mips::hasMipsAbiArg(Args, "n32"))
8264 return "elf32ltsmipn32";
8265 return "elf64ltsmip";
8266 case llvm::Triple::systemz:
8267 return "elf64_s390";
8268 case llvm::Triple::x86_64:
8269 if (T.getEnvironment() == llvm::Triple::GNUX32)
8270 return "elf32_x86_64";
8271 return "elf_x86_64";
8272 default:
8273 llvm_unreachable("Unexpected arch");
8274 }
8275}
8276
Douglas Katzman95354292015-06-23 20:42:09 +00008277void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8278 const InputInfo &Output,
8279 const InputInfoList &Inputs,
8280 const ArgList &Args,
8281 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008282 const toolchains::Linux &ToolChain =
8283 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008284 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008285
8286 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8287 llvm::Triple Triple = llvm::Triple(TripleStr);
8288
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008289 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008290 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008291 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008292 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008293 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8294 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008295
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008296 ArgStringList CmdArgs;
8297
Rafael Espindolad1002f62010-11-15 18:28:16 +00008298 // Silence warning for "clang -g foo.o -o foo"
8299 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008300 // and "clang -emit-llvm foo.o -o foo"
8301 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008302 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008303 // handled somewhere else.
8304 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008305
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008306 if (!D.SysRoot.empty())
8307 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008308
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008309 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008310 CmdArgs.push_back("-pie");
8311
Rafael Espindola1c76c592010-11-07 22:57:16 +00008312 if (Args.hasArg(options::OPT_rdynamic))
8313 CmdArgs.push_back("-export-dynamic");
8314
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008315 if (Args.hasArg(options::OPT_s))
8316 CmdArgs.push_back("-s");
8317
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008318 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008319 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008320
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008321 for (const auto &Opt : ToolChain.ExtraOpts)
8322 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008323
8324 if (!Args.hasArg(options::OPT_static)) {
8325 CmdArgs.push_back("--eh-frame-hdr");
8326 }
8327
8328 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008329 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008330
8331 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008332 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8333 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008334 CmdArgs.push_back("-Bstatic");
8335 else
8336 CmdArgs.push_back("-static");
8337 } else if (Args.hasArg(options::OPT_shared)) {
8338 CmdArgs.push_back("-shared");
8339 }
8340
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008341 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8342 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008343 (!Args.hasArg(options::OPT_static) &&
8344 !Args.hasArg(options::OPT_shared))) {
8345 CmdArgs.push_back("-dynamic-linker");
8346 CmdArgs.push_back(Args.MakeArgString(
8347 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8348 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008349
8350 CmdArgs.push_back("-o");
8351 CmdArgs.push_back(Output.getFilename());
8352
Rafael Espindola81937ec2010-12-01 01:52:43 +00008353 if (!Args.hasArg(options::OPT_nostdlib) &&
8354 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008355 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008356 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008357 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008358 if (Args.hasArg(options::OPT_pg))
8359 crt1 = "gcrt1.o";
8360 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008361 crt1 = "Scrt1.o";
8362 else
8363 crt1 = "crt1.o";
8364 }
8365 if (crt1)
8366 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008367
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008368 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8369 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008370
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008371 const char *crtbegin;
8372 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008373 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008374 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008375 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008376 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008377 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008378 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008379 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00008380 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008381
8382 // Add crtfastmath.o if available and fast math is enabled.
8383 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008384 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008385
8386 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008387 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008388
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008389 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008390
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008391 for (const auto &Path : Paths)
8392 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008393
Alexey Samsonov907880e2015-06-19 19:57:46 +00008394 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008395 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008396
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008397 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8398 CmdArgs.push_back("--no-demangle");
8399
Alexey Samsonov52550342014-09-15 19:58:40 +00008400 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008401 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008402 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008403 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008404
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008405 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008406 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008407 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008408 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008409 if (OnlyLibstdcxxStatic)
8410 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008411 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008412 if (OnlyLibstdcxxStatic)
8413 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008414 CmdArgs.push_back("-lm");
8415 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008416 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8417 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008418
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008419 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008420 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8421 if (Args.hasArg(options::OPT_static))
8422 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008423
Alexey Samsonov52550342014-09-15 19:58:40 +00008424 if (NeedsSanitizerDeps)
8425 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8426
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008427 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8428 Args.hasArg(options::OPT_pthreads);
8429
8430 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8431 options::OPT_fno_openmp, false)) {
8432 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8433 // FIXME: Does this really make sense for all GNU toolchains?
8434 WantPthread = true;
8435
8436 // Also link the particular OpenMP runtimes.
8437 switch (getOpenMPRuntime(ToolChain, Args)) {
8438 case OMPRT_OMP:
8439 CmdArgs.push_back("-lomp");
8440 break;
8441 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008442 CmdArgs.push_back("-lgomp");
8443
8444 // FIXME: Exclude this for platforms with libgomp that don't require
8445 // librt. Most modern Linux platforms require it, but some may not.
8446 CmdArgs.push_back("-lrt");
8447 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008448 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008449 CmdArgs.push_back("-liomp5");
8450 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008451 case OMPRT_Unknown:
8452 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008453 break;
8454 }
Chandler Carruth01538002013-01-17 13:19:29 +00008455 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008456
Renato Golinc4b49242014-02-13 10:01:16 +00008457 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008458
Richard Smith31d1de22015-05-20 22:48:44 +00008459 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008460 CmdArgs.push_back("-lpthread");
8461
8462 CmdArgs.push_back("-lc");
8463
8464 if (Args.hasArg(options::OPT_static))
8465 CmdArgs.push_back("--end-group");
8466 else
Renato Golinc4b49242014-02-13 10:01:16 +00008467 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008468 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008469
Rafael Espindola81937ec2010-12-01 01:52:43 +00008470 if (!Args.hasArg(options::OPT_nostartfiles)) {
8471 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008472 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008473 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008474 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008475 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008476 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008477 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008478
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00008479 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008480 if (!isAndroid)
8481 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008482 }
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00008483 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008484
Justin Bognerd3371d82015-07-17 03:35:54 +00008485 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8486 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008487}
8488
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008489// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8490// for the various SFI requirements like register masking. The assembly tool
8491// inserts the file containing the macros as an input into all the assembly
8492// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008493void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8494 const InputInfo &Output,
8495 const InputInfoList &Inputs,
8496 const ArgList &Args,
8497 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008498 const toolchains::NaClToolChain &ToolChain =
8499 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008500 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8501 "nacl-arm-macros.s");
8502 InputInfoList NewInputs;
8503 NewInputs.push_back(NaClMacros);
8504 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008505 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8506 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008507}
8508
Douglas Katzman750cfc52015-06-29 18:42:16 +00008509// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008510// we use static by default, do not yet support sanitizers or LTO, and a few
8511// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008512// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008513void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8514 const InputInfo &Output,
8515 const InputInfoList &Inputs,
8516 const ArgList &Args,
8517 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008518
Douglas Katzman54366072015-07-27 16:53:08 +00008519 const toolchains::NaClToolChain &ToolChain =
8520 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008521 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008522 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008523 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008524 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008525
8526 ArgStringList CmdArgs;
8527
8528 // Silence warning for "clang -g foo.o -o foo"
8529 Args.ClaimAllArgs(options::OPT_g_Group);
8530 // and "clang -emit-llvm foo.o -o foo"
8531 Args.ClaimAllArgs(options::OPT_emit_llvm);
8532 // and for "clang -w foo.o -o foo". Other warning options are already
8533 // handled somewhere else.
8534 Args.ClaimAllArgs(options::OPT_w);
8535
8536 if (!D.SysRoot.empty())
8537 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8538
8539 if (Args.hasArg(options::OPT_rdynamic))
8540 CmdArgs.push_back("-export-dynamic");
8541
8542 if (Args.hasArg(options::OPT_s))
8543 CmdArgs.push_back("-s");
8544
Douglas Katzman54366072015-07-27 16:53:08 +00008545 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8546 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008547 CmdArgs.push_back("--build-id");
8548
8549 if (!IsStatic)
8550 CmdArgs.push_back("--eh-frame-hdr");
8551
8552 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008553 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008554 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008555 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008556 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008557 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008558 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008559 else if (Arch == llvm::Triple::mipsel)
8560 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008561 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008562 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8563 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008564
8565 if (IsStatic)
8566 CmdArgs.push_back("-static");
8567 else if (Args.hasArg(options::OPT_shared))
8568 CmdArgs.push_back("-shared");
8569
8570 CmdArgs.push_back("-o");
8571 CmdArgs.push_back(Output.getFilename());
8572 if (!Args.hasArg(options::OPT_nostdlib) &&
8573 !Args.hasArg(options::OPT_nostartfiles)) {
8574 if (!Args.hasArg(options::OPT_shared))
8575 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8576 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8577
8578 const char *crtbegin;
8579 if (IsStatic)
8580 crtbegin = "crtbeginT.o";
8581 else if (Args.hasArg(options::OPT_shared))
8582 crtbegin = "crtbeginS.o";
8583 else
8584 crtbegin = "crtbegin.o";
8585 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8586 }
8587
8588 Args.AddAllArgs(CmdArgs, options::OPT_L);
8589 Args.AddAllArgs(CmdArgs, options::OPT_u);
8590
8591 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8592
8593 for (const auto &Path : Paths)
8594 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8595
8596 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8597 CmdArgs.push_back("--no-demangle");
8598
8599 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8600
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008601 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008602 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008603 bool OnlyLibstdcxxStatic =
8604 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008605 if (OnlyLibstdcxxStatic)
8606 CmdArgs.push_back("-Bstatic");
8607 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8608 if (OnlyLibstdcxxStatic)
8609 CmdArgs.push_back("-Bdynamic");
8610 CmdArgs.push_back("-lm");
8611 }
8612
8613 if (!Args.hasArg(options::OPT_nostdlib)) {
8614 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8615 // Always use groups, since it has no effect on dynamic libraries.
8616 CmdArgs.push_back("--start-group");
8617 CmdArgs.push_back("-lc");
8618 // NaCl's libc++ currently requires libpthread, so just always include it
8619 // in the group for C++.
8620 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008621 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008622 // Gold, used by Mips, handles nested groups differently than ld, and
8623 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8624 // which is not a desired behaviour here.
8625 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8626 if (getToolChain().getArch() == llvm::Triple::mipsel)
8627 CmdArgs.push_back("-lnacl");
8628
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008629 CmdArgs.push_back("-lpthread");
8630 }
8631
8632 CmdArgs.push_back("-lgcc");
8633 CmdArgs.push_back("--as-needed");
8634 if (IsStatic)
8635 CmdArgs.push_back("-lgcc_eh");
8636 else
8637 CmdArgs.push_back("-lgcc_s");
8638 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008639
8640 // Mips needs to create and use pnacl_legacy library that contains
8641 // definitions from bitcode/pnaclmm.c and definitions for
8642 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8643 if (getToolChain().getArch() == llvm::Triple::mipsel)
8644 CmdArgs.push_back("-lpnacl_legacy");
8645
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008646 CmdArgs.push_back("--end-group");
8647 }
8648
8649 if (!Args.hasArg(options::OPT_nostartfiles)) {
8650 const char *crtend;
8651 if (Args.hasArg(options::OPT_shared))
8652 crtend = "crtendS.o";
8653 else
8654 crtend = "crtend.o";
8655
8656 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8657 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8658 }
8659 }
8660
Justin Bognerd3371d82015-07-17 03:35:54 +00008661 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8662 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008663}
8664
Douglas Katzman95354292015-06-23 20:42:09 +00008665void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8666 const InputInfo &Output,
8667 const InputInfoList &Inputs,
8668 const ArgList &Args,
8669 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008670 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008671 ArgStringList CmdArgs;
8672
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008673 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008674
8675 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008676 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008677
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008678 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008679 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008680
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008681 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008682 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008683}
8684
Douglas Katzman95354292015-06-23 20:42:09 +00008685void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8686 const InputInfo &Output,
8687 const InputInfoList &Inputs,
8688 const ArgList &Args,
8689 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008690 const Driver &D = getToolChain().getDriver();
8691 ArgStringList CmdArgs;
8692
Daniel Dunbarb440f562010-08-02 02:38:21 +00008693 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008694 CmdArgs.push_back("-o");
8695 CmdArgs.push_back(Output.getFilename());
8696 } else {
8697 assert(Output.isNothing() && "Invalid output.");
8698 }
8699
8700 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008701 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008702 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8703 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8704 CmdArgs.push_back(
8705 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8706 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008707 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008708
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008709 Args.AddAllArgs(CmdArgs,
8710 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008711
Daniel Dunbar54423b22010-09-17 00:24:54 +00008712 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008713
Alexey Samsonov7811d192014-02-20 13:57:37 +00008714 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008715
Chris Lattner3e2ee142010-07-07 16:01:42 +00008716 if (!Args.hasArg(options::OPT_nostdlib) &&
8717 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008718 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008719 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008720 CmdArgs.push_back("-lm");
8721 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008722 }
8723
8724 if (!Args.hasArg(options::OPT_nostdlib) &&
8725 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008726 if (Args.hasArg(options::OPT_pthread))
8727 CmdArgs.push_back("-lpthread");
8728 CmdArgs.push_back("-lc");
8729 CmdArgs.push_back("-lCompilerRT-Generic");
8730 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8731 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008732 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008733 }
8734
Logan Chieneb9162f2014-06-26 14:23:45 +00008735 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008736 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008737}
8738
Daniel Dunbarcc912342009-05-02 18:28:39 +00008739/// DragonFly Tools
8740
8741// For now, DragonFly Assemble does just about the same as for
8742// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008743void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8744 const InputInfo &Output,
8745 const InputInfoList &Inputs,
8746 const ArgList &Args,
8747 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008748 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008749 ArgStringList CmdArgs;
8750
8751 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8752 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008753 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008754 CmdArgs.push_back("--32");
8755
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008756 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008757
8758 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008759 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008760
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008761 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008762 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008763
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008764 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008765 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008766}
8767
Douglas Katzman95354292015-06-23 20:42:09 +00008768void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8769 const InputInfo &Output,
8770 const InputInfoList &Inputs,
8771 const ArgList &Args,
8772 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008773 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008774 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008775 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008776
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008777 if (!D.SysRoot.empty())
8778 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8779
John McCall65b8da02013-04-11 22:55:55 +00008780 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008781 if (Args.hasArg(options::OPT_static)) {
8782 CmdArgs.push_back("-Bstatic");
8783 } else {
John McCall65b8da02013-04-11 22:55:55 +00008784 if (Args.hasArg(options::OPT_rdynamic))
8785 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008786 if (Args.hasArg(options::OPT_shared))
8787 CmdArgs.push_back("-Bshareable");
8788 else {
8789 CmdArgs.push_back("-dynamic-linker");
8790 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8791 }
John McCall65b8da02013-04-11 22:55:55 +00008792 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008793 }
8794
8795 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8796 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008797 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008798 CmdArgs.push_back("-m");
8799 CmdArgs.push_back("elf_i386");
8800 }
8801
Daniel Dunbarb440f562010-08-02 02:38:21 +00008802 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008803 CmdArgs.push_back("-o");
8804 CmdArgs.push_back(Output.getFilename());
8805 } else {
8806 assert(Output.isNothing() && "Invalid output.");
8807 }
8808
8809 if (!Args.hasArg(options::OPT_nostdlib) &&
8810 !Args.hasArg(options::OPT_nostartfiles)) {
8811 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008812 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008813 CmdArgs.push_back(
8814 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008815 else {
8816 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008817 CmdArgs.push_back(
8818 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008819 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008820 CmdArgs.push_back(
8821 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008822 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008823 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008824 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008825 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008826 CmdArgs.push_back(
8827 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008828 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008829 CmdArgs.push_back(
8830 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008831 }
8832
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008833 Args.AddAllArgs(CmdArgs,
8834 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00008835
Daniel Dunbar54423b22010-09-17 00:24:54 +00008836 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008837
8838 if (!Args.hasArg(options::OPT_nostdlib) &&
8839 !Args.hasArg(options::OPT_nodefaultlibs)) {
8840 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8841 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008842 if (UseGCC47)
8843 CmdArgs.push_back("-L/usr/lib/gcc47");
8844 else
8845 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008846
8847 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008848 if (UseGCC47) {
8849 CmdArgs.push_back("-rpath");
8850 CmdArgs.push_back("/usr/lib/gcc47");
8851 } else {
8852 CmdArgs.push_back("-rpath");
8853 CmdArgs.push_back("/usr/lib/gcc44");
8854 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008855 }
8856
Hans Wennborg70850d82013-07-18 20:29:38 +00008857 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008858 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008859 CmdArgs.push_back("-lm");
8860 }
8861
Daniel Dunbarcc912342009-05-02 18:28:39 +00008862 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008863 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008864
8865 if (!Args.hasArg(options::OPT_nolibc)) {
8866 CmdArgs.push_back("-lc");
8867 }
8868
John McCall65b8da02013-04-11 22:55:55 +00008869 if (UseGCC47) {
8870 if (Args.hasArg(options::OPT_static) ||
8871 Args.hasArg(options::OPT_static_libgcc)) {
8872 CmdArgs.push_back("-lgcc");
8873 CmdArgs.push_back("-lgcc_eh");
8874 } else {
8875 if (Args.hasArg(options::OPT_shared_libgcc)) {
8876 CmdArgs.push_back("-lgcc_pic");
8877 if (!Args.hasArg(options::OPT_shared))
8878 CmdArgs.push_back("-lgcc");
8879 } else {
8880 CmdArgs.push_back("-lgcc");
8881 CmdArgs.push_back("--as-needed");
8882 CmdArgs.push_back("-lgcc_pic");
8883 CmdArgs.push_back("--no-as-needed");
8884 }
8885 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008886 } else {
John McCall65b8da02013-04-11 22:55:55 +00008887 if (Args.hasArg(options::OPT_shared)) {
8888 CmdArgs.push_back("-lgcc_pic");
8889 } else {
8890 CmdArgs.push_back("-lgcc");
8891 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008892 }
8893 }
8894
8895 if (!Args.hasArg(options::OPT_nostdlib) &&
8896 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008897 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008898 CmdArgs.push_back(
8899 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008900 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008901 CmdArgs.push_back(
8902 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8903 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008904 }
8905
Alexey Samsonov7811d192014-02-20 13:57:37 +00008906 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008907
Logan Chieneb9162f2014-06-26 14:23:45 +00008908 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008909 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008910}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008911
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008912// Try to find Exe from a Visual Studio distribution. This first tries to find
8913// an installed copy of Visual Studio and, failing that, looks in the PATH,
8914// making sure that whatever executable that's found is not a same-named exe
8915// from clang itself to prevent clang from falling back to itself.
8916static std::string FindVisualStudioExecutable(const ToolChain &TC,
8917 const char *Exe,
8918 const char *ClangProgramPath) {
8919 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8920 std::string visualStudioBinDir;
8921 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8922 visualStudioBinDir)) {
8923 SmallString<128> FilePath(visualStudioBinDir);
8924 llvm::sys::path::append(FilePath, Exe);
8925 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8926 return FilePath.str();
8927 }
8928
8929 return Exe;
8930}
8931
Douglas Katzman95354292015-06-23 20:42:09 +00008932void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8933 const InputInfo &Output,
8934 const InputInfoList &Inputs,
8935 const ArgList &Args,
8936 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008937 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008938 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008939
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008940 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8941 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008942 CmdArgs.push_back(
8943 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008944
8945 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008946 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008947 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008948
Zachary Turner10d75b22014-10-22 20:40:43 +00008949 if (!llvm::sys::Process::GetEnv("LIB")) {
8950 // If the VC environment hasn't been configured (perhaps because the user
8951 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008952 // the environment variable is set however, assume the user knows what
8953 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008954 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008955 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008956 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8957 SmallString<128> LibDir(VisualStudioDir);
8958 llvm::sys::path::append(LibDir, "VC", "lib");
8959 switch (MSVC.getArch()) {
8960 case llvm::Triple::x86:
8961 // x86 just puts the libraries directly in lib
8962 break;
8963 case llvm::Triple::x86_64:
8964 llvm::sys::path::append(LibDir, "amd64");
8965 break;
8966 case llvm::Triple::arm:
8967 llvm::sys::path::append(LibDir, "arm");
8968 break;
8969 default:
8970 break;
8971 }
8972 CmdArgs.push_back(
8973 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00008974
8975 if (MSVC.useUniversalCRT(VisualStudioDir)) {
8976 std::string UniversalCRTLibPath;
8977 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
8978 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8979 UniversalCRTLibPath.c_str()));
8980 }
Zachary Turner10d75b22014-10-22 20:40:43 +00008981 }
8982
8983 std::string WindowsSdkLibPath;
8984 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8985 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8986 WindowsSdkLibPath.c_str()));
8987 }
8988
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008989 CmdArgs.push_back("-nologo");
8990
Reid Kleckner124955a2015-08-05 18:51:13 +00008991 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008992 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008993
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008994 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00008995 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008996 if (DLL) {
8997 CmdArgs.push_back(Args.MakeArgString("-dll"));
8998
8999 SmallString<128> ImplibName(Output.getFilename());
9000 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009001 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009002 }
9003
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009004 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009005 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009006 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009007 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00009008 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009009 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00009010 };
9011 for (const auto &Component : CompilerRTComponents)
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00009012 CmdArgs.push_back(getCompilerRTArgString(TC, Args, Component));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009013 // Make sure the dynamic runtime thunk is not optimized out at link time
9014 // to ensure proper SEH handling.
9015 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009016 } else if (DLL) {
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00009017 CmdArgs.push_back(getCompilerRTArgString(TC, Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009018 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00009019 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009020 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00009021 };
9022 for (const auto &Component : CompilerRTComponents)
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00009023 CmdArgs.push_back(getCompilerRTArgString(TC, Args, Component));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009024 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009025 }
9026
Hans Wennborg2e274592013-08-13 23:38:57 +00009027 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009028
Alexey Bataevc7e84352015-08-19 04:49:01 +00009029 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9030 options::OPT_fno_openmp, false)) {
9031 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9032 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9033 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9034 TC.getDriver().Dir + "/../lib"));
9035 switch (getOpenMPRuntime(getToolChain(), Args)) {
9036 case OMPRT_OMP:
9037 CmdArgs.push_back("-defaultlib:libomp.lib");
9038 break;
9039 case OMPRT_IOMP5:
9040 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9041 break;
9042 case OMPRT_GOMP:
9043 break;
9044 case OMPRT_Unknown:
9045 // Already diagnosed.
9046 break;
9047 }
9048 }
9049
Reid Kleckner337188f2014-09-16 19:22:00 +00009050 // Add filenames, libraries, and other linker inputs.
9051 for (const auto &Input : Inputs) {
9052 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009053 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009054 continue;
9055 }
9056
9057 const Arg &A = Input.getInputArg();
9058
9059 // Render -l options differently for the MSVC linker.
9060 if (A.getOption().matches(options::OPT_l)) {
9061 StringRef Lib = A.getValue();
9062 const char *LinkLibArg;
9063 if (Lib.endswith(".lib"))
9064 LinkLibArg = Args.MakeArgString(Lib);
9065 else
9066 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9067 CmdArgs.push_back(LinkLibArg);
9068 continue;
9069 }
9070
9071 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9072 // or -L. Render it, even if MSVC doesn't understand it.
9073 A.renderAsInput(Args, CmdArgs);
9074 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009075
Zachary Turner719f58c2014-12-01 23:06:47 +00009076 // We need to special case some linker paths. In the case of lld, we need to
9077 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9078 // linker, we need to use a special search algorithm.
9079 llvm::SmallString<128> linkPath;
9080 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9081 if (Linker.equals_lower("lld"))
9082 Linker = "lld-link";
9083
9084 if (Linker.equals_lower("link")) {
9085 // If we're using the MSVC linker, it's not sufficient to just use link
9086 // from the program PATH, because other environments like GnuWin32 install
9087 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009088 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009089 C.getDriver().getClangProgramPath());
9090 } else {
9091 linkPath = Linker;
9092 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009093 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009094 }
9095
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009096 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009097 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009098}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009099
Douglas Katzman95354292015-06-23 20:42:09 +00009100void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9101 const InputInfo &Output,
9102 const InputInfoList &Inputs,
9103 const ArgList &Args,
9104 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009105 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9106}
9107
Douglas Katzman95354292015-06-23 20:42:09 +00009108std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009109 Compilation &C, const JobAction &JA, const InputInfo &Output,
9110 const InputInfoList &Inputs, const ArgList &Args,
9111 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009112 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009113 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009114 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009115 CmdArgs.push_back("/W0"); // No warnings.
9116
9117 // The goal is to be able to invoke this tool correctly based on
9118 // any flag accepted by clang-cl.
9119
9120 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009121 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009122
9123 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009124 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9125 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9126 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009127 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9128 if (A->getOption().getID() == options::OPT_O0) {
9129 CmdArgs.push_back("/Od");
9130 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009131 CmdArgs.push_back("/Og");
9132
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009133 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009134 if (OptLevel == "s" || OptLevel == "z")
9135 CmdArgs.push_back("/Os");
9136 else
9137 CmdArgs.push_back("/Ot");
9138
9139 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009140 }
9141 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009142 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9143 options::OPT_fno_omit_frame_pointer))
9144 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9145 ? "/Oy"
9146 : "/Oy-");
9147 if (!Args.hasArg(options::OPT_fwritable_strings))
9148 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009149
Nico Weber3f8dafb2015-03-12 19:37:10 +00009150 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009151 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9152
David Majnemerf6072342014-07-01 22:24:56 +00009153 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9154 /*default=*/false))
9155 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009156 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9157 options::OPT_fno_function_sections))
9158 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9159 ? "/Gy"
9160 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009161 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9162 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009163 CmdArgs.push_back(
9164 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009165 if (Args.hasArg(options::OPT_fsyntax_only))
9166 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009167 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9168 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009169 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009170
Nico Weber3f8dafb2015-03-12 19:37:10 +00009171 std::vector<std::string> Includes =
9172 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009173 for (const auto &Include : Includes)
9174 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009175
Hans Wennborg87cfa712013-09-19 20:32:16 +00009176 // Flags that can simply be passed through.
9177 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9178 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009179 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009180 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009181
9182 // The order of these flags is relevant, so pick the last one.
9183 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9184 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9185 A->render(Args, CmdArgs);
9186
Hans Wennborg87cfa712013-09-19 20:32:16 +00009187 // Input filename.
9188 assert(Inputs.size() == 1);
9189 const InputInfo &II = Inputs[0];
9190 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9191 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9192 if (II.isFilename())
9193 CmdArgs.push_back(II.getFilename());
9194 else
9195 II.getInputArg().renderAsInput(Args, CmdArgs);
9196
9197 // Output filename.
9198 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009199 const char *Fo =
9200 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009201 CmdArgs.push_back(Fo);
9202
Hans Wennborg188382e2013-09-20 18:16:35 +00009203 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009204 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9205 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009206 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009207 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009208}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009209
Yaron Keren1c0070c2015-07-02 04:45:27 +00009210/// MinGW Tools
9211void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9212 const InputInfo &Output,
9213 const InputInfoList &Inputs,
9214 const ArgList &Args,
9215 const char *LinkingOutput) const {
9216 claimNoWarnArgs(Args);
9217 ArgStringList CmdArgs;
9218
9219 if (getToolChain().getArch() == llvm::Triple::x86) {
9220 CmdArgs.push_back("--32");
9221 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9222 CmdArgs.push_back("--64");
9223 }
9224
9225 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9226
9227 CmdArgs.push_back("-o");
9228 CmdArgs.push_back(Output.getFilename());
9229
9230 for (const auto &II : Inputs)
9231 CmdArgs.push_back(II.getFilename());
9232
9233 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009234 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009235
9236 if (Args.hasArg(options::OPT_gsplit_dwarf))
9237 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9238 SplitDebugName(Args, Inputs[0]));
9239}
9240
9241void MinGW::Linker::AddLibGCC(const ArgList &Args,
9242 ArgStringList &CmdArgs) const {
9243 if (Args.hasArg(options::OPT_mthreads))
9244 CmdArgs.push_back("-lmingwthrd");
9245 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009246
Yaron Kerenaa281332015-08-09 00:24:07 +00009247 // Make use of compiler-rt if --rtlib option is used
9248 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9249 if (RLT == ToolChain::RLT_Libgcc) {
9250 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9251 Args.hasArg(options::OPT_static);
9252 bool Shared = Args.hasArg(options::OPT_shared);
9253 bool CXX = getToolChain().getDriver().CCCIsCXX();
9254
9255 if (Static || (!CXX && !Shared)) {
9256 CmdArgs.push_back("-lgcc");
9257 CmdArgs.push_back("-lgcc_eh");
9258 } else {
9259 CmdArgs.push_back("-lgcc_s");
9260 CmdArgs.push_back("-lgcc");
9261 }
9262 } else {
9263 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9264 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009265
Yaron Keren1c0070c2015-07-02 04:45:27 +00009266 CmdArgs.push_back("-lmoldname");
9267 CmdArgs.push_back("-lmingwex");
9268 CmdArgs.push_back("-lmsvcrt");
9269}
9270
9271void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9272 const InputInfo &Output,
9273 const InputInfoList &Inputs,
9274 const ArgList &Args,
9275 const char *LinkingOutput) const {
9276 const ToolChain &TC = getToolChain();
9277 const Driver &D = TC.getDriver();
9278 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9279
9280 ArgStringList CmdArgs;
9281
9282 // Silence warning for "clang -g foo.o -o foo"
9283 Args.ClaimAllArgs(options::OPT_g_Group);
9284 // and "clang -emit-llvm foo.o -o foo"
9285 Args.ClaimAllArgs(options::OPT_emit_llvm);
9286 // and for "clang -w foo.o -o foo". Other warning options are already
9287 // handled somewhere else.
9288 Args.ClaimAllArgs(options::OPT_w);
9289
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009290 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9291 if (LinkerName.equals_lower("lld")) {
9292 CmdArgs.push_back("-flavor");
9293 CmdArgs.push_back("gnu");
9294 }
9295
Yaron Keren1c0070c2015-07-02 04:45:27 +00009296 if (!D.SysRoot.empty())
9297 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9298
9299 if (Args.hasArg(options::OPT_s))
9300 CmdArgs.push_back("-s");
9301
9302 CmdArgs.push_back("-m");
9303 if (TC.getArch() == llvm::Triple::x86)
9304 CmdArgs.push_back("i386pe");
9305 if (TC.getArch() == llvm::Triple::x86_64)
9306 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009307 if (TC.getArch() == llvm::Triple::arm)
9308 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009309
9310 if (Args.hasArg(options::OPT_mwindows)) {
9311 CmdArgs.push_back("--subsystem");
9312 CmdArgs.push_back("windows");
9313 } else if (Args.hasArg(options::OPT_mconsole)) {
9314 CmdArgs.push_back("--subsystem");
9315 CmdArgs.push_back("console");
9316 }
9317
9318 if (Args.hasArg(options::OPT_static))
9319 CmdArgs.push_back("-Bstatic");
9320 else {
9321 if (Args.hasArg(options::OPT_mdll))
9322 CmdArgs.push_back("--dll");
9323 else if (Args.hasArg(options::OPT_shared))
9324 CmdArgs.push_back("--shared");
9325 CmdArgs.push_back("-Bdynamic");
9326 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9327 CmdArgs.push_back("-e");
9328 if (TC.getArch() == llvm::Triple::x86)
9329 CmdArgs.push_back("_DllMainCRTStartup@12");
9330 else
9331 CmdArgs.push_back("DllMainCRTStartup");
9332 CmdArgs.push_back("--enable-auto-image-base");
9333 }
9334 }
9335
9336 CmdArgs.push_back("-o");
9337 CmdArgs.push_back(Output.getFilename());
9338
9339 Args.AddAllArgs(CmdArgs, options::OPT_e);
9340 // FIXME: add -N, -n flags
9341 Args.AddLastArg(CmdArgs, options::OPT_r);
9342 Args.AddLastArg(CmdArgs, options::OPT_s);
9343 Args.AddLastArg(CmdArgs, options::OPT_t);
9344 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9345 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9346
9347 if (!Args.hasArg(options::OPT_nostdlib) &&
9348 !Args.hasArg(options::OPT_nostartfiles)) {
9349 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9350 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9351 } else {
9352 if (Args.hasArg(options::OPT_municode))
9353 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9354 else
9355 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9356 }
9357 if (Args.hasArg(options::OPT_pg))
9358 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9359 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9360 }
9361
9362 Args.AddAllArgs(CmdArgs, options::OPT_L);
9363 const ToolChain::path_list Paths = TC.getFilePaths();
9364 for (const auto &Path : Paths)
9365 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9366
9367 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9368
9369 // TODO: Add ASan stuff here
9370
9371 // TODO: Add profile stuff here
9372
9373 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9374 !Args.hasArg(options::OPT_nodefaultlibs)) {
9375 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9376 !Args.hasArg(options::OPT_static);
9377 if (OnlyLibstdcxxStatic)
9378 CmdArgs.push_back("-Bstatic");
9379 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9380 if (OnlyLibstdcxxStatic)
9381 CmdArgs.push_back("-Bdynamic");
9382 }
9383
9384 if (!Args.hasArg(options::OPT_nostdlib)) {
9385 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9386 if (Args.hasArg(options::OPT_static))
9387 CmdArgs.push_back("--start-group");
9388
9389 if (Args.hasArg(options::OPT_fstack_protector) ||
9390 Args.hasArg(options::OPT_fstack_protector_strong) ||
9391 Args.hasArg(options::OPT_fstack_protector_all)) {
9392 CmdArgs.push_back("-lssp_nonshared");
9393 CmdArgs.push_back("-lssp");
9394 }
9395 if (Args.hasArg(options::OPT_fopenmp))
9396 CmdArgs.push_back("-lgomp");
9397
9398 AddLibGCC(Args, CmdArgs);
9399
9400 if (Args.hasArg(options::OPT_pg))
9401 CmdArgs.push_back("-lgmon");
9402
Yaron Kerenadce68e2015-07-06 18:52:19 +00009403 if (Args.hasArg(options::OPT_pthread))
9404 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009405
9406 // add system libraries
9407 if (Args.hasArg(options::OPT_mwindows)) {
9408 CmdArgs.push_back("-lgdi32");
9409 CmdArgs.push_back("-lcomdlg32");
9410 }
9411 CmdArgs.push_back("-ladvapi32");
9412 CmdArgs.push_back("-lshell32");
9413 CmdArgs.push_back("-luser32");
9414 CmdArgs.push_back("-lkernel32");
9415
9416 if (Args.hasArg(options::OPT_static))
9417 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009418 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009419 AddLibGCC(Args, CmdArgs);
9420 }
9421
9422 if (!Args.hasArg(options::OPT_nostartfiles)) {
9423 // Add crtfastmath.o if available and fast math is enabled.
9424 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9425
9426 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9427 }
9428 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009429 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009430 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009431}
9432
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009433/// XCore Tools
9434// We pass assemble and link construction to the xcc tool.
9435
Douglas Katzman95354292015-06-23 20:42:09 +00009436void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9437 const InputInfo &Output,
9438 const InputInfoList &Inputs,
9439 const ArgList &Args,
9440 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009441 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009442 ArgStringList CmdArgs;
9443
9444 CmdArgs.push_back("-o");
9445 CmdArgs.push_back(Output.getFilename());
9446
9447 CmdArgs.push_back("-c");
9448
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009449 if (Args.hasArg(options::OPT_v))
9450 CmdArgs.push_back("-v");
9451
Robert Lytton894d25c2014-05-02 09:33:25 +00009452 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9453 if (!A->getOption().matches(options::OPT_g0))
9454 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009455
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009456 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9457 false))
9458 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009459
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009460 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009461
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009462 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009463 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009464
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009465 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009466 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009467}
9468
Douglas Katzman95354292015-06-23 20:42:09 +00009469void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9470 const InputInfo &Output,
9471 const InputInfoList &Inputs,
9472 const ArgList &Args,
9473 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009474 ArgStringList CmdArgs;
9475
9476 if (Output.isFilename()) {
9477 CmdArgs.push_back("-o");
9478 CmdArgs.push_back(Output.getFilename());
9479 } else {
9480 assert(Output.isNothing() && "Invalid output.");
9481 }
9482
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009483 if (Args.hasArg(options::OPT_v))
9484 CmdArgs.push_back("-v");
9485
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009486 // Pass -fexceptions through to the linker if it was present.
9487 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9488 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009489 CmdArgs.push_back("-fexceptions");
9490
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009491 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9492
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009493 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009494 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009495}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009496
Douglas Katzman95354292015-06-23 20:42:09 +00009497void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9498 const InputInfo &Output,
9499 const InputInfoList &Inputs,
9500 const ArgList &Args,
9501 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009502 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009503 const auto &TC =
9504 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9505 ArgStringList CmdArgs;
9506 const char *Exec;
9507
9508 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009509 default:
9510 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009511 case llvm::Triple::arm:
9512 case llvm::Triple::thumb:
9513 break;
9514 case llvm::Triple::x86:
9515 CmdArgs.push_back("--32");
9516 break;
9517 case llvm::Triple::x86_64:
9518 CmdArgs.push_back("--64");
9519 break;
9520 }
9521
9522 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9523
9524 CmdArgs.push_back("-o");
9525 CmdArgs.push_back(Output.getFilename());
9526
9527 for (const auto &Input : Inputs)
9528 CmdArgs.push_back(Input.getFilename());
9529
9530 const std::string Assembler = TC.GetProgramPath("as");
9531 Exec = Args.MakeArgString(Assembler);
9532
Justin Bognerd3371d82015-07-17 03:35:54 +00009533 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009534}
9535
Douglas Katzman95354292015-06-23 20:42:09 +00009536void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9537 const InputInfo &Output,
9538 const InputInfoList &Inputs,
9539 const ArgList &Args,
9540 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009541 const auto &TC =
9542 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9543 const llvm::Triple &T = TC.getTriple();
9544 const Driver &D = TC.getDriver();
9545 SmallString<128> EntryPoint;
9546 ArgStringList CmdArgs;
9547 const char *Exec;
9548
9549 // Silence warning for "clang -g foo.o -o foo"
9550 Args.ClaimAllArgs(options::OPT_g_Group);
9551 // and "clang -emit-llvm foo.o -o foo"
9552 Args.ClaimAllArgs(options::OPT_emit_llvm);
9553 // and for "clang -w foo.o -o foo"
9554 Args.ClaimAllArgs(options::OPT_w);
9555 // Other warning options are already handled somewhere else.
9556
9557 if (!D.SysRoot.empty())
9558 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9559
9560 if (Args.hasArg(options::OPT_pie))
9561 CmdArgs.push_back("-pie");
9562 if (Args.hasArg(options::OPT_rdynamic))
9563 CmdArgs.push_back("-export-dynamic");
9564 if (Args.hasArg(options::OPT_s))
9565 CmdArgs.push_back("--strip-all");
9566
9567 CmdArgs.push_back("-m");
9568 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009569 default:
9570 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009571 case llvm::Triple::arm:
9572 case llvm::Triple::thumb:
9573 // FIXME: this is incorrect for WinCE
9574 CmdArgs.push_back("thumb2pe");
9575 break;
9576 case llvm::Triple::x86:
9577 CmdArgs.push_back("i386pe");
9578 EntryPoint.append("_");
9579 break;
9580 case llvm::Triple::x86_64:
9581 CmdArgs.push_back("i386pep");
9582 break;
9583 }
9584
9585 if (Args.hasArg(options::OPT_shared)) {
9586 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009587 default:
9588 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009589 case llvm::Triple::arm:
9590 case llvm::Triple::thumb:
9591 case llvm::Triple::x86_64:
9592 EntryPoint.append("_DllMainCRTStartup");
9593 break;
9594 case llvm::Triple::x86:
9595 EntryPoint.append("_DllMainCRTStartup@12");
9596 break;
9597 }
9598
9599 CmdArgs.push_back("-shared");
9600 CmdArgs.push_back("-Bdynamic");
9601
9602 CmdArgs.push_back("--enable-auto-image-base");
9603
9604 CmdArgs.push_back("--entry");
9605 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9606 } else {
9607 EntryPoint.append("mainCRTStartup");
9608
9609 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9610 : "-Bdynamic");
9611
9612 if (!Args.hasArg(options::OPT_nostdlib) &&
9613 !Args.hasArg(options::OPT_nostartfiles)) {
9614 CmdArgs.push_back("--entry");
9615 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9616 }
9617
9618 // FIXME: handle subsystem
9619 }
9620
9621 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009622 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009623
9624 CmdArgs.push_back("-o");
9625 CmdArgs.push_back(Output.getFilename());
9626
9627 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9628 SmallString<261> ImpLib(Output.getFilename());
9629 llvm::sys::path::replace_extension(ImpLib, ".lib");
9630
9631 CmdArgs.push_back("--out-implib");
9632 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9633 }
9634
9635 if (!Args.hasArg(options::OPT_nostdlib) &&
9636 !Args.hasArg(options::OPT_nostartfiles)) {
9637 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9638 const char *CRTBegin;
9639
9640 CRTBegin =
9641 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9642 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9643 }
9644
9645 Args.AddAllArgs(CmdArgs, options::OPT_L);
9646
9647 const auto &Paths = TC.getFilePaths();
9648 for (const auto &Path : Paths)
9649 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9650
9651 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9652
9653 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9654 !Args.hasArg(options::OPT_nodefaultlibs)) {
9655 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9656 !Args.hasArg(options::OPT_static);
9657 if (StaticCXX)
9658 CmdArgs.push_back("-Bstatic");
9659 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9660 if (StaticCXX)
9661 CmdArgs.push_back("-Bdynamic");
9662 }
9663
9664 if (!Args.hasArg(options::OPT_nostdlib)) {
9665 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9666 // TODO handle /MT[d] /MD[d]
9667 CmdArgs.push_back("-lmsvcrt");
9668 AddRunTimeLibs(TC, D, CmdArgs, Args);
9669 }
9670 }
9671
9672 const std::string Linker = TC.GetProgramPath("ld");
9673 Exec = Args.MakeArgString(Linker);
9674
Justin Bognerd3371d82015-07-17 03:35:54 +00009675 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009676}
Douglas Katzman84a75642015-06-19 14:55:19 +00009677
Douglas Katzman95354292015-06-23 20:42:09 +00009678void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9679 const InputInfo &Output,
9680 const InputInfoList &Inputs,
9681 const ArgList &Args,
9682 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009683
9684 ArgStringList CmdArgs;
9685
9686 assert(Inputs.size() == 1);
9687 const InputInfo &II = Inputs[0];
9688 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9689 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9690
Douglas Katzman84a75642015-06-19 14:55:19 +00009691 CmdArgs.push_back("-DMYRIAD2");
9692 CmdArgs.push_back("-mcpu=myriad2");
9693 CmdArgs.push_back("-S");
9694
Douglas Katzmanf6071112015-08-03 14:34:22 +00009695 // Append all -I, -iquote, -isystem paths, defines/undefines,
9696 // 'f' flags, optimize flags, and warning options.
9697 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +00009698 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
9699 options::OPT_D, options::OPT_U,
9700 options::OPT_f_Group, options::OPT_f_clang_Group,
9701 options::OPT_g_Group, options::OPT_M_Group,
9702 options::OPT_O_Group, options::OPT_W_Group});
9703
9704 // If we're producing a dependency file, and assembly is the final action,
9705 // then the name of the target in the dependency file should be the '.o'
9706 // file, not the '.s' file produced by this step. For example, instead of
9707 // /tmp/mumble.s: mumble.c .../someheader.h
9708 // the filename on the lefthand side should be "mumble.o"
9709 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
9710 C.getActions().size() == 1 &&
9711 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
9712 Arg *A = Args.getLastArg(options::OPT_o);
9713 if (A) {
9714 CmdArgs.push_back("-MT");
9715 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
9716 }
9717 }
9718
Douglas Katzman84a75642015-06-19 14:55:19 +00009719 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9720
9721 CmdArgs.push_back(II.getFilename());
9722 CmdArgs.push_back("-o");
9723 CmdArgs.push_back(Output.getFilename());
9724
9725 std::string Exec =
9726 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009727 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9728 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009729}
9730
Douglas Katzman95354292015-06-23 20:42:09 +00009731void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9732 const InputInfo &Output,
9733 const InputInfoList &Inputs,
9734 const ArgList &Args,
9735 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009736 ArgStringList CmdArgs;
9737
9738 assert(Inputs.size() == 1);
9739 const InputInfo &II = Inputs[0];
9740 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9741 assert(Output.getType() == types::TY_Object);
9742
9743 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009744 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +00009745 CmdArgs.push_back("-noSPrefixing");
9746 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009747 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9748 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
9749 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +00009750 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009751 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +00009752 }
9753 CmdArgs.push_back("-elf"); // Output format.
9754 CmdArgs.push_back(II.getFilename());
9755 CmdArgs.push_back(
9756 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9757
9758 std::string Exec =
9759 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009760 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9761 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009762}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009763
9764void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9765 const InputInfo &Output,
9766 const InputInfoList &Inputs,
9767 const ArgList &Args,
9768 const char *LinkingOutput) const {
9769 const auto &TC =
9770 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
9771 const llvm::Triple &T = TC.getTriple();
9772 ArgStringList CmdArgs;
9773 bool UseStartfiles = !Args.hasArg(options::OPT_nostartfiles);
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009774 bool UseDefaultLibs = !Args.hasArg(options::OPT_nostdlib) &&
9775 !Args.hasArg(options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009776
9777 std::string StartFilesDir, BuiltinLibDir;
9778 TC.getCompilerSupportDir(StartFilesDir);
9779 TC.getBuiltinLibDir(BuiltinLibDir);
9780
9781 if (T.getArch() == llvm::Triple::sparc)
9782 CmdArgs.push_back("-EB");
9783 else // SHAVE assumes little-endian, and sparcel is expressly so.
9784 CmdArgs.push_back("-EL");
9785
9786 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
9787 // but we never pass through a --sysroot option and various other bits.
9788 // For example, there are no sanitizers (yet) nor gold linker.
9789
9790 // Eat some arguments that may be present but have no effect.
9791 Args.ClaimAllArgs(options::OPT_g_Group);
9792 Args.ClaimAllArgs(options::OPT_w);
9793 Args.ClaimAllArgs(options::OPT_static_libgcc);
9794
9795 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
9796 CmdArgs.push_back("-s");
9797
9798 CmdArgs.push_back("-o");
9799 CmdArgs.push_back(Output.getFilename());
9800
9801 if (UseStartfiles) {
9802 // If you want startfiles, it means you want the builtin crti and crtbegin,
9803 // but not crt0. Myriad link commands provide their own crt0.o as needed.
9804 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crti.o"));
9805 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtbegin.o"));
9806 }
9807
9808 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
9809 options::OPT_e, options::OPT_s, options::OPT_t,
9810 options::OPT_Z_Flag, options::OPT_r});
9811
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009812 if (UseDefaultLibs) {
9813 // The linker doesn't use these builtin paths unless directed to,
9814 // because it was not compiled for support with sysroots, nor does
9815 // it have a default of little-endian with FPU.
9816 CmdArgs.push_back(Args.MakeArgString("-L" + BuiltinLibDir));
9817 CmdArgs.push_back(Args.MakeArgString("-L" + StartFilesDir));
9818 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009819
9820 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9821
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009822 if (UseDefaultLibs) {
9823 if (T.getOS() == llvm::Triple::RTEMS) {
9824 CmdArgs.push_back("--start-group");
9825 CmdArgs.push_back("-lc");
9826 // You must provide your own "-L" option to enable finding these.
9827 CmdArgs.push_back("-lrtemscpu");
9828 CmdArgs.push_back("-lrtemsbsp");
9829 CmdArgs.push_back("--end-group");
9830 } else {
9831 CmdArgs.push_back("-lc");
9832 }
9833 if (C.getDriver().CCCIsCXX())
9834 CmdArgs.push_back("-lstdc++");
9835 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009836 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009837 if (UseStartfiles) {
9838 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtend.o"));
9839 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtn.o"));
9840 }
9841
9842 std::string Exec =
9843 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
9844 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9845 CmdArgs, Inputs));
9846}