blob: 6de6eeb011c2f5ee4cf0ea4a9113b36bbad4de64 [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Daniel Dunbar64198ef2009-09-10 01:21:05 +000055/// CheckPreprocessingOptions - Perform some validation of preprocessing
56/// arguments that is shared with gcc.
57static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000058 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
59 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
60 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000061 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000062 << A->getBaseArg().getAsString(Args)
63 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
64 }
65 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000066}
67
Daniel Dunbar4eadb602009-09-10 01:21:12 +000068/// CheckCodeGenerationOptions - Perform some validation of code generation
69/// arguments that is shared with gcc.
70static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
71 // In gcc, only ARM checks this, but it seems reasonable to check universally.
72 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +000073 if (const Arg *A =
74 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
75 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
76 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +000077}
78
Bob Wilsond5aad2a2014-11-04 22:28:48 +000079// Add backslashes to escape spaces and other backslashes.
80// This is used for the space-separated argument list specified with
81// the -dwarf-debug-flags option.
82static void EscapeSpacesAndBackslashes(const char *Arg,
83 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000084 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +000085 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000086 default:
87 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +000088 case ' ':
89 case '\\':
90 Res.push_back('\\');
91 break;
92 }
93 Res.push_back(*Arg);
94 }
95}
96
Chris Lattnerbf2803f2010-03-29 17:55:58 +000097// Quote target names for inclusion in GNU Make dependency files.
98// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +000099static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000100 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
101 switch (Target[i]) {
102 case ' ':
103 case '\t':
104 // Escape the preceding backslashes
105 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
106 Res.push_back('\\');
107
108 // Escape the space/tab
109 Res.push_back('\\');
110 break;
111 case '$':
112 Res.push_back('$');
113 break;
114 case '#':
115 Res.push_back('\\');
116 break;
117 default:
118 break;
119 }
120
121 Res.push_back(Target[i]);
122 }
123}
124
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000125static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
126 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000127 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000128 bool CombinedArg = false;
129
Bill Wendling281ca292012-03-12 21:22:35 +0000130 if (!DirList)
131 return; // Nothing to do.
132
Chad Rosier616e8a52012-10-30 21:42:09 +0000133 StringRef Name(ArgName);
134 if (Name.equals("-I") || Name.equals("-L"))
135 CombinedArg = true;
136
Bill Wendling281ca292012-03-12 21:22:35 +0000137 StringRef Dirs(DirList);
138 if (Dirs.empty()) // Empty string should not add '.'.
139 return;
140
141 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000142 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000143 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000144 if (CombinedArg) {
145 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
146 } else {
147 CmdArgs.push_back(ArgName);
148 CmdArgs.push_back(".");
149 }
Bill Wendling281ca292012-03-12 21:22:35 +0000150 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000151 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000152 CmdArgs.push_back(
153 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000154 } else {
155 CmdArgs.push_back(ArgName);
156 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
157 }
Bill Wendling281ca292012-03-12 21:22:35 +0000158 }
Nico Weber89355782012-03-19 15:00:03 +0000159 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000160 }
161
162 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000163 if (CombinedArg) {
164 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
165 } else {
166 CmdArgs.push_back(ArgName);
167 CmdArgs.push_back(".");
168 }
Bill Wendling281ca292012-03-12 21:22:35 +0000169 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000170 if (CombinedArg) {
171 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
172 } else {
173 CmdArgs.push_back(ArgName);
174 CmdArgs.push_back(Args.MakeArgString(Dirs));
175 }
Bill Wendling281ca292012-03-12 21:22:35 +0000176 }
177}
178
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000179static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
180 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000181 const Driver &D = TC.getDriver();
182
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000183 // Add extra linker input arguments which are not treated as inputs
184 // (constructed via -Xarch_).
185 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
186
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000187 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000188 if (!TC.HasNativeLLVMSupport()) {
189 // Don't try to pass LLVM inputs unless we have native support.
190 if (II.getType() == types::TY_LLVM_IR ||
191 II.getType() == types::TY_LTO_IR ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000192 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
193 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000194 }
195
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000196 // Add filenames immediately.
197 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000198 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000199 continue;
200 }
201
202 // Otherwise, this is a linker input argument.
203 const Arg &A = II.getInputArg();
204
205 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000206 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000207 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000208 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000209 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000210 else if (A.getOption().matches(options::OPT_z)) {
211 // Pass -z prefix for gcc linker compatibility.
212 A.claim();
213 A.render(Args, CmdArgs);
214 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000215 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000216 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000217 }
Bill Wendling281ca292012-03-12 21:22:35 +0000218
219 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000220 // and only supported on native toolchains.
221 if (!TC.isCrossCompiling())
222 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000223}
224
John McCall31168b02011-06-15 23:02:42 +0000225/// \brief Determine whether Objective-C automated reference counting is
226/// enabled.
227static bool isObjCAutoRefCount(const ArgList &Args) {
228 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
229}
230
Ted Kremeneke65b0862012-03-06 20:05:56 +0000231/// \brief Determine whether we are linking the ObjC runtime.
232static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000233 if (isObjCAutoRefCount(Args)) {
234 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000235 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000236 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000237 return Args.hasArg(options::OPT_fobjc_link_runtime);
238}
239
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000240static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000241 // Don't forward inputs from the original command line. They are added from
242 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000243 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000244 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000245}
246
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000247void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
248 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000249 ArgStringList &CmdArgs,
250 const InputInfo &Output,
251 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000252 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000253
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000254 CheckPreprocessingOptions(D, Args);
255
256 Args.AddLastArg(CmdArgs, options::OPT_C);
257 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000258
259 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000260 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000261 (A = Args.getLastArg(options::OPT_MD)) ||
262 (A = Args.getLastArg(options::OPT_MMD))) {
263 // Determine the output location.
264 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000265 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000266 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000267 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000268 } else if (Output.getType() == types::TY_Dependencies) {
269 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000270 } else if (A->getOption().matches(options::OPT_M) ||
271 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000272 DepFile = "-";
273 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000274 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000275 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000276 }
277 CmdArgs.push_back("-dependency-file");
278 CmdArgs.push_back(DepFile);
279
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000280 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000281 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
282 const char *DepTarget;
283
284 // If user provided -o, that is the dependency target, except
285 // when we are only generating a dependency file.
286 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
287 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000288 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000289 } else {
290 // Otherwise derive from the base input.
291 //
292 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000293 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000294 llvm::sys::path::replace_extension(P, "o");
295 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000296 }
297
298 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000299 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000300 QuoteTarget(DepTarget, Quoted);
301 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000302 }
303
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000304 if (A->getOption().matches(options::OPT_M) ||
305 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000307 if ((isa<PrecompileJobAction>(JA) &&
308 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
309 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000310 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000311 }
312
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000313 if (Args.hasArg(options::OPT_MG)) {
314 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000315 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000316 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000317 CmdArgs.push_back("-MG");
318 }
319
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000320 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000321 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000322
323 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000324 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000325 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000326
Daniel Dunbara442fd52010-06-11 22:00:13 +0000327 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000328 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000329 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000330 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000331 CmdArgs.push_back(Args.MakeArgString(Quoted));
332
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000333 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000334 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000335 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000336 }
337 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000338
Douglas Gregor111af7d2009-04-18 00:34:01 +0000339 // Add -i* options, and automatically translate to
340 // -include-pch/-include-pth for transparent PCH support. It's
341 // wonky, but we include looking for .gch so we can support seamless
342 // replacement into a build system already set up to be generating
343 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000344 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000345 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000346 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000347 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
348 RenderedImplicitInclude = true;
349
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000350 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000351 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000352
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000353 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000354 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000355 SmallString<128> P(A->getValue());
356 // We want the files to have a name like foo.h.pch. Add a dummy extension
357 // so that replace_extension does the right thing.
358 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000359 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000360 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000361 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000362 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000363 }
364
Douglas Gregor111af7d2009-04-18 00:34:01 +0000365 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000366 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000367 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000368 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000369 }
370
Douglas Gregor111af7d2009-04-18 00:34:01 +0000371 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000372 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000373 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000374 FoundPCH = UsePCH;
375 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000376 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000377 }
378
379 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000380 if (IsFirstImplicitInclude) {
381 A->claim();
382 if (UsePCH)
383 CmdArgs.push_back("-include-pch");
384 else
385 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000386 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000387 continue;
388 } else {
389 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000390 D.Diag(diag::warn_drv_pch_not_first_include) << P
391 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000392 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000393 }
394 }
395
396 // Not translated, render as usual.
397 A->claim();
398 A->render(Args, CmdArgs);
399 }
400
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000401 Args.AddAllArgs(CmdArgs,
402 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
403 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000404
405 // Add -Wp, and -Xassembler if using the preprocessor.
406
407 // FIXME: There is a very unfortunate problem here, some troubled
408 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
409 // really support that we would have to parse and then translate
410 // those options. :(
411 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
412 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000413
414 // -I- is a deprecated GCC feature, reject it.
415 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000416 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000417
418 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
419 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000420 StringRef sysroot = C.getSysRoot();
421 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000422 if (!Args.hasArg(options::OPT_isysroot)) {
423 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000424 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000425 }
426 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000427
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000428 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000429 // FIXME: We should probably sink the logic for handling these from the
430 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000431 // CPATH - included following the user specified includes (but prior to
432 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000433 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000434 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000435 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000436 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000437 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000438 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000439 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000440 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000441 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000442
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000443 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000444 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000445 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000446
447 // Add system include arguments.
448 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000449}
450
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000451// FIXME: Move to target hook.
452static bool isSignedCharDefault(const llvm::Triple &Triple) {
453 switch (Triple.getArch()) {
454 default:
455 return true;
456
Tim Northover9bb857a2013-01-31 12:13:10 +0000457 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000458 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000459 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000460 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000461 case llvm::Triple::thumb:
462 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000463 if (Triple.isOSDarwin() || Triple.isOSWindows())
464 return true;
465 return false;
466
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000467 case llvm::Triple::ppc:
468 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000469 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000470 return true;
471 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000472
David Majnemerdcecd932015-05-23 19:23:55 +0000473 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000474 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000475 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000476 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000477 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000478 }
479}
480
Robert Lytton0e076492013-08-13 09:43:10 +0000481static bool isNoCommonDefault(const llvm::Triple &Triple) {
482 switch (Triple.getArch()) {
483 default:
484 return false;
485
486 case llvm::Triple::xcore:
487 return true;
488 }
489}
490
Renato Goline17c5802015-07-27 23:44:42 +0000491// ARM tools start.
492
493// Get SubArch (vN).
494static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
495 llvm::StringRef Arch = Triple.getArchName();
496 return llvm::ARMTargetParser::parseArchVersion(Arch);
497}
498
499// True if M-profile.
500static bool isARMMProfile(const llvm::Triple &Triple) {
501 llvm::StringRef Arch = Triple.getArchName();
502 unsigned Profile = llvm::ARMTargetParser::parseArchProfile(Arch);
503 return Profile == llvm::ARM::PK_M;
504}
505
506// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000507static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
508 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000509 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
510 CPU = A->getValue();
511 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
512 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000513 if (!FromAs)
514 return;
515
516 for (const Arg *A :
517 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
518 StringRef Value = A->getValue();
519 if (Value.startswith("-mcpu="))
520 CPU = Value.substr(6);
521 if (Value.startswith("-march="))
522 Arch = Value.substr(7);
523 }
Renato Goline17c5802015-07-27 23:44:42 +0000524}
525
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000526// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000527// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000528static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000529 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000530 std::vector<const char *> &Features) {
Alexandros Lamprinease5b47642015-07-28 09:08:03 +0000531 unsigned HWDivID = llvm::ARMTargetParser::parseHWDiv(HWDiv);
532 if (!llvm::ARMTargetParser::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000533 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
534}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000535
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000536// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000537static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000538 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000539 std::vector<const char *> &Features) {
John Brawn5a589ad2015-06-05 13:34:11 +0000540 unsigned FPUID = llvm::ARMTargetParser::parseFPU(FPU);
541 if (!llvm::ARMTargetParser::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000542 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
543}
544
Renato Golin7c542b42015-07-27 23:44:45 +0000545// Check if -march is valid by checking if it can be canonicalised and parsed.
546// getARMArch is used here instead of just checking the -march value in order
547// to handle -march=native correctly.
548static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000549 llvm::StringRef ArchName,
550 const llvm::Triple &Triple) {
551 std::string MArch = arm::getARMArch(ArchName, Triple);
552 if (llvm::ARMTargetParser::parseArch(MArch) == llvm::ARM::AK_INVALID)
553 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000554}
555
Renato Golin7c542b42015-07-27 23:44:45 +0000556// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
557static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
558 llvm::StringRef CPUName, llvm::StringRef ArchName,
Renato Goline17c5802015-07-27 23:44:42 +0000559 const llvm::Triple &Triple) {
560 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
561 std::string Arch = arm::getARMArch(ArchName, Triple);
562 if (strcmp(arm::getLLVMArchSuffixForARM(CPU, Arch), "") == 0)
563 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000564}
565
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000566static bool useAAPCSForMachO(const llvm::Triple &T) {
567 // The backend is hardwired to assume AAPCS for M-class processors, ensure
568 // the frontend matches that.
569 return T.getEnvironment() == llvm::Triple::EABI ||
570 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
571}
572
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000573// Select the float ABI as determined by -msoft-float, -mhard-float, and
574// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000575StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000576 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000577 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000578 if (Arg *A =
579 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
580 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000581 if (A->getOption().matches(options::OPT_msoft_float))
582 FloatABI = "soft";
583 else if (A->getOption().matches(options::OPT_mhard_float))
584 FloatABI = "hard";
585 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000586 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000587 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000588 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Daniel Dunbar78485922009-09-10 23:00:09 +0000589 FloatABI = "soft";
590 }
591 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000592
593 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
594 // "apcs-gnu".
595 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
596 FloatABI == "hard")
597 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
598 << Triple.getArchName();
Daniel Dunbar78485922009-09-10 23:00:09 +0000599 }
600
601 // If unspecified, choose the default based on the platform.
602 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000603 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000604 case llvm::Triple::Darwin:
605 case llvm::Triple::MacOSX:
606 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000607 // Darwin defaults to "softfp" for v6 and v7.
608 //
John Brawn94fd9632015-05-21 12:19:49 +0000609 if (getARMSubArchVersionNumber(Triple) == 6 ||
610 getARMSubArchVersionNumber(Triple) == 7)
Daniel Dunbar78485922009-09-10 23:00:09 +0000611 FloatABI = "softfp";
612 else
613 FloatABI = "soft";
614 break;
615 }
616
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000617 // FIXME: this is invalid for WindowsCE
618 case llvm::Triple::Win32:
619 FloatABI = "hard";
620 break;
621
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000622 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000623 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000624 case llvm::Triple::GNUEABIHF:
625 FloatABI = "hard";
626 break;
627 default:
628 // FreeBSD defaults to soft float
629 FloatABI = "soft";
630 break;
631 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000632 break;
633
Daniel Dunbar78485922009-09-10 23:00:09 +0000634 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000635 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000636 case llvm::Triple::GNUEABIHF:
637 FloatABI = "hard";
638 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000639 case llvm::Triple::GNUEABI:
640 FloatABI = "softfp";
641 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000642 case llvm::Triple::EABIHF:
643 FloatABI = "hard";
644 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000645 case llvm::Triple::EABI:
646 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
647 FloatABI = "softfp";
648 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000649 case llvm::Triple::Android: {
John Brawn94fd9632015-05-21 12:19:49 +0000650 if (getARMSubArchVersionNumber(Triple) == 7)
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000651 FloatABI = "softfp";
652 else
653 FloatABI = "soft";
654 break;
655 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000656 default:
657 // Assume "soft", but warn the user we are guessing.
658 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000659 if (Triple.getOS() != llvm::Triple::UnknownOS ||
660 !Triple.isOSBinFormatMachO())
661 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000662 break;
663 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000664 }
665 }
666
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000667 return FloatABI;
668}
669
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000670static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
671 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000672 std::vector<const char *> &Features,
673 bool ForAS) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000674 bool KernelOrKext =
675 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Nico Weber6e0ebae2015-04-29 21:16:40 +0000676 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000677 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
678 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
679
Nico Weber6e0ebae2015-04-29 21:16:40 +0000680 if (!ForAS) {
681 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
682 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
683 // stripped out by the ARM target. We should probably pass this a new
684 // -target-option, which is handled by the -cc1/-cc1as invocation.
685 //
686 // FIXME2: For consistency, it would be ideal if we set up the target
687 // machine state the same when using the frontend or the assembler. We don't
688 // currently do that for the assembler, we pass the options directly to the
689 // backend and never even instantiate the frontend TargetInfo. If we did,
690 // and used its handleTargetFeatures hook, then we could ensure the
691 // assembler and the frontend behave the same.
692
693 // Use software floating point operations?
694 if (FloatABI == "soft")
695 Features.push_back("+soft-float");
696
697 // Use software floating point argument passing?
698 if (FloatABI != "hard")
699 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000700 } else {
701 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
702 // to the assembler correctly.
703 for (const Arg *A :
704 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
705 StringRef Value = A->getValue();
706 if (Value.startswith("-mfpu=")) {
707 WaFPU = A;
708 } else if (Value.startswith("-mcpu=")) {
709 WaCPU = A;
710 } else if (Value.startswith("-mhwdiv=")) {
711 WaHDiv = A;
712 } else if (Value.startswith("-march=")) {
713 WaArch = A;
714 }
715 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000716 }
717
Renato Golin7c542b42015-07-27 23:44:45 +0000718 // Check -march. ClangAs gives preference to -Wa,-march=.
719 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000720 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000721 if (WaArch) {
722 if (ArchArg)
723 D.Diag(clang::diag::warn_drv_unused_argument)
724 << ArchArg->getAsString(Args);
725 ArchName = StringRef(WaArch->getValue()).substr(7);
726 checkARMArchName(D, WaArch, Args, ArchName, Triple);
727 // FIXME: Set Arch.
728 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
729 } else if (ArchArg) {
730 ArchName = ArchArg->getValue();
731 checkARMArchName(D, ArchArg, Args, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000732 }
733
Renato Golin7c542b42015-07-27 23:44:45 +0000734 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
735 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000736 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000737 if (WaCPU) {
738 if (CPUArg)
739 D.Diag(clang::diag::warn_drv_unused_argument)
740 << CPUArg->getAsString(Args);
741 CPUName = StringRef(WaCPU->getValue()).substr(6);
742 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Triple);
743 } else if (CPUArg) {
744 CPUName = CPUArg->getValue();
745 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000746 }
John Brawna95c1a82015-05-08 12:52:18 +0000747
Renato Golin23459c62015-07-30 16:40:17 +0000748 // Add CPU features for generic CPUs
749 if (CPUName == "native") {
750 llvm::StringMap<bool> HostFeatures;
751 if (llvm::sys::getHostCPUFeatures(HostFeatures))
752 for (auto &F : HostFeatures)
753 Features.push_back(
754 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
755 }
756
757 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
758 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
759 if (WaFPU) {
760 if (FPUArg)
761 D.Diag(clang::diag::warn_drv_unused_argument)
762 << FPUArg->getAsString(Args);
763 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
764 Features);
765 } else if (FPUArg) {
766 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
767 }
768
769 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
770 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
771 if (WaHDiv) {
772 if (HDivArg)
773 D.Diag(clang::diag::warn_drv_unused_argument)
774 << HDivArg->getAsString(Args);
775 getARMHWDivFeatures(D, WaHDiv, Args,
776 StringRef(WaHDiv->getValue()).substr(8), Features);
777 } else if (HDivArg)
778 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
779
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000780 // Setting -msoft-float effectively disables NEON because of the GCC
781 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000782 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000783 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000784 // Also need to explicitly disable features which imply NEON.
785 Features.push_back("-crypto");
786 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000787
Eric Christopher269c2a22015-04-04 03:34:43 +0000788 // En/disable crc code generation.
789 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000790 if (A->getOption().matches(options::OPT_mcrc))
791 Features.push_back("+crc");
792 else
793 Features.push_back("-crc");
794 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000795
796 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
797 Features.insert(Features.begin(), "+v8.1a");
798 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000799
Akira Hatanakac2694822015-07-07 08:28:42 +0000800 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
801 // neither options are specified, see if we are compiling for kernel/kext and
802 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000803 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
804 options::OPT_mno_long_calls)) {
805 if (A->getOption().matches(options::OPT_mlong_calls))
806 Features.push_back("+long-calls");
807 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6))) {
808 Features.push_back("+long-calls");
809 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000810
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000811 // Kernel code has more strict alignment requirements.
812 if (KernelOrKext)
813 Features.push_back("+strict-align");
814 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
815 options::OPT_munaligned_access)) {
816 if (A->getOption().matches(options::OPT_munaligned_access)) {
817 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
818 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
819 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
820 } else
821 Features.push_back("+strict-align");
822 } else {
823 // Assume pre-ARMv6 doesn't support unaligned accesses.
824 //
825 // ARMv6 may or may not support unaligned accesses depending on the
826 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
827 // Darwin and NetBSD targets support unaligned accesses, and others don't.
828 //
829 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
830 // which raises an alignment fault on unaligned accesses. Linux
831 // defaults this bit to 0 and handles it as a system-wide (not
832 // per-process) setting. It is therefore safe to assume that ARMv7+
833 // Linux targets support unaligned accesses. The same goes for NaCl.
834 //
835 // The above behavior is consistent with GCC.
836 int VersionNum = getARMSubArchVersionNumber(Triple);
837 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
838 if (VersionNum < 6)
839 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
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000858void Clang::AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000859 bool KernelOrKext) const {
860 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000861 // Get the effective triple, which takes into account the deployment target.
862 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
863 llvm::Triple Triple(TripleStr);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000864
865 // Select the ABI to use.
866 //
867 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000868 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000869 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000870 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000871 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000872 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000873 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000874 ABIName = "aapcs";
875 } else {
876 ABIName = "apcs-gnu";
877 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000878 } else if (Triple.isOSWindows()) {
879 // FIXME: this is invalid for WindowsCE
880 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000881 } else {
882 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000883 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000884 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000885 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000886 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000887 ABIName = "aapcs-linux";
888 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000889 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000890 case llvm::Triple::EABI:
891 ABIName = "aapcs";
892 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000893 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000894 if (Triple.getOS() == llvm::Triple::NetBSD)
895 ABIName = "apcs-gnu";
896 else
897 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000898 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000899 }
900 }
901 CmdArgs.push_back("-target-abi");
902 CmdArgs.push_back(ABIName);
903
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000904 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000905 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000906 if (FloatABI == "soft") {
907 // Floating point operations and argument passing are soft.
908 //
909 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000910 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000911 CmdArgs.push_back("-mfloat-abi");
912 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000913 } else if (FloatABI == "softfp") {
914 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000915 CmdArgs.push_back("-mfloat-abi");
916 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000917 } else {
918 // Floating point operations and argument passing are hard.
919 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000920 CmdArgs.push_back("-mfloat-abi");
921 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000922 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000923
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000924 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000925 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
926 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000927 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000928 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000929 CmdArgs.push_back("-arm-global-merge=false");
930 else
931 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000932 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000933
Bob Wilson9c8af452013-04-11 18:53:25 +0000934 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000935 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000936 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000937}
Renato Goline17c5802015-07-27 23:44:42 +0000938// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000939
Tim Northover573cbee2014-05-24 12:52:07 +0000940/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
941/// targeting.
942static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000943 Arg *A;
944 std::string CPU;
945 // If we have -mtune or -mcpu, use that.
946 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +0000947 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +0000948 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000949 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +0000950 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +0000951 }
952
Kevin Qin110db6f2014-07-18 07:03:22 +0000953 // Handle CPU name is 'native'.
954 if (CPU == "native")
955 return llvm::sys::getHostCPUName();
956 else if (CPU.size())
957 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000958
James Molloy9b1586b2014-04-17 12:51:17 +0000959 // Make sure we pick "cyclone" if -arch is used.
960 // FIXME: Should this be picked by checking the target triple instead?
961 if (Args.getLastArg(options::OPT_arch))
962 return "cyclone";
963
964 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000965}
966
Tim Northover573cbee2014-05-24 12:52:07 +0000967void Clang::AddAArch64TargetArgs(const ArgList &Args,
968 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000969 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
970 llvm::Triple Triple(TripleStr);
971
972 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
973 Args.hasArg(options::OPT_mkernel) ||
974 Args.hasArg(options::OPT_fapple_kext))
975 CmdArgs.push_back("-disable-red-zone");
976
977 if (!Args.hasFlag(options::OPT_mimplicit_float,
978 options::OPT_mno_implicit_float, true))
979 CmdArgs.push_back("-no-implicit-float");
980
Craig Topper92fc2df2014-05-17 16:56:41 +0000981 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000982 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
983 ABIName = A->getValue();
984 else if (Triple.isOSDarwin())
985 ABIName = "darwinpcs";
986 else
987 ABIName = "aapcs";
988
989 CmdArgs.push_back("-target-abi");
990 CmdArgs.push_back(ABIName);
991
Bradley Smith9ff64332014-10-13 10:16:06 +0000992 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
993 options::OPT_mno_fix_cortex_a53_835769)) {
994 CmdArgs.push_back("-backend-option");
995 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
996 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
997 else
998 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000999 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
1000 // Enabled A53 errata (835769) workaround by default on android
1001 CmdArgs.push_back("-backend-option");
1002 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001003 }
1004
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001005 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001006 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1007 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001008 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001009 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001010 CmdArgs.push_back("-aarch64-global-merge=false");
1011 else
1012 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001013 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001014}
1015
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001016// Get CPU and ABI names. They are not independent
1017// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001018void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1019 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001020 const char *DefMips32CPU = "mips32r2";
1021 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001022
Daniel Sanders2bf13662014-07-10 14:40:57 +00001023 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1024 // default for mips64(el)?-img-linux-gnu.
1025 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1026 Triple.getEnvironment() == llvm::Triple::GNU) {
1027 DefMips32CPU = "mips32r6";
1028 DefMips64CPU = "mips64r6";
1029 }
Renato Golin7c542b42015-07-27 23:44:45 +00001030
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001031 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
1032 if (Triple.getEnvironment() == llvm::Triple::Android)
1033 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001034
Brad Smithba26f582015-01-06 02:53:17 +00001035 // MIPS3 is the default for mips64*-unknown-openbsd.
1036 if (Triple.getOS() == llvm::Triple::OpenBSD)
1037 DefMips64CPU = "mips3";
1038
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001039 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001040 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001041
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001042 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001043 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001044 // Convert a GNU style Mips ABI name to the name
1045 // accepted by LLVM Mips backend.
1046 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001047 .Case("32", "o32")
1048 .Case("64", "n64")
1049 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001050 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001051
1052 // Setup default CPU and ABI names.
1053 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001054 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001055 default:
1056 llvm_unreachable("Unexpected triple arch name");
1057 case llvm::Triple::mips:
1058 case llvm::Triple::mipsel:
1059 CPUName = DefMips32CPU;
1060 break;
1061 case llvm::Triple::mips64:
1062 case llvm::Triple::mips64el:
1063 CPUName = DefMips64CPU;
1064 break;
1065 }
1066 }
1067
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001068 if (ABIName.empty()) {
1069 // Deduce ABI name from the target triple.
1070 if (Triple.getArch() == llvm::Triple::mips ||
1071 Triple.getArch() == llvm::Triple::mipsel)
1072 ABIName = "o32";
1073 else
1074 ABIName = "n64";
1075 }
1076
1077 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001078 // Deduce CPU name from ABI name.
1079 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001080 .Cases("o32", "eabi", DefMips32CPU)
1081 .Cases("n32", "n64", DefMips64CPU)
1082 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001083 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001084
1085 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001086}
1087
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001088// Convert ABI name to the GNU tools acceptable variant.
1089static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1090 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001091 .Case("o32", "32")
1092 .Case("n64", "64")
1093 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001094}
1095
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001096// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1097// and -mfloat-abi=.
1098static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001099 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001100 if (Arg *A =
1101 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1102 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001103 if (A->getOption().matches(options::OPT_msoft_float))
1104 FloatABI = "soft";
1105 else if (A->getOption().matches(options::OPT_mhard_float))
1106 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001107 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001108 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001109 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001110 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001111 FloatABI = "hard";
1112 }
1113 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001114 }
1115
1116 // If unspecified, choose the default based on the platform.
1117 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001118 // Assume "hard", because it's a default value used by gcc.
1119 // When we start to recognize specific target MIPS processors,
1120 // we will be able to select the default more correctly.
1121 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001122 }
1123
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001124 return FloatABI;
1125}
1126
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001127static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001128 std::vector<const char *> &Features,
1129 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001130 StringRef FeatureName) {
1131 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001132 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001133 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001134 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001135 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001136 }
1137}
1138
Daniel Sanders379d44b2014-07-16 11:52:23 +00001139static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1140 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001141 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001142 StringRef CPUName;
1143 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001144 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001145 ABIName = getGnuCompatibleMipsABIName(ABIName);
1146
Daniel Sandersfeb61302014-08-08 15:47:17 +00001147 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1148 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001149
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001150 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001151 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001152 // FIXME: Note, this is a hack. We need to pass the selected float
1153 // mode to the MipsTargetInfoBase to define appropriate macros there.
1154 // Now it is the only method.
1155 Features.push_back("+soft-float");
1156 }
1157
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001158 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001159 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001160 if (Val == "2008") {
1161 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1162 Features.push_back("+nan2008");
1163 else {
1164 Features.push_back("-nan2008");
1165 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1166 }
1167 } else if (Val == "legacy") {
1168 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1169 Features.push_back("-nan2008");
1170 else {
1171 Features.push_back("+nan2008");
1172 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1173 }
1174 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001175 D.Diag(diag::err_drv_unsupported_option_argument)
1176 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001177 }
1178
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001179 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1180 options::OPT_mdouble_float, "single-float");
1181 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1182 "mips16");
1183 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1184 options::OPT_mno_micromips, "micromips");
1185 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1186 "dsp");
1187 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1188 "dspr2");
1189 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1190 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001191
1192 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1193 // pass -mfpxx
1194 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1195 options::OPT_mfp64)) {
1196 if (A->getOption().matches(options::OPT_mfp32))
1197 Features.push_back(Args.MakeArgString("-fp64"));
1198 else if (A->getOption().matches(options::OPT_mfpxx)) {
1199 Features.push_back(Args.MakeArgString("+fpxx"));
1200 Features.push_back(Args.MakeArgString("+nooddspreg"));
1201 } else
1202 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001203 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001204 Features.push_back(Args.MakeArgString("+fpxx"));
1205 Features.push_back(Args.MakeArgString("+nooddspreg"));
1206 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001207
Daniel Sanders28e5d392014-07-10 10:39:51 +00001208 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1209 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001210}
1211
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001212void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001213 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001214 const Driver &D = getToolChain().getDriver();
1215 StringRef CPUName;
1216 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001217 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001218 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001219
1220 CmdArgs.push_back("-target-abi");
1221 CmdArgs.push_back(ABIName.data());
1222
1223 StringRef FloatABI = getMipsFloatABI(D, Args);
1224
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001225 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001226 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001227 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001228 CmdArgs.push_back("-mfloat-abi");
1229 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001230 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001231 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001232 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001233 CmdArgs.push_back("-mfloat-abi");
1234 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001235 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001236
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001237 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1238 if (A->getOption().matches(options::OPT_mxgot)) {
1239 CmdArgs.push_back("-mllvm");
1240 CmdArgs.push_back("-mxgot");
1241 }
1242 }
1243
Simon Atanasyanc580b322013-05-11 06:33:44 +00001244 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1245 options::OPT_mno_ldc1_sdc1)) {
1246 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1247 CmdArgs.push_back("-mllvm");
1248 CmdArgs.push_back("-mno-ldc1-sdc1");
1249 }
1250 }
1251
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001252 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1253 options::OPT_mno_check_zero_division)) {
1254 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1255 CmdArgs.push_back("-mllvm");
1256 CmdArgs.push_back("-mno-check-zero-division");
1257 }
1258 }
1259
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001260 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001261 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001262 CmdArgs.push_back("-mllvm");
1263 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1264 A->claim();
1265 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001266}
1267
Hal Finkel8eb59282012-06-11 22:35:19 +00001268/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1269static std::string getPPCTargetCPU(const ArgList &Args) {
1270 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001271 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001272
1273 if (CPUName == "native") {
1274 std::string CPU = llvm::sys::getHostCPUName();
1275 if (!CPU.empty() && CPU != "generic")
1276 return CPU;
1277 else
1278 return "";
1279 }
1280
1281 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001282 .Case("common", "generic")
1283 .Case("440", "440")
1284 .Case("440fp", "440")
1285 .Case("450", "450")
1286 .Case("601", "601")
1287 .Case("602", "602")
1288 .Case("603", "603")
1289 .Case("603e", "603e")
1290 .Case("603ev", "603ev")
1291 .Case("604", "604")
1292 .Case("604e", "604e")
1293 .Case("620", "620")
1294 .Case("630", "pwr3")
1295 .Case("G3", "g3")
1296 .Case("7400", "7400")
1297 .Case("G4", "g4")
1298 .Case("7450", "7450")
1299 .Case("G4+", "g4+")
1300 .Case("750", "750")
1301 .Case("970", "970")
1302 .Case("G5", "g5")
1303 .Case("a2", "a2")
1304 .Case("a2q", "a2q")
1305 .Case("e500mc", "e500mc")
1306 .Case("e5500", "e5500")
1307 .Case("power3", "pwr3")
1308 .Case("power4", "pwr4")
1309 .Case("power5", "pwr5")
1310 .Case("power5x", "pwr5x")
1311 .Case("power6", "pwr6")
1312 .Case("power6x", "pwr6x")
1313 .Case("power7", "pwr7")
1314 .Case("power8", "pwr8")
1315 .Case("pwr3", "pwr3")
1316 .Case("pwr4", "pwr4")
1317 .Case("pwr5", "pwr5")
1318 .Case("pwr5x", "pwr5x")
1319 .Case("pwr6", "pwr6")
1320 .Case("pwr6x", "pwr6x")
1321 .Case("pwr7", "pwr7")
1322 .Case("pwr8", "pwr8")
1323 .Case("powerpc", "ppc")
1324 .Case("powerpc64", "ppc64")
1325 .Case("powerpc64le", "ppc64le")
1326 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001327 }
1328
1329 return "";
1330}
1331
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001332static void getPPCTargetFeatures(const ArgList &Args,
1333 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001334 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1335 StringRef Name = A->getOption().getName();
1336 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001337
1338 // Skip over "-m".
1339 assert(Name.startswith("m") && "Invalid feature name.");
1340 Name = Name.substr(1);
1341
1342 bool IsNegative = Name.startswith("no-");
1343 if (IsNegative)
1344 Name = Name.substr(3);
1345
1346 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1347 // pass the correct option to the backend while calling the frontend
1348 // option the same.
1349 // TODO: Change the LLVM backend option maybe?
1350 if (Name == "mfcrf")
1351 Name = "mfocrf";
1352
1353 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1354 }
1355
1356 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001357 AddTargetFeature(Args, Features, options::OPT_faltivec,
1358 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001359}
1360
Ulrich Weigand8afad612014-07-28 13:17:52 +00001361void Clang::AddPPCTargetArgs(const ArgList &Args,
1362 ArgStringList &CmdArgs) const {
1363 // Select the ABI to use.
1364 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001365 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001366 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001367 case llvm::Triple::ppc64: {
1368 // When targeting a processor that supports QPX, or if QPX is
1369 // specifically enabled, default to using the ABI that supports QPX (so
1370 // long as it is not specifically disabled).
1371 bool HasQPX = false;
1372 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1373 HasQPX = A->getValue() == StringRef("a2q");
1374 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1375 if (HasQPX) {
1376 ABIName = "elfv1-qpx";
1377 break;
1378 }
1379
Ulrich Weigand8afad612014-07-28 13:17:52 +00001380 ABIName = "elfv1";
1381 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001382 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001383 case llvm::Triple::ppc64le:
1384 ABIName = "elfv2";
1385 break;
1386 default:
1387 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001388 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001389
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001390 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1391 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1392 // the option if given as we don't have backend support for any targets
1393 // that don't use the altivec abi.
1394 if (StringRef(A->getValue()) != "altivec")
1395 ABIName = A->getValue();
1396
Ulrich Weigand8afad612014-07-28 13:17:52 +00001397 if (ABIName) {
1398 CmdArgs.push_back("-target-abi");
1399 CmdArgs.push_back(ABIName);
1400 }
1401}
1402
1403bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1404 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1405 return A && (A->getValue() == StringRef(Value));
1406}
1407
Tom Stellard6674c702013-04-01 20:56:53 +00001408/// Get the (LLVM) name of the R600 gpu we are targeting.
1409static std::string getR600TargetGPU(const ArgList &Args) {
1410 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001411 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001412 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001413 .Cases("rv630", "rv635", "r600")
1414 .Cases("rv610", "rv620", "rs780", "rs880")
1415 .Case("rv740", "rv770")
1416 .Case("palm", "cedar")
1417 .Cases("sumo", "sumo2", "sumo")
1418 .Case("hemlock", "cypress")
1419 .Case("aruba", "cayman")
1420 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001421 }
1422 return "";
1423}
1424
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001425void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001426 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001427 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001428 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001429
James Y Knightb2406522015-06-15 20:51:24 +00001430 bool SoftFloatABI = false;
1431 if (Arg *A =
1432 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001433 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001434 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001435 }
1436
James Y Knightb2406522015-06-15 20:51:24 +00001437 // Only the hard-float ABI on Sparc is standardized, and it is the
1438 // default. GCC also supports a nonstandard soft-float ABI mode, and
1439 // perhaps LLVM should implement that, too. However, since llvm
1440 // currently does not support Sparc soft-float, at all, display an
1441 // error if it's requested.
1442 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001443 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1444 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001445 }
1446}
1447
Richard Sandiford4652d892013-07-19 16:51:51 +00001448static const char *getSystemZTargetCPU(const ArgList &Args) {
1449 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1450 return A->getValue();
1451 return "z10";
1452}
1453
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001454static void getSystemZTargetFeatures(const ArgList &Args,
1455 std::vector<const char *> &Features) {
1456 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001457 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001458 if (A->getOption().matches(options::OPT_mhtm))
1459 Features.push_back("+transactional-execution");
1460 else
1461 Features.push_back("-transactional-execution");
1462 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001463 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001464 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001465 if (A->getOption().matches(options::OPT_mvx))
1466 Features.push_back("+vector");
1467 else
1468 Features.push_back("-vector");
1469 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001470}
1471
Chandler Carruth953fb082013-01-13 11:46:33 +00001472static const char *getX86TargetCPU(const ArgList &Args,
1473 const llvm::Triple &Triple) {
1474 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001475 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001476 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001477 return "core-avx2";
1478
Chandler Carruth953fb082013-01-13 11:46:33 +00001479 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001480 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001481
1482 // FIXME: Reject attempts to use -march=native unless the target matches
1483 // the host.
1484 //
1485 // FIXME: We should also incorporate the detected target features for use
1486 // with -native.
1487 std::string CPU = llvm::sys::getHostCPUName();
1488 if (!CPU.empty() && CPU != "generic")
1489 return Args.MakeArgString(CPU);
1490 }
1491
Reid Kleckner3123eff2015-06-30 16:32:04 +00001492 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1493 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1494 StringRef Arch = A->getValue();
1495 const char *CPU;
1496 if (Triple.getArch() == llvm::Triple::x86) {
1497 CPU = llvm::StringSwitch<const char *>(Arch)
1498 .Case("IA32", "i386")
1499 .Case("SSE", "pentium3")
1500 .Case("SSE2", "pentium4")
1501 .Case("AVX", "sandybridge")
1502 .Case("AVX2", "haswell")
1503 .Default(nullptr);
1504 } else {
1505 CPU = llvm::StringSwitch<const char *>(Arch)
1506 .Case("AVX", "sandybridge")
1507 .Case("AVX2", "haswell")
1508 .Default(nullptr);
1509 }
1510 if (CPU)
1511 return CPU;
1512 }
1513
Chandler Carruth953fb082013-01-13 11:46:33 +00001514 // Select the default CPU if none was given (or detection failed).
1515
1516 if (Triple.getArch() != llvm::Triple::x86_64 &&
1517 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001518 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001519
1520 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1521
1522 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001523 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001524 if (Triple.getArchName() == "x86_64h")
1525 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001526 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001527 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001528
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001529 // Set up default CPU name for PS4 compilers.
1530 if (Triple.isPS4CPU())
1531 return "btver2";
1532
Alexey Bataev286d1b92014-01-31 04:07:13 +00001533 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001534 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001535 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001536
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001537 // Everything else goes to x86-64 in 64-bit mode.
1538 if (Is64Bit)
1539 return "x86-64";
1540
1541 switch (Triple.getOS()) {
1542 case llvm::Triple::FreeBSD:
1543 case llvm::Triple::NetBSD:
1544 case llvm::Triple::OpenBSD:
1545 return "i486";
1546 case llvm::Triple::Haiku:
1547 return "i586";
1548 case llvm::Triple::Bitrig:
1549 return "i686";
1550 default:
1551 // Fallback to p4.
1552 return "pentium4";
1553 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001554}
1555
Renato Golin7c542b42015-07-27 23:44:45 +00001556static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1557 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001558 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001559 default:
1560 return "";
1561
Amara Emerson703da2e2013-10-31 09:32:33 +00001562 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001563 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001564 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001565
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001566 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001567 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001568 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001569 case llvm::Triple::thumbeb: {
1570 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001571 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001572 return arm::getARMTargetCPU(MCPU, MArch, T);
1573 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001574 case llvm::Triple::mips:
1575 case llvm::Triple::mipsel:
1576 case llvm::Triple::mips64:
1577 case llvm::Triple::mips64el: {
1578 StringRef CPUName;
1579 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001580 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001581 return CPUName;
1582 }
1583
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001584 case llvm::Triple::nvptx:
1585 case llvm::Triple::nvptx64:
1586 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1587 return A->getValue();
1588 return "";
1589
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001590 case llvm::Triple::ppc:
1591 case llvm::Triple::ppc64:
1592 case llvm::Triple::ppc64le: {
1593 std::string TargetCPUName = getPPCTargetCPU(Args);
1594 // LLVM may default to generating code for the native CPU,
1595 // but, like gcc, we default to a more generic option for
1596 // each architecture. (except on Darwin)
1597 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1598 if (T.getArch() == llvm::Triple::ppc64)
1599 TargetCPUName = "ppc64";
1600 else if (T.getArch() == llvm::Triple::ppc64le)
1601 TargetCPUName = "ppc64le";
1602 else
1603 TargetCPUName = "ppc";
1604 }
1605 return TargetCPUName;
1606 }
1607
1608 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001609 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001610 case llvm::Triple::sparcv9:
1611 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001612 return A->getValue();
1613 return "";
1614
1615 case llvm::Triple::x86:
1616 case llvm::Triple::x86_64:
1617 return getX86TargetCPU(Args, T);
1618
1619 case llvm::Triple::hexagon:
Douglas Katzman54366072015-07-27 16:53:08 +00001620 return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001621
1622 case llvm::Triple::systemz:
1623 return getSystemZTargetCPU(Args);
1624
1625 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001626 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001627 return getR600TargetGPU(Args);
1628 }
1629}
1630
Alp Tokerce365ca2013-12-02 12:43:03 +00001631static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1632 ArgStringList &CmdArgs) {
1633 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1634 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1635 // forward.
1636 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001637 std::string Plugin =
1638 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001639 CmdArgs.push_back(Args.MakeArgString(Plugin));
1640
1641 // Try to pass driver level flags relevant to LTO code generation down to
1642 // the plugin.
1643
1644 // Handle flags for selecting CPU variants.
1645 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1646 if (!CPU.empty())
1647 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1648}
1649
Sanjay Patel2987c292015-06-11 14:53:41 +00001650/// This is a helper function for validating the optional refinement step
1651/// parameter in reciprocal argument strings. Return false if there is an error
1652/// parsing the refinement step. Otherwise, return true and set the Position
1653/// of the refinement step in the input string.
1654static bool getRefinementStep(const StringRef &In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001655 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001656 const char RefinementStepToken = ':';
1657 Position = In.find(RefinementStepToken);
1658 if (Position != StringRef::npos) {
1659 StringRef Option = A.getOption().getName();
1660 StringRef RefStep = In.substr(Position + 1);
1661 // Allow exactly one numeric character for the additional refinement
1662 // step parameter. This is reasonable for all currently-supported
1663 // operations and architectures because we would expect that a larger value
1664 // of refinement steps would cause the estimate "optimization" to
1665 // under-perform the native operation. Also, if the estimate does not
1666 // converge quickly, it probably will not ever converge, so further
1667 // refinement steps will not produce a better answer.
1668 if (RefStep.size() != 1) {
1669 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1670 return false;
1671 }
1672 char RefStepChar = RefStep[0];
1673 if (RefStepChar < '0' || RefStepChar > '9') {
1674 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1675 return false;
1676 }
1677 }
1678 return true;
1679}
1680
1681/// The -mrecip flag requires processing of many optional parameters.
1682static void ParseMRecip(const Driver &D, const ArgList &Args,
1683 ArgStringList &OutStrings) {
1684 StringRef DisabledPrefixIn = "!";
1685 StringRef DisabledPrefixOut = "!";
1686 StringRef EnabledPrefixOut = "";
1687 StringRef Out = "-mrecip=";
1688
1689 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1690 if (!A)
1691 return;
1692
1693 unsigned NumOptions = A->getNumValues();
1694 if (NumOptions == 0) {
1695 // No option is the same as "all".
1696 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1697 return;
1698 }
1699
1700 // Pass through "all", "none", or "default" with an optional refinement step.
1701 if (NumOptions == 1) {
1702 StringRef Val = A->getValue(0);
1703 size_t RefStepLoc;
1704 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1705 return;
1706 StringRef ValBase = Val.slice(0, RefStepLoc);
1707 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1708 OutStrings.push_back(Args.MakeArgString(Out + Val));
1709 return;
1710 }
1711 }
1712
1713 // Each reciprocal type may be enabled or disabled individually.
1714 // Check each input value for validity, concatenate them all back together,
1715 // and pass through.
1716
1717 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001718 OptionStrings.insert(std::make_pair("divd", false));
1719 OptionStrings.insert(std::make_pair("divf", false));
1720 OptionStrings.insert(std::make_pair("vec-divd", false));
1721 OptionStrings.insert(std::make_pair("vec-divf", false));
1722 OptionStrings.insert(std::make_pair("sqrtd", false));
1723 OptionStrings.insert(std::make_pair("sqrtf", false));
1724 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1725 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001726
1727 for (unsigned i = 0; i != NumOptions; ++i) {
1728 StringRef Val = A->getValue(i);
1729
1730 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1731 // Ignore the disablement token for string matching.
1732 if (IsDisabled)
1733 Val = Val.substr(1);
1734
1735 size_t RefStep;
1736 if (!getRefinementStep(Val, D, *A, RefStep))
1737 return;
1738
1739 StringRef ValBase = Val.slice(0, RefStep);
1740 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1741 if (OptionIter == OptionStrings.end()) {
1742 // Try again specifying float suffix.
1743 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1744 if (OptionIter == OptionStrings.end()) {
1745 // The input name did not match any known option string.
1746 D.Diag(diag::err_drv_unknown_argument) << Val;
1747 return;
1748 }
1749 // The option was specified without a float or double suffix.
1750 // Make sure that the double entry was not already specified.
1751 // The float entry will be checked below.
1752 if (OptionStrings[ValBase.str() + 'd']) {
1753 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1754 return;
1755 }
1756 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001757
Sanjay Patel2987c292015-06-11 14:53:41 +00001758 if (OptionIter->second == true) {
1759 // Duplicate option specified.
1760 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1761 return;
1762 }
1763
1764 // Mark the matched option as found. Do not allow duplicate specifiers.
1765 OptionIter->second = true;
1766
1767 // If the precision was not specified, also mark the double entry as found.
1768 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1769 OptionStrings[ValBase.str() + 'd'] = true;
1770
1771 // Build the output string.
1772 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1773 Out = Args.MakeArgString(Out + Prefix + Val);
1774 if (i != NumOptions - 1)
1775 Out = Args.MakeArgString(Out + ",");
1776 }
1777
1778 OutStrings.push_back(Args.MakeArgString(Out));
1779}
1780
Eric Christopherc54920a2015-03-23 19:26:05 +00001781static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001782 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001783 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001784 // If -march=native, autodetect the feature list.
1785 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1786 if (StringRef(A->getValue()) == "native") {
1787 llvm::StringMap<bool> HostFeatures;
1788 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1789 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001790 Features.push_back(
1791 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001792 }
1793 }
1794
Jim Grosbach82eee262013-11-16 00:53:35 +00001795 if (Triple.getArchName() == "x86_64h") {
1796 // x86_64h implies quite a few of the more modern subtarget features
1797 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1798 Features.push_back("-rdrnd");
1799 Features.push_back("-aes");
1800 Features.push_back("-pclmul");
1801 Features.push_back("-rtm");
1802 Features.push_back("-hle");
1803 Features.push_back("-fsgsbase");
1804 }
1805
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001806 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001807 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001808 if (Triple.getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001809 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001810 Features.push_back("+sse4.2");
1811 Features.push_back("+popcnt");
1812 } else
1813 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001814 }
1815
Eric Christopherc54920a2015-03-23 19:26:05 +00001816 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001817 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1818 StringRef Arch = A->getValue();
1819 bool ArchUsed = false;
1820 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001821 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001822 if (Arch == "AVX" || Arch == "AVX2") {
1823 ArchUsed = true;
1824 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1825 }
1826 }
1827 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001828 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001829 if (Arch == "IA32") {
1830 ArchUsed = true;
1831 } else if (Arch == "SSE" || Arch == "SSE2") {
1832 ArchUsed = true;
1833 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1834 }
1835 }
1836 if (!ArchUsed)
1837 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1838 }
1839
Jim Grosbach82eee262013-11-16 00:53:35 +00001840 // Now add any that the user explicitly requested on the command line,
1841 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001842 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1843 StringRef Name = A->getOption().getName();
1844 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001845
1846 // Skip over "-m".
1847 assert(Name.startswith("m") && "Invalid feature name.");
1848 Name = Name.substr(1);
1849
1850 bool IsNegative = Name.startswith("no-");
1851 if (IsNegative)
1852 Name = Name.substr(3);
1853
1854 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1855 }
1856}
1857
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001858void Clang::AddX86TargetArgs(const ArgList &Args,
1859 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001860 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001861 Args.hasArg(options::OPT_mkernel) ||
1862 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001863 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001864
Bob Wilson2616e2e2013-02-10 16:01:41 +00001865 // Default to avoid implicit floating-point for kernel/kext code, but allow
1866 // that to be overridden with -mno-soft-float.
1867 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1868 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001869 if (Arg *A = Args.getLastArg(
1870 options::OPT_msoft_float, options::OPT_mno_soft_float,
1871 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001872 const Option &O = A->getOption();
1873 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1874 O.matches(options::OPT_msoft_float));
1875 }
1876 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001877 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001878
1879 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1880 StringRef Value = A->getValue();
1881 if (Value == "intel" || Value == "att") {
1882 CmdArgs.push_back("-mllvm");
1883 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1884 } else {
1885 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1886 << A->getOption().getName() << Value;
1887 }
1888 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001889}
1890
Tony Linthicum76329bf2011-12-12 21:14:55 +00001891void Clang::AddHexagonTargetArgs(const ArgList &Args,
1892 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001893 CmdArgs.push_back("-mqdsp6-compat");
1894 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001895
Douglas Katzman54366072015-07-27 16:53:08 +00001896 if (const char *v =
1897 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001898 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001899 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001900 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001901 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001902 }
1903
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001904 if (!Args.hasArg(options::OPT_fno_short_enums))
1905 CmdArgs.push_back("-fshort-enums");
1906 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001907 CmdArgs.push_back("-mllvm");
1908 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001909 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001910 CmdArgs.push_back("-mllvm");
1911 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001912}
1913
Kevin Qin110db6f2014-07-18 07:03:22 +00001914// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001915static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001916 std::vector<const char *> &Features) {
1917 SmallVector<StringRef, 8> Split;
1918 text.split(Split, StringRef("+"), -1, false);
1919
Douglas Katzman2675d012015-06-29 19:12:56 +00001920 for (const StringRef Feature : Split) {
1921 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00001922 .Case("fp", "+fp-armv8")
1923 .Case("simd", "+neon")
1924 .Case("crc", "+crc")
1925 .Case("crypto", "+crypto")
1926 .Case("nofp", "-fp-armv8")
1927 .Case("nosimd", "-neon")
1928 .Case("nocrc", "-crc")
1929 .Case("nocrypto", "-crypto")
1930 .Default(nullptr);
1931 if (result)
1932 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00001933 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00001934 D.Diag(diag::err_drv_no_neon_modifier);
1935 else
1936 return false;
1937 }
1938 return true;
1939}
1940
1941// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1942// decode CPU and feature.
1943static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1944 std::vector<const char *> &Features) {
1945 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1946 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001947 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
1948 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001949 Features.push_back("+neon");
1950 Features.push_back("+crc");
1951 Features.push_back("+crypto");
1952 } else if (CPU == "generic") {
1953 Features.push_back("+neon");
1954 } else {
1955 return false;
1956 }
1957
1958 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1959 return false;
1960
1961 return true;
1962}
1963
1964static bool
1965getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1966 const ArgList &Args,
1967 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00001968 std::string MarchLowerCase = March.lower();
1969 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001970
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001971 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001972 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001973 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001974 Features.push_back("+v8.1a");
1975 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001976 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001977 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001978
1979 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1980 return false;
1981
1982 return true;
1983}
1984
1985static bool
1986getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1987 const ArgList &Args,
1988 std::vector<const char *> &Features) {
1989 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001990 std::string McpuLowerCase = Mcpu.lower();
1991 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00001992 return false;
1993
1994 return true;
1995}
1996
1997static bool
1998getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1999 const ArgList &Args,
2000 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002001 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002002 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002003 if (MtuneLowerCase == "native")
2004 MtuneLowerCase = llvm::sys::getHostCPUName();
2005 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002006 Features.push_back("+zcm");
2007 Features.push_back("+zcz");
2008 }
2009 return true;
2010}
2011
2012static bool
2013getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2014 const ArgList &Args,
2015 std::vector<const char *> &Features) {
2016 StringRef CPU;
2017 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002018 std::string McpuLowerCase = Mcpu.lower();
2019 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002020 return false;
2021
2022 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2023}
2024
Akira Hatanaka92500472015-07-27 19:29:04 +00002025static void getAArch64TargetFeatures(const Driver &D,
2026 const llvm::Triple &Triple,
2027 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002028 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002029 Arg *A;
2030 bool success = true;
2031 // Enable NEON by default.
2032 Features.push_back("+neon");
2033 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2034 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2035 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2036 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002037 else if (Args.hasArg(options::OPT_arch))
2038 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2039 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002040
2041 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2042 success =
2043 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2044 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2045 success =
2046 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002047 else if (Args.hasArg(options::OPT_arch))
2048 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2049 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002050
2051 if (!success)
2052 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002053
2054 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2055 Features.push_back("-fp-armv8");
2056 Features.push_back("-crypto");
2057 Features.push_back("-neon");
2058 }
Bradley Smith418c5932014-05-02 15:17:51 +00002059
2060 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002061 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002062 if (A->getOption().matches(options::OPT_mcrc))
2063 Features.push_back("+crc");
2064 else
2065 Features.push_back("-crc");
2066 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002067
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002068 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2069 options::OPT_munaligned_access))
2070 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2071 Features.push_back("+strict-align");
2072
Akira Hatanaka92500472015-07-27 19:29:04 +00002073 if (Args.hasArg(options::OPT_ffixed_x18) || Triple.isOSDarwin())
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002074 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002075}
2076
2077static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002078 const ArgList &Args, ArgStringList &CmdArgs,
2079 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002080 std::vector<const char *> Features;
2081 switch (Triple.getArch()) {
2082 default:
2083 break;
2084 case llvm::Triple::mips:
2085 case llvm::Triple::mipsel:
2086 case llvm::Triple::mips64:
2087 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002088 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002089 break;
2090
2091 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002092 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002093 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002094 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002095 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002096 break;
2097
2098 case llvm::Triple::ppc:
2099 case llvm::Triple::ppc64:
2100 case llvm::Triple::ppc64le:
2101 getPPCTargetFeatures(Args, Features);
2102 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002103 case llvm::Triple::systemz:
2104 getSystemZTargetFeatures(Args, Features);
2105 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002106 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002107 case llvm::Triple::aarch64_be:
Akira Hatanaka92500472015-07-27 19:29:04 +00002108 getAArch64TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002109 break;
2110 case llvm::Triple::x86:
2111 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002112 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002113 break;
2114 }
Rafael Espindola43964802013-08-21 17:34:32 +00002115
2116 // Find the last of each feature.
2117 llvm::StringMap<unsigned> LastOpt;
2118 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2119 const char *Name = Features[I];
2120 assert(Name[0] == '-' || Name[0] == '+');
2121 LastOpt[Name + 1] = I;
2122 }
2123
2124 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2125 // If this feature was overridden, ignore it.
2126 const char *Name = Features[I];
2127 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2128 assert(LastI != LastOpt.end());
2129 unsigned Last = LastI->second;
2130 if (Last != I)
2131 continue;
2132
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002133 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002134 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002135 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002136}
2137
David Majnemerae394812014-12-09 00:12:30 +00002138static bool
2139shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2140 const llvm::Triple &Triple) {
2141 // We use the zero-cost exception tables for Objective-C if the non-fragile
2142 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2143 // later.
2144 if (runtime.isNonFragile())
2145 return true;
2146
2147 if (!Triple.isMacOSX())
2148 return false;
2149
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002150 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002151 (Triple.getArch() == llvm::Triple::x86_64 ||
2152 Triple.getArch() == llvm::Triple::arm));
2153}
2154
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002155/// Adds exception related arguments to the driver command arguments. There's a
2156/// master flag, -fexceptions and also language specific flags to enable/disable
2157/// C++ and Objective-C exceptions. This makes it possible to for example
2158/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002159static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002160 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002161 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002162 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002163 const Driver &D = TC.getDriver();
2164 const llvm::Triple &Triple = TC.getTriple();
2165
Chad Rosier4fab82c2012-03-26 22:04:46 +00002166 if (KernelOrKext) {
2167 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2168 // arguments now to avoid warnings about unused arguments.
2169 Args.ClaimAllArgs(options::OPT_fexceptions);
2170 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2171 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2172 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2173 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2174 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002175 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002176 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002177
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002178 // See if the user explicitly enabled exceptions.
2179 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2180 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002181
David Majnemerae394812014-12-09 00:12:30 +00002182 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2183 // is not necessarily sensible, but follows GCC.
2184 if (types::isObjC(InputType) &&
2185 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002186 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002187 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002188
David Majnemerae394812014-12-09 00:12:30 +00002189 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002190 }
2191
2192 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002193 // Disable C++ EH by default on XCore, PS4, and MSVC.
2194 // FIXME: Remove MSVC from this list once things work.
2195 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2196 !Triple.isPS4CPU() &&
2197 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002198 Arg *ExceptionArg = Args.getLastArg(
2199 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2200 options::OPT_fexceptions, options::OPT_fno_exceptions);
2201 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002202 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002203 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2204 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002205
2206 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002207 if (Triple.isPS4CPU()) {
2208 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2209 assert(ExceptionArg &&
2210 "On the PS4 exceptions should only be enabled if passing "
2211 "an argument");
2212 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2213 const Arg *RTTIArg = TC.getRTTIArg();
2214 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2215 D.Diag(diag::err_drv_argument_not_allowed_with)
2216 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2217 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2218 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2219 } else
2220 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2221
Anders Carlssone96ab552011-02-28 02:27:16 +00002222 CmdArgs.push_back("-fcxx-exceptions");
2223
David Majnemer8de68642014-12-05 08:11:58 +00002224 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002225 }
2226 }
2227
David Majnemer8de68642014-12-05 08:11:58 +00002228 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002229 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002230}
2231
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002232static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002233 bool Default = true;
2234 if (TC.getTriple().isOSDarwin()) {
2235 // The native darwin assembler doesn't support the linker_option directives,
2236 // so we disable them if we think the .s file will be passed to it.
2237 Default = TC.useIntegratedAs();
2238 }
2239 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2240 Default);
2241}
2242
Ted Kremenek62093662013-03-12 17:02:12 +00002243static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2244 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002245 bool UseDwarfDirectory =
2246 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2247 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002248 return !UseDwarfDirectory;
2249}
2250
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002251/// \brief Check whether the given input tree contains any compilation actions.
2252static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002253 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002254 return true;
2255
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002256 for (const auto &Act : *A)
2257 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002258 return true;
2259
2260 return false;
2261}
2262
2263/// \brief Check if -relax-all should be passed to the internal assembler.
2264/// This is done by default when compiling non-assembler source with -O0.
2265static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2266 bool RelaxDefault = true;
2267
2268 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2269 RelaxDefault = A->getOption().matches(options::OPT_O0);
2270
2271 if (RelaxDefault) {
2272 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002273 for (const auto &Act : C.getActions()) {
2274 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002275 RelaxDefault = true;
2276 break;
2277 }
2278 }
2279 }
2280
2281 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002282 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002283}
2284
David Blaikie9260ed62013-07-25 21:19:01 +00002285static void CollectArgsForIntegratedAssembler(Compilation &C,
2286 const ArgList &Args,
2287 ArgStringList &CmdArgs,
2288 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002289 if (UseRelaxAll(C, Args))
2290 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002291
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002292 // When passing -I arguments to the assembler we sometimes need to
2293 // unconditionally take the next argument. For example, when parsing
2294 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2295 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2296 // arg after parsing the '-I' arg.
2297 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002298
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002299 // When using an integrated assembler, translate -Wa, and -Xassembler
2300 // options.
2301 bool CompressDebugSections = false;
2302 for (const Arg *A :
2303 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2304 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002305
Renato Golin7c542b42015-07-27 23:44:45 +00002306 for (const StringRef Value : A->getValues()) {
2307 if (TakeNextArg) {
2308 CmdArgs.push_back(Value.data());
2309 TakeNextArg = false;
2310 continue;
2311 }
David Blaikie9260ed62013-07-25 21:19:01 +00002312
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002313 if (Value == "-force_cpusubtype_ALL") {
2314 // Do nothing, this is the default and we don't support anything else.
2315 } else if (Value == "-L") {
2316 CmdArgs.push_back("-msave-temp-labels");
2317 } else if (Value == "--fatal-warnings") {
2318 CmdArgs.push_back("-massembler-fatal-warnings");
2319 } else if (Value == "--noexecstack") {
2320 CmdArgs.push_back("-mnoexecstack");
2321 } else if (Value == "-compress-debug-sections" ||
2322 Value == "--compress-debug-sections") {
2323 CompressDebugSections = true;
2324 } else if (Value == "-nocompress-debug-sections" ||
2325 Value == "--nocompress-debug-sections") {
2326 CompressDebugSections = false;
2327 } else if (Value.startswith("-I")) {
2328 CmdArgs.push_back(Value.data());
2329 // We need to consume the next argument if the current arg is a plain
2330 // -I. The next arg will be the include directory.
2331 if (Value == "-I")
2332 TakeNextArg = true;
2333 } else if (Value.startswith("-gdwarf-")) {
2334 CmdArgs.push_back(Value.data());
Renato Golin7c542b42015-07-27 23:44:45 +00002335 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2336 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2337 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002338 } else {
2339 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002340 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002341 }
2342 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002343 }
2344 if (CompressDebugSections) {
2345 if (llvm::zlib::isAvailable())
2346 CmdArgs.push_back("-compress-debug-sections");
2347 else
2348 D.Diag(diag::warn_debug_compression_unavailable);
2349 }
David Blaikie9260ed62013-07-25 21:19:01 +00002350}
2351
Renato Goline807c122014-01-31 11:47:28 +00002352// Until ARM libraries are build separately, we have them all in one library
2353static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Reid Kleckner0213a472015-07-22 16:01:38 +00002354 if (TC.getTriple().isWindowsMSVCEnvironment() &&
Peter Collingbourne2659fb32015-07-02 02:07:43 +00002355 TC.getArch() == llvm::Triple::x86)
2356 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002357 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002358 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002359 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002360}
2361
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002362static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2363 // The runtimes are located in the OS-specific resource directory.
2364 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002365 const llvm::Triple &Triple = TC.getTriple();
2366 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002367 StringRef OSLibName =
2368 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002369 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002370 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002371}
2372
Peter Collingbourne581f4382015-07-02 01:48:12 +00002373SmallString<128> tools::getCompilerRT(const ToolChain &TC, StringRef Component,
2374 bool Shared) {
Dan Albert6f2875d2015-01-28 23:23:36 +00002375 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2376 ? "-android"
2377 : "";
2378
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002379 bool IsOSWindows = TC.getTriple().isOSWindows();
Reid Kleckner0213a472015-07-22 16:01:38 +00002380 bool IsITANMSVCWindows = TC.getTriple().isWindowsMSVCEnvironment() ||
2381 TC.getTriple().isWindowsItaniumEnvironment();
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002382 StringRef Arch = getArchNameForCompilerRTLib(TC);
Reid Kleckner0213a472015-07-22 16:01:38 +00002383 const char *Prefix = IsITANMSVCWindows ? "" : "lib";
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002384 const char *Suffix =
Reid Kleckner0213a472015-07-22 16:01:38 +00002385 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsITANMSVCWindows ? ".lib" : ".a");
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002386
2387 SmallString<128> Path = getCompilerRTLibDir(TC);
2388 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2389 Arch + Env + Suffix);
2390
2391 return Path;
2392}
2393
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002394// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002395// FIXME: Make sure we can also emit shared objects if they're requested
2396// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002397static void addClangRT(const ToolChain &TC, const ArgList &Args,
2398 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002399 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002400}
2401
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002402static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2403 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002404 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2405 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002406 Args.hasArg(options::OPT_fprofile_generate) ||
Diego Novillo578caf52015-07-09 17:23:53 +00002407 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002408 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002409 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002410 Args.hasArg(options::OPT_fcreate_profile) ||
2411 Args.hasArg(options::OPT_coverage)))
2412 return;
2413
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002414 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002415}
2416
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002417namespace {
2418enum OpenMPRuntimeKind {
2419 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2420 /// without knowing what runtime to target.
2421 OMPRT_Unknown,
2422
2423 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2424 /// the default for Clang.
2425 OMPRT_OMP,
2426
2427 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2428 /// this runtime but can swallow the pragmas, and find and link against the
2429 /// runtime library itself.
2430 OMPRT_GOMP,
2431
Chandler Carruthc6625c62015-05-28 21:10:31 +00002432 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002433 /// OpenMP runtime. We support this mode for users with existing dependencies
2434 /// on this runtime library name.
2435 OMPRT_IOMP5
2436};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002437}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002438
2439/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002440static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2441 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002442 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2443
2444 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2445 if (A)
2446 RuntimeName = A->getValue();
2447
2448 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002449 .Case("libomp", OMPRT_OMP)
2450 .Case("libgomp", OMPRT_GOMP)
2451 .Case("libiomp5", OMPRT_IOMP5)
2452 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002453
2454 if (RT == OMPRT_Unknown) {
2455 if (A)
2456 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002457 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002458 else
2459 // FIXME: We could use a nicer diagnostic here.
2460 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2461 }
2462
2463 return RT;
2464}
2465
Alexey Samsonov52550342014-09-15 19:58:40 +00002466static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2467 ArgStringList &CmdArgs, StringRef Sanitizer,
2468 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002469 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002470 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002471 if (!IsShared)
2472 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002473 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002474 if (!IsShared)
2475 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002476}
2477
Alexey Samsonov52550342014-09-15 19:58:40 +00002478// Tries to use a file with the list of dynamic symbols that need to be exported
2479// from the runtime library. Returns true if the file was found.
2480static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2481 ArgStringList &CmdArgs,
2482 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002483 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2484 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2485 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002486 return true;
2487 }
2488 return false;
2489}
2490
2491static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2492 ArgStringList &CmdArgs) {
2493 // Force linking against the system libraries sanitizers depends on
2494 // (see PR15823 why this is necessary).
2495 CmdArgs.push_back("--no-as-needed");
2496 CmdArgs.push_back("-lpthread");
2497 CmdArgs.push_back("-lrt");
2498 CmdArgs.push_back("-lm");
2499 // There's no libdl on FreeBSD.
2500 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2501 CmdArgs.push_back("-ldl");
2502}
2503
2504static void
2505collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2506 SmallVectorImpl<StringRef> &SharedRuntimes,
2507 SmallVectorImpl<StringRef> &StaticRuntimes,
2508 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2509 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2510 // Collect shared runtimes.
2511 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2512 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002513 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002514
Alexey Samsonov52550342014-09-15 19:58:40 +00002515 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002516 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002517 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2518 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002519 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002520 }
2521 if (SanArgs.needsAsanRt()) {
2522 if (SanArgs.needsSharedAsanRt()) {
2523 HelperStaticRuntimes.push_back("asan-preinit");
2524 } else {
2525 StaticRuntimes.push_back("asan");
2526 if (SanArgs.linkCXXRuntimes())
2527 StaticRuntimes.push_back("asan_cxx");
2528 }
2529 }
2530 if (SanArgs.needsDfsanRt())
2531 StaticRuntimes.push_back("dfsan");
2532 if (SanArgs.needsLsanRt())
2533 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002534 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002535 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002536 if (SanArgs.linkCXXRuntimes())
2537 StaticRuntimes.push_back("msan_cxx");
2538 }
2539 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002540 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002541 if (SanArgs.linkCXXRuntimes())
2542 StaticRuntimes.push_back("tsan_cxx");
2543 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002544 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002545 StaticRuntimes.push_back("ubsan_standalone");
2546 if (SanArgs.linkCXXRuntimes())
2547 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002548 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002549 if (SanArgs.needsSafeStackRt())
2550 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002551}
2552
Alexey Samsonov52550342014-09-15 19:58:40 +00002553// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2554// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2555static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002556 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002557 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2558 HelperStaticRuntimes;
2559 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2560 HelperStaticRuntimes);
2561 for (auto RT : SharedRuntimes)
2562 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2563 for (auto RT : HelperStaticRuntimes)
2564 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2565 bool AddExportDynamic = false;
2566 for (auto RT : StaticRuntimes) {
2567 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2568 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2569 }
2570 // If there is a static runtime with no dynamic list, force all the symbols
2571 // to be dynamic to be sure we export sanitizer interface functions.
2572 if (AddExportDynamic)
2573 CmdArgs.push_back("-export-dynamic");
2574 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002575}
2576
Reid Kleckner86ea7702015-02-04 23:45:07 +00002577static bool areOptimizationsEnabled(const ArgList &Args) {
2578 // Find the last -O arg and see if it is non-zero.
2579 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2580 return !A->getOption().matches(options::OPT_O0);
2581 // Defaults to -O0.
2582 return false;
2583}
2584
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002585static bool shouldUseFramePointerForTarget(const ArgList &Args,
2586 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002587 // XCore never wants frame pointers, regardless of OS.
2588 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002589 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002590 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002591
2592 if (Triple.isOSLinux()) {
2593 switch (Triple.getArch()) {
2594 // Don't use a frame pointer on linux if optimizing for certain targets.
2595 case llvm::Triple::mips64:
2596 case llvm::Triple::mips64el:
2597 case llvm::Triple::mips:
2598 case llvm::Triple::mipsel:
2599 case llvm::Triple::systemz:
2600 case llvm::Triple::x86:
2601 case llvm::Triple::x86_64:
2602 return !areOptimizationsEnabled(Args);
2603 default:
2604 return true;
2605 }
2606 }
2607
2608 if (Triple.isOSWindows()) {
2609 switch (Triple.getArch()) {
2610 case llvm::Triple::x86:
2611 return !areOptimizationsEnabled(Args);
2612 default:
2613 // All other supported Windows ISAs use xdata unwind information, so frame
2614 // pointers are not generally useful.
2615 return false;
2616 }
2617 }
2618
2619 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002620}
2621
Rafael Espindola224dd632011-12-14 21:02:23 +00002622static bool shouldUseFramePointer(const ArgList &Args,
2623 const llvm::Triple &Triple) {
2624 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2625 options::OPT_fomit_frame_pointer))
2626 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2627
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002628 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002629}
2630
Eric Christopherb7d97e92013-04-03 01:58:53 +00002631static bool shouldUseLeafFramePointer(const ArgList &Args,
2632 const llvm::Triple &Triple) {
2633 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2634 options::OPT_momit_leaf_frame_pointer))
2635 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2636
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002637 if (Triple.isPS4CPU())
2638 return false;
2639
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002640 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002641}
2642
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002643/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002644static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002645 SmallString<128> cwd;
2646 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002647 CmdArgs.push_back("-fdebug-compilation-dir");
2648 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002649 }
2650}
2651
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002652static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002653 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2654 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2655 SmallString<128> T(FinalOutput->getValue());
2656 llvm::sys::path::replace_extension(T, "dwo");
2657 return Args.MakeArgString(T);
2658 } else {
2659 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002660 SmallString<128> T(
2661 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002662 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002663 llvm::sys::path::replace_extension(F, "dwo");
2664 T += F;
2665 return Args.MakeArgString(F);
2666 }
2667}
2668
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002669static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2670 const JobAction &JA, const ArgList &Args,
2671 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002672 ArgStringList ExtractArgs;
2673 ExtractArgs.push_back("--extract-dwo");
2674
2675 ArgStringList StripArgs;
2676 StripArgs.push_back("--strip-dwo");
2677
2678 // Grabbing the output of the earlier compile step.
2679 StripArgs.push_back(Output.getFilename());
2680 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002681 ExtractArgs.push_back(OutFile);
2682
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002683 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002684 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002685
2686 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002687 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002688
2689 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002690 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002691}
2692
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002693/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002694/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2695static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002696 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002697 if (A->getOption().matches(options::OPT_O4) ||
2698 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002699 return true;
2700
2701 if (A->getOption().matches(options::OPT_O0))
2702 return false;
2703
2704 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2705
Rafael Espindola91780de2013-08-26 14:05:41 +00002706 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002707 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002708 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002709 return true;
2710
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002711 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002712 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002713 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002714
2715 unsigned OptLevel = 0;
2716 if (S.getAsInteger(10, OptLevel))
2717 return false;
2718
2719 return OptLevel > 1;
2720 }
2721
2722 return false;
2723}
2724
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002725/// Add -x lang to \p CmdArgs for \p Input.
2726static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2727 ArgStringList &CmdArgs) {
2728 // When using -verify-pch, we don't want to provide the type
2729 // 'precompiled-header' if it was inferred from the file extension
2730 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2731 return;
2732
2733 CmdArgs.push_back("-x");
2734 if (Args.hasArg(options::OPT_rewrite_objc))
2735 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2736 else
2737 CmdArgs.push_back(types::getTypeName(Input.getType()));
2738}
2739
David Majnemerc371ff02015-03-22 08:39:22 +00002740static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002741 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002742 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002743
2744 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002745 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002746
2747 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002748 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002749 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002750 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002751}
2752
Rafael Espindola577637a2015-01-03 00:06:04 +00002753// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002754// options that build systems might add but are unused when assembling or only
2755// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002756static void claimNoWarnArgs(const ArgList &Args) {
2757 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002758 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002759 Args.ClaimAllArgs(options::OPT_flto);
2760 Args.ClaimAllArgs(options::OPT_fno_lto);
2761}
2762
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002763static void appendUserToPath(SmallVectorImpl<char> &Result) {
2764#ifdef LLVM_ON_UNIX
2765 const char *Username = getenv("LOGNAME");
2766#else
2767 const char *Username = getenv("USERNAME");
2768#endif
2769 if (Username) {
2770 // Validate that LoginName can be used in a path, and get its length.
2771 size_t Len = 0;
2772 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002773 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002774 Username = nullptr;
2775 break;
2776 }
2777 }
2778
2779 if (Username && Len > 0) {
2780 Result.append(Username, Username + Len);
2781 return;
2782 }
2783 }
2784
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002785// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002786#ifdef LLVM_ON_UNIX
2787 std::string UID = llvm::utostr(getuid());
2788#else
2789 // FIXME: Windows seems to have an 'SID' that might work.
2790 std::string UID = "9999";
2791#endif
2792 Result.append(UID.begin(), UID.end());
2793}
2794
David Majnemere11d3732015-06-08 00:22:46 +00002795VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2796 const llvm::Triple &Triple,
2797 const llvm::opt::ArgList &Args,
2798 bool IsWindowsMSVC) {
2799 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2800 IsWindowsMSVC) ||
2801 Args.hasArg(options::OPT_fmsc_version) ||
2802 Args.hasArg(options::OPT_fms_compatibility_version)) {
2803 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2804 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002805 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002806
2807 if (MSCVersion && MSCompatibilityVersion) {
2808 if (D)
2809 D->Diag(diag::err_drv_argument_not_allowed_with)
2810 << MSCVersion->getAsString(Args)
2811 << MSCompatibilityVersion->getAsString(Args);
2812 return VersionTuple();
2813 }
2814
2815 if (MSCompatibilityVersion) {
2816 VersionTuple MSVT;
2817 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2818 D->Diag(diag::err_drv_invalid_value)
2819 << MSCompatibilityVersion->getAsString(Args)
2820 << MSCompatibilityVersion->getValue();
2821 return MSVT;
2822 }
2823
2824 if (MSCVersion) {
2825 unsigned Version = 0;
2826 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2827 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2828 << MSCVersion->getValue();
2829 return getMSCompatibilityVersion(Version);
2830 }
2831
2832 unsigned Major, Minor, Micro;
2833 Triple.getEnvironmentVersion(Major, Minor, Micro);
2834 if (Major || Minor || Micro)
2835 return VersionTuple(Major, Minor, Micro);
2836
2837 return VersionTuple(18);
2838 }
2839 return VersionTuple();
2840}
2841
Diego Novilloa0545962015-07-10 18:00:07 +00002842static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2843 const InputInfo &Output, const ArgList &Args,
2844 ArgStringList &CmdArgs) {
2845 auto *ProfileGenerateArg = Args.getLastArg(
2846 options::OPT_fprofile_instr_generate,
2847 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00002848 options::OPT_fprofile_generate_EQ,
2849 options::OPT_fno_profile_instr_generate);
2850 if (ProfileGenerateArg &&
2851 ProfileGenerateArg->getOption().matches(
2852 options::OPT_fno_profile_instr_generate))
2853 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002854
2855 auto *ProfileUseArg = Args.getLastArg(
2856 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00002857 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2858 options::OPT_fno_profile_instr_use);
2859 if (ProfileUseArg &&
2860 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2861 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002862
2863 if (ProfileGenerateArg && ProfileUseArg)
2864 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00002865 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00002866
Diego Novillo758f3f52015-08-05 21:49:51 +00002867 if (ProfileGenerateArg) {
2868 if (ProfileGenerateArg->getOption().matches(
2869 options::OPT_fprofile_instr_generate_EQ))
2870 ProfileGenerateArg->render(Args, CmdArgs);
2871 else if (ProfileGenerateArg->getOption().matches(
2872 options::OPT_fprofile_generate_EQ)) {
2873 SmallString<128> Path(ProfileGenerateArg->getValue());
2874 llvm::sys::path::append(Path, "default.profraw");
2875 CmdArgs.push_back(
2876 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
2877 } else
2878 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2879 }
Diego Novilloa0545962015-07-10 18:00:07 +00002880
Diego Novillo758f3f52015-08-05 21:49:51 +00002881 if (ProfileUseArg) {
2882 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
2883 ProfileUseArg->render(Args, CmdArgs);
2884 else if ((ProfileUseArg->getOption().matches(
2885 options::OPT_fprofile_use_EQ) ||
2886 ProfileUseArg->getOption().matches(
2887 options::OPT_fprofile_instr_use))) {
2888 SmallString<128> Path(
2889 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
2890 if (Path.empty() || llvm::sys::fs::is_directory(Path))
2891 llvm::sys::path::append(Path, "default.profdata");
2892 CmdArgs.push_back(
2893 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
2894 }
Diego Novilloa0545962015-07-10 18:00:07 +00002895 }
2896
2897 if (Args.hasArg(options::OPT_ftest_coverage) ||
2898 Args.hasArg(options::OPT_coverage))
2899 CmdArgs.push_back("-femit-coverage-notes");
2900 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2901 false) ||
2902 Args.hasArg(options::OPT_coverage))
2903 CmdArgs.push_back("-femit-coverage-data");
2904
Diego Novilloc4b94da2015-08-05 23:27:40 +00002905 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2906 options::OPT_fno_coverage_mapping, false) &&
2907 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00002908 D.Diag(diag::err_drv_argument_only_allowed_with)
2909 << "-fcoverage-mapping"
2910 << "-fprofile-instr-generate";
2911
Diego Novilloc4b94da2015-08-05 23:27:40 +00002912 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2913 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00002914 CmdArgs.push_back("-fcoverage-mapping");
2915
2916 if (C.getArgs().hasArg(options::OPT_c) ||
2917 C.getArgs().hasArg(options::OPT_S)) {
2918 if (Output.isFilename()) {
2919 CmdArgs.push_back("-coverage-file");
2920 SmallString<128> CoverageFilename;
2921 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
2922 CoverageFilename = FinalOutput->getValue();
2923 } else {
2924 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
2925 }
2926 if (llvm::sys::path::is_relative(CoverageFilename)) {
2927 SmallString<128> Pwd;
2928 if (!llvm::sys::fs::current_path(Pwd)) {
2929 llvm::sys::path::append(Pwd, CoverageFilename);
2930 CoverageFilename.swap(Pwd);
2931 }
2932 }
2933 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
2934 }
2935 }
2936}
2937
James Y Knight5bdf7ab2015-08-19 15:12:02 +00002938/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
2939/// smooshes them together with platform defaults, to decide whether
2940/// this compile should be using PIC mode or not. Returns a tuple of
2941/// (RelocationModel, PICLevel, IsPIE).
2942static std::tuple<llvm::Reloc::Model, unsigned, bool>
2943ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
2944 const ArgList &Args) {
2945 // FIXME: why does this code...and so much everywhere else, use both
2946 // ToolChain.getTriple() and Triple?
2947 bool PIE = ToolChain.isPIEDefault();
2948 bool PIC = PIE || ToolChain.isPICDefault();
2949 bool IsPICLevelTwo = PIC;
2950
2951 bool KernelOrKext =
2952 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
2953
2954 // Android-specific defaults for PIC/PIE
2955 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
2956 switch (ToolChain.getArch()) {
2957 case llvm::Triple::arm:
2958 case llvm::Triple::armeb:
2959 case llvm::Triple::thumb:
2960 case llvm::Triple::thumbeb:
2961 case llvm::Triple::aarch64:
2962 case llvm::Triple::mips:
2963 case llvm::Triple::mipsel:
2964 case llvm::Triple::mips64:
2965 case llvm::Triple::mips64el:
2966 PIC = true; // "-fpic"
2967 break;
2968
2969 case llvm::Triple::x86:
2970 case llvm::Triple::x86_64:
2971 PIC = true; // "-fPIC"
2972 IsPICLevelTwo = true;
2973 break;
2974
2975 default:
2976 break;
2977 }
2978 }
2979
2980 // OpenBSD-specific defaults for PIE
2981 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
2982 switch (ToolChain.getArch()) {
2983 case llvm::Triple::mips64:
2984 case llvm::Triple::mips64el:
2985 case llvm::Triple::sparcel:
2986 case llvm::Triple::x86:
2987 case llvm::Triple::x86_64:
2988 IsPICLevelTwo = false; // "-fpie"
2989 break;
2990
2991 case llvm::Triple::ppc:
2992 case llvm::Triple::sparc:
2993 case llvm::Triple::sparcv9:
2994 IsPICLevelTwo = true; // "-fPIE"
2995 break;
2996
2997 default:
2998 break;
2999 }
3000 }
3001
3002 // The last argument relating to either PIC or PIE wins, and no
3003 // other argument is used. If the last argument is any flavor of the
3004 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3005 // option implicitly enables PIC at the same level.
3006 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3007 options::OPT_fpic, options::OPT_fno_pic,
3008 options::OPT_fPIE, options::OPT_fno_PIE,
3009 options::OPT_fpie, options::OPT_fno_pie);
3010 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3011 // is forced, then neither PIC nor PIE flags will have no effect.
3012 if (!ToolChain.isPICDefaultForced()) {
3013 if (LastPICArg) {
3014 Option O = LastPICArg->getOption();
3015 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3016 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3017 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3018 PIC =
3019 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3020 IsPICLevelTwo =
3021 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3022 } else {
3023 PIE = PIC = false;
3024 }
3025 }
3026 }
3027
3028 // Introduce a Darwin-specific hack. If the default is PIC, but the
3029 // PIC level would've been set to level 1, force it back to level 2
3030 // PIC instead. This matches the behavior of Darwin GCC (based on
3031 // chandlerc's informal testing in 2012).
3032 if (PIC && ToolChain.getTriple().isOSDarwin())
3033 IsPICLevelTwo |= ToolChain.isPICDefault();
3034
James Y Knightc4015d32015-08-21 04:14:55 +00003035 // This kernel flags are a trump-card: they will disable PIC/PIE
3036 // generation, independent of the argument order.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003037 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
3038 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003039
3040 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3041 // This is a very special mode. It trumps the other modes, almost no one
3042 // uses it, and it isn't even valid on any OS but Darwin.
3043 if (!ToolChain.getTriple().isOSDarwin())
3044 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3045 << A->getSpelling() << ToolChain.getTriple().str();
3046
3047 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3048
3049 // Only a forced PIC mode can cause the actual compile to have PIC defines
3050 // etc., no flags are sufficient. This behavior was selected to closely
3051 // match that of llvm-gcc and Apple GCC before that.
3052 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3053
3054 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3055 }
3056
3057 if (PIC)
3058 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3059
3060 return std::make_tuple(llvm::Reloc::Static, 0, false);
3061}
3062
3063static const char *RelocationModelName(llvm::Reloc::Model Model) {
3064 switch (Model) {
3065 case llvm::Reloc::Default:
3066 return nullptr;
3067 case llvm::Reloc::Static:
3068 return "static";
3069 case llvm::Reloc::PIC_:
3070 return "pic";
3071 case llvm::Reloc::DynamicNoPIC:
3072 return "dynamic-no-pic";
3073 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003074 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003075}
3076
3077static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3078 ArgStringList &CmdArgs) {
3079 llvm::Reloc::Model RelocationModel;
3080 unsigned PICLevel;
3081 bool IsPIE;
3082 std::tie(RelocationModel, PICLevel, IsPIE) =
3083 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3084
3085 if (RelocationModel != llvm::Reloc::Static)
3086 CmdArgs.push_back("-KPIC");
3087}
3088
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003089void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003090 const InputInfo &Output, const InputInfoList &Inputs,
3091 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003092 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3093 const llvm::Triple Triple(TripleStr);
3094
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003095 bool KernelOrKext =
3096 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003097 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003098 ArgStringList CmdArgs;
3099
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003100 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003101 bool IsWindowsCygnus =
3102 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003103 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
3104
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003105 // Check number of inputs for sanity. We need at least one input.
3106 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003107 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003108 // CUDA compilation may have multiple inputs (source file + results of
3109 // device-side compilations). All other jobs are expected to have exactly one
3110 // input.
3111 bool IsCuda = types::isCuda(Input.getType());
3112 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003113
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003114 // Invoke ourselves in -cc1 mode.
3115 //
3116 // FIXME: Implement custom jobs for internal actions.
3117 CmdArgs.push_back("-cc1");
3118
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003119 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003120 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003121 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003122
James Y Knight2db38f32015-08-15 03:45:25 +00003123 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3124 Triple.getArch() == llvm::Triple::thumb)) {
3125 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003126 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003127 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003128 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003129 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003130 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003131 }
3132
Tim Northover336f1892014-03-29 13:16:12 +00003133 // Push all default warning arguments that are specific to
3134 // the given target. These come before user provided warning options
3135 // are provided.
3136 getToolChain().addClangWarningOptions(CmdArgs);
3137
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003138 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003139 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003140
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003141 if (isa<AnalyzeJobAction>(JA)) {
3142 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3143 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003144 } else if (isa<MigrateJobAction>(JA)) {
3145 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003146 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003147 if (Output.getType() == types::TY_Dependencies)
3148 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003149 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003150 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003151 if (Args.hasArg(options::OPT_rewrite_objc) &&
3152 !Args.hasArg(options::OPT_g_Group))
3153 CmdArgs.push_back("-P");
3154 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003155 } else if (isa<AssembleJobAction>(JA)) {
3156 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003157
David Blaikie9260ed62013-07-25 21:19:01 +00003158 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003159
3160 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003161 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003162 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003163 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003164 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003165
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003166 if (JA.getType() == types::TY_Nothing)
3167 CmdArgs.push_back("-fsyntax-only");
3168 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003169 CmdArgs.push_back("-emit-pch");
3170 else
3171 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003172 } else if (isa<VerifyPCHJobAction>(JA)) {
3173 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003174 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003175 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3176 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003177
Renato Golin7c542b42015-07-27 23:44:45 +00003178 if (JA.getType() == types::TY_LTO_IR || JA.getType() == types::TY_LTO_BC) {
Teresa Johnson8749d8042015-07-06 16:23:00 +00003179 CmdArgs.push_back("-flto");
3180 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003181 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003182 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003183 } else if (JA.getType() == types::TY_LLVM_IR ||
3184 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003185 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003186 } else if (JA.getType() == types::TY_LLVM_BC ||
3187 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003188 CmdArgs.push_back("-emit-llvm-bc");
3189 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003190 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003191 } else if (JA.getType() == types::TY_AST) {
3192 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003193 } else if (JA.getType() == types::TY_ModuleFile) {
3194 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003195 } else if (JA.getType() == types::TY_RewrittenObjC) {
3196 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003197 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003198 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3199 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003200 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003201 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003202 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003203 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003204
3205 // Preserve use-list order by default when emitting bitcode, so that
3206 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3207 // same result as running passes here. For LTO, we don't need to preserve
3208 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003209 if (JA.getType() == types::TY_LLVM_BC)
3210 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003211 }
3212
Justin Bognera88f0122014-06-20 22:59:50 +00003213 // We normally speed up the clang process a bit by skipping destructors at
3214 // exit, but when we're generating diagnostics we can rely on some of the
3215 // cleanup.
3216 if (!C.isForDiagnostics())
3217 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003218
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003219// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003220#ifdef NDEBUG
3221 CmdArgs.push_back("-disable-llvm-verifier");
3222#endif
3223
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003224 // Set the main file name, so that debug info works even with
3225 // -save-temps.
3226 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003227 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003228
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003229 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003230 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003231 if (Args.hasArg(options::OPT_static))
3232 CmdArgs.push_back("-static-define");
3233
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003234 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003235 // Enable region store model by default.
3236 CmdArgs.push_back("-analyzer-store=region");
3237
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003238 // Treat blocks as analysis entry points.
3239 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3240
Ted Kremenek49c79792011-03-24 00:28:47 +00003241 CmdArgs.push_back("-analyzer-eagerly-assume");
3242
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003243 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003244 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003245 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003246
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003247 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003248 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003249
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003250 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003251 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003252
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003253 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003254
Artem Belevichba558952015-05-06 18:20:23 +00003255 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003256 CmdArgs.push_back("-analyzer-checker=cplusplus");
3257
Nico Webere8e53112014-05-11 01:04:02 +00003258 // Enable the following experimental checkers for testing.
3259 CmdArgs.push_back(
3260 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003261 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3262 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003263 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003264 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3265 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003266 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003267
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003268 // Set the output format. The default is plist, for (lame) historical
3269 // reasons.
3270 CmdArgs.push_back("-analyzer-output");
3271 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003272 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003273 else
3274 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003275
Ted Kremenekfe449a22010-03-22 22:32:05 +00003276 // Disable the presentation of standard compiler warnings when
3277 // using --analyze. We only want to show static analyzer diagnostics
3278 // or frontend errors.
3279 CmdArgs.push_back("-w");
3280
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003281 // Add -Xanalyzer arguments when running as analyzer.
3282 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003283 }
3284
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003285 CheckCodeGenerationOptions(D, Args);
3286
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003287 llvm::Reloc::Model RelocationModel;
3288 unsigned PICLevel;
3289 bool IsPIE;
3290 std::tie(RelocationModel, PICLevel, IsPIE) =
3291 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003292
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003293 const char *RMName = RelocationModelName(RelocationModel);
3294 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003295 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003296 CmdArgs.push_back(RMName);
3297 }
3298 if (PICLevel > 0) {
3299 CmdArgs.push_back("-pic-level");
3300 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3301 if (IsPIE) {
3302 CmdArgs.push_back("-pie-level");
3303 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003304 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003305 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003306
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003307 CmdArgs.push_back("-mthread-model");
3308 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3309 CmdArgs.push_back(A->getValue());
3310 else
3311 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3312
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003313 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3314
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003315 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3316 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003317 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003318
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003319 // LLVM Code Generator Options.
3320
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003321 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3322 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003323 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3324 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003325 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003326 CmdArgs.push_back(A->getValue());
3327 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003328 }
3329 }
3330
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003331 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3332 StringRef v = A->getValue();
3333 CmdArgs.push_back("-mllvm");
3334 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3335 A->claim();
3336 }
3337
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003338 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3339 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003340 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003341 }
3342
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003343 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3344 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003345 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003346 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003347 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003348 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3349 CmdArgs.push_back("-fpcc-struct-return");
3350 } else {
3351 assert(A->getOption().matches(options::OPT_freg_struct_return));
3352 CmdArgs.push_back("-freg-struct-return");
3353 }
3354 }
3355
Roman Divacky65b88cd2011-03-01 17:40:53 +00003356 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3357 CmdArgs.push_back("-mrtd");
3358
Rafael Espindola224dd632011-12-14 21:02:23 +00003359 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003360 CmdArgs.push_back("-mdisable-fp-elim");
3361 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3362 options::OPT_fno_zero_initialized_in_bss))
3363 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003364
3365 bool OFastEnabled = isOptimizationLevelFast(Args);
3366 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3367 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003368 OptSpecifier StrictAliasingAliasOption =
3369 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003370 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3371 // doesn't do any TBAA.
3372 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003373 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003374 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003375 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003376 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3377 options::OPT_fno_struct_path_tbaa))
3378 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003379 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3380 false))
3381 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003382 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3383 options::OPT_fno_optimize_sibling_calls))
3384 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003385
Eric Christopher006208c2013-04-04 06:29:47 +00003386 // Handle segmented stacks.
3387 if (Args.hasArg(options::OPT_fsplit_stack))
3388 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003389
3390 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3391 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003392 OptSpecifier FastMathAliasOption =
3393 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3394
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003395 // Handle various floating point optimization flags, mapping them to the
3396 // appropriate LLVM code generation flags. The pattern for all of these is to
3397 // default off the codegen optimizations, and if any flag enables them and no
3398 // flag disables them after the flag enabling them, enable the codegen
3399 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003400 if (Arg *A = Args.getLastArg(
3401 options::OPT_ffast_math, FastMathAliasOption,
3402 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3403 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3404 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003405 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3406 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003407 A->getOption().getID() != options::OPT_fhonor_infinities)
3408 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003409 if (Arg *A = Args.getLastArg(
3410 options::OPT_ffast_math, FastMathAliasOption,
3411 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3412 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3413 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003414 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3415 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003416 A->getOption().getID() != options::OPT_fhonor_nans)
3417 CmdArgs.push_back("-menable-no-nans");
3418
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003419 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3420 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003421 if (Arg *A =
3422 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3423 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3424 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003425 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3426 // However, turning *off* -ffast_math merely restores the toolchain default
3427 // (which may be false).
3428 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3429 A->getOption().getID() == options::OPT_ffast_math ||
3430 A->getOption().getID() == options::OPT_Ofast)
3431 MathErrno = false;
3432 else if (A->getOption().getID() == options::OPT_fmath_errno)
3433 MathErrno = true;
3434 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003435 if (MathErrno)
3436 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003437
3438 // There are several flags which require disabling very specific
3439 // optimizations. Any of these being disabled forces us to turn off the
3440 // entire set of LLVM optimizations, so collect them through all the flag
3441 // madness.
3442 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003443 if (Arg *A = Args.getLastArg(
3444 options::OPT_ffast_math, FastMathAliasOption,
3445 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3446 options::OPT_fno_unsafe_math_optimizations,
3447 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003448 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3449 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003450 A->getOption().getID() != options::OPT_fno_associative_math)
3451 AssociativeMath = true;
3452 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003453 if (Arg *A = Args.getLastArg(
3454 options::OPT_ffast_math, FastMathAliasOption,
3455 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3456 options::OPT_fno_unsafe_math_optimizations,
3457 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003458 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3459 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003460 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3461 ReciprocalMath = true;
3462 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003463 if (Arg *A = Args.getLastArg(
3464 options::OPT_ffast_math, FastMathAliasOption,
3465 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3466 options::OPT_fno_unsafe_math_optimizations,
3467 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003468 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3469 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003470 A->getOption().getID() != options::OPT_fsigned_zeros)
3471 SignedZeros = false;
3472 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003473 if (Arg *A = Args.getLastArg(
3474 options::OPT_ffast_math, FastMathAliasOption,
3475 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3476 options::OPT_fno_unsafe_math_optimizations,
3477 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003478 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3479 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003480 A->getOption().getID() != options::OPT_ftrapping_math)
3481 TrappingMath = false;
3482 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3483 !TrappingMath)
3484 CmdArgs.push_back("-menable-unsafe-fp-math");
3485
Sanjay Patel76c9e092015-01-23 16:40:50 +00003486 if (!SignedZeros)
3487 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003488
Sanjay Patel359b1052015-04-09 15:03:23 +00003489 if (ReciprocalMath)
3490 CmdArgs.push_back("-freciprocal-math");
3491
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003492 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003493 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003494 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003495 options::OPT_ffp_contract)) {
3496 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003497 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003498 if (Val == "fast" || Val == "on" || Val == "off") {
3499 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3500 } else {
3501 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003502 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003503 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003504 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3505 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003506 // If fast-math is set then set the fp-contract mode to fast.
3507 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3508 }
3509 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003510
Sanjay Patel2987c292015-06-11 14:53:41 +00003511 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003512
Bob Wilson6a039162012-07-19 03:52:53 +00003513 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3514 // and if we find them, tell the frontend to provide the appropriate
3515 // preprocessor macros. This is distinct from enabling any optimizations as
3516 // these options induce language changes which must survive serialization
3517 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003518 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3519 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003520 if (!A->getOption().matches(options::OPT_fno_fast_math))
3521 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003522 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3523 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003524 if (A->getOption().matches(options::OPT_ffinite_math_only))
3525 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003526
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003527 // Decide whether to use verbose asm. Verbose assembly is the default on
3528 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003529 bool IsIntegratedAssemblerDefault =
3530 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003531 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003532 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003533 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003534 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003535
Rafael Espindolab8a12932015-05-22 20:44:03 +00003536 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3537 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003538 CmdArgs.push_back("-no-integrated-as");
3539
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003540 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3541 CmdArgs.push_back("-mdebug-pass");
3542 CmdArgs.push_back("Structure");
3543 }
3544 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3545 CmdArgs.push_back("-mdebug-pass");
3546 CmdArgs.push_back("Arguments");
3547 }
3548
John McCall8517abc2010-02-19 02:45:38 +00003549 // Enable -mconstructor-aliases except on darwin, where we have to
3550 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003551 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003552 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003553
John McCall7ef5cb32011-03-18 02:56:14 +00003554 // Darwin's kernel doesn't support guard variables; just die if we
3555 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003556 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003557 CmdArgs.push_back("-fforbid-guard-variables");
3558
Douglas Gregordbe39272011-02-01 15:15:22 +00003559 if (Args.hasArg(options::OPT_mms_bitfields)) {
3560 CmdArgs.push_back("-mms-bitfields");
3561 }
John McCall8517abc2010-02-19 02:45:38 +00003562
Daniel Dunbar306945d2009-09-16 06:17:29 +00003563 // This is a coarse approximation of what llvm-gcc actually does, both
3564 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3565 // complicated ways.
3566 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003567 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3568 options::OPT_fno_asynchronous_unwind_tables,
3569 (getToolChain().IsUnwindTablesDefault() ||
3570 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3571 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003572 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3573 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003574 CmdArgs.push_back("-munwind-tables");
3575
Chandler Carruth05fb5852012-11-21 23:40:23 +00003576 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003577
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003578 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3579 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003580 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003581 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003582
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003583 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003584 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003585
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003586 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003587 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003588 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003589 }
3590
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003591 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003592 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003593 if (!CPU.empty()) {
3594 CmdArgs.push_back("-target-cpu");
3595 CmdArgs.push_back(Args.MakeArgString(CPU));
3596 }
3597
Rafael Espindolaeb265472013-08-21 21:59:03 +00003598 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3599 CmdArgs.push_back("-mfpmath");
3600 CmdArgs.push_back(A->getValue());
3601 }
3602
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003603 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003604 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003605
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003606 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003607 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003608 default:
3609 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003610
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003611 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003612 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003613 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003614 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003615 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003616 break;
3617
Tim Northover573cbee2014-05-24 12:52:07 +00003618 case llvm::Triple::aarch64:
3619 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003620 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003621 break;
3622
Eric Christopher0b26a612010-03-02 02:41:08 +00003623 case llvm::Triple::mips:
3624 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003625 case llvm::Triple::mips64:
3626 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003627 AddMIPSTargetArgs(Args, CmdArgs);
3628 break;
3629
Ulrich Weigand8afad612014-07-28 13:17:52 +00003630 case llvm::Triple::ppc:
3631 case llvm::Triple::ppc64:
3632 case llvm::Triple::ppc64le:
3633 AddPPCTargetArgs(Args, CmdArgs);
3634 break;
3635
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003636 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003637 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003638 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003639 AddSparcTargetArgs(Args, CmdArgs);
3640 break;
3641
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003642 case llvm::Triple::x86:
3643 case llvm::Triple::x86_64:
3644 AddX86TargetArgs(Args, CmdArgs);
3645 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003646
3647 case llvm::Triple::hexagon:
3648 AddHexagonTargetArgs(Args, CmdArgs);
3649 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003650 }
3651
Hans Wennborg75958c42013-08-08 00:17:41 +00003652 // Add clang-cl arguments.
3653 if (getToolChain().getDriver().IsCLMode())
3654 AddClangCLArgs(Args, CmdArgs);
3655
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003656 // Pass the linker version in use.
3657 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3658 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003659 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003660 }
3661
Eric Christopherb7d97e92013-04-03 01:58:53 +00003662 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003663 CmdArgs.push_back("-momit-leaf-frame-pointer");
3664
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003665 // Explicitly error on some things we know we don't support and can't just
3666 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003667 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003668 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3669 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003670 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003671 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003672 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3673 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003674 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003675 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003676 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003677 }
3678
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003679 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003680 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003681 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003682 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003683 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3684 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003685 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003686 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003687 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003688
Chad Rosierbe10f982011-08-02 17:58:04 +00003689 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003690 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003691 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3692 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003693 }
3694
Manman Ren17bdb0f2013-11-20 20:22:14 +00003695 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3696 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003697 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003698 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003699 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikiece3e7a62015-07-30 21:42:22 +00003700 if ((A->getOption().matches(options::OPT_gline_tables_only) ||
3701 A->getOption().matches(options::OPT_g1)) &&
3702 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003703 // FIXME: we should support specifying dwarf version with
3704 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003705 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003706 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003707 const llvm::Triple &Triple = getToolChain().getTriple();
3708 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003709 Triple.getOS() == llvm::Triple::FreeBSD ||
3710 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003711 CmdArgs.push_back("-gdwarf-2");
David Blaikiece3e7a62015-07-30 21:42:22 +00003712 SplitDwarfArg = nullptr;
Manman Ren17bdb0f2013-11-20 20:22:14 +00003713 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003714 CmdArgs.push_back("-gdwarf-2");
3715 else if (A->getOption().matches(options::OPT_gdwarf_3))
3716 CmdArgs.push_back("-gdwarf-3");
3717 else if (A->getOption().matches(options::OPT_gdwarf_4))
3718 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003719 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003720 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003721 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003722 const llvm::Triple &Triple = getToolChain().getTriple();
3723 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003724 Triple.getOS() == llvm::Triple::FreeBSD ||
3725 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003726 CmdArgs.push_back("-gdwarf-2");
3727 else
3728 CmdArgs.push_back("-g");
3729 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003730 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003731
Reid Kleckner124955a2015-08-05 18:51:13 +00003732 // Forward -gcodeview.
3733 Args.AddLastArg(CmdArgs, options::OPT_gcodeview);
3734
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003735 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3736 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003737 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3738 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003739 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003740
Eric Christopher138c32b2013-09-13 22:37:55 +00003741 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003742 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3743 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003744 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003745 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003746 CmdArgs.push_back("-g");
3747 CmdArgs.push_back("-backend-option");
3748 CmdArgs.push_back("-split-dwarf=Enable");
3749 }
3750
Eric Christopher138c32b2013-09-13 22:37:55 +00003751 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3752 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3753 CmdArgs.push_back("-backend-option");
3754 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3755 }
Eric Christophereec89c22013-06-18 00:03:50 +00003756
Eric Christopher0d403d22014-02-14 01:27:03 +00003757 // -gdwarf-aranges turns on the emission of the aranges section in the
3758 // backend.
3759 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3760 CmdArgs.push_back("-backend-option");
3761 CmdArgs.push_back("-generate-arange-section");
3762 }
3763
David Blaikief36d9ba2014-01-27 18:52:43 +00003764 if (Args.hasFlag(options::OPT_fdebug_types_section,
3765 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003766 CmdArgs.push_back("-backend-option");
3767 CmdArgs.push_back("-generate-type-units");
3768 }
Eric Christophereec89c22013-06-18 00:03:50 +00003769
Ed Schouten6e576152015-03-26 17:50:28 +00003770 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3771 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3772
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003773 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003774 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003775 CmdArgs.push_back("-ffunction-sections");
3776 }
3777
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003778 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3779 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003780 CmdArgs.push_back("-fdata-sections");
3781 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003782
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003783 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003784 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003785 CmdArgs.push_back("-fno-unique-section-names");
3786
Chris Lattner3c77a352010-06-22 00:03:40 +00003787 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3788
Diego Novilloa0545962015-07-10 18:00:07 +00003789 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003790
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003791 // Pass options for controlling the default header search paths.
3792 if (Args.hasArg(options::OPT_nostdinc)) {
3793 CmdArgs.push_back("-nostdsysteminc");
3794 CmdArgs.push_back("-nobuiltininc");
3795 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003796 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003797 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003798 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3799 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3800 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003801
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003802 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003803 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003804 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003805
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003806 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3807
Ted Kremenekf7639e12012-03-06 20:06:33 +00003808 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003809 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003810 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003811 options::OPT_ccc_arcmt_modify,
3812 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003813 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003814 switch (A->getOption().getID()) {
3815 default:
3816 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003817 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003818 CmdArgs.push_back("-arcmt-check");
3819 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003820 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003821 CmdArgs.push_back("-arcmt-modify");
3822 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003823 case options::OPT_ccc_arcmt_migrate:
3824 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003825 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003826 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003827
3828 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3829 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003830 break;
John McCalld70fb982011-06-15 23:25:17 +00003831 }
3832 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003833 } else {
3834 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3835 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3836 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003837 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003838
Ted Kremenekf7639e12012-03-06 20:06:33 +00003839 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3840 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003841 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3842 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003843 }
3844 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003845 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003846
3847 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003848 options::OPT_objcmt_migrate_subscripting,
3849 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003850 // None specified, means enable them all.
3851 CmdArgs.push_back("-objcmt-migrate-literals");
3852 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003853 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003854 } else {
3855 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3856 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003857 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003858 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003859 } else {
3860 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3861 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3862 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3863 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3864 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3865 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003866 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003867 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3868 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3869 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3870 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3871 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3872 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3873 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003874 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003875 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003876 }
3877
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003878 // Add preprocessing options like -I, -D, etc. if we are using the
3879 // preprocessor.
3880 //
3881 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003882 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003883 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003884
Rafael Espindolaa7431922011-07-21 23:40:37 +00003885 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3886 // that "The compiler can only warn and ignore the option if not recognized".
3887 // When building with ccache, it will pass -D options to clang even on
3888 // preprocessed inputs and configure concludes that -fPIC is not supported.
3889 Args.ClaimAllArgs(options::OPT_D);
3890
Alp Toker7874bdc2013-11-15 20:40:58 +00003891 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003892 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3893 if (A->getOption().matches(options::OPT_O4)) {
3894 CmdArgs.push_back("-O3");
3895 D.Diag(diag::warn_O4_is_O3);
3896 } else {
3897 A->render(Args, CmdArgs);
3898 }
3899 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003900
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003901 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003902 for (const Arg *A :
3903 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3904 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00003905 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003906 }
3907
Rafael Espindola577637a2015-01-03 00:06:04 +00003908 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003909
Richard Smith3be1cb22014-08-07 00:24:21 +00003910 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003911 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003912 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3913 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003914 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003915 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003916
3917 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003918 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003919 //
3920 // If a std is supplied, only add -trigraphs if it follows the
3921 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003922 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003923 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3924 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003925 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003926 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003927 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003928 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003929 else
3930 Std->render(Args, CmdArgs);
3931
Nico Weber00721502014-12-23 22:32:37 +00003932 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003933 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003934 options::OPT_ftrigraphs,
3935 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003936 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003937 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003938 } else {
3939 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003940 //
3941 // FIXME: Clang doesn't correctly handle -std= when the input language
3942 // doesn't match. For the time being just ignore this for C++ inputs;
3943 // eventually we want to do all the standard defaulting here instead of
3944 // splitting it between the driver and clang -cc1.
3945 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003946 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
3947 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003948 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00003949 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00003950
Nico Weber00721502014-12-23 22:32:37 +00003951 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3952 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003953 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003954
Richard Smith282b4492013-09-04 22:50:31 +00003955 // GCC's behavior for -Wwrite-strings is a bit strange:
3956 // * In C, this "warning flag" changes the types of string literals from
3957 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3958 // for the discarded qualifier.
3959 // * In C++, this is just a normal warning flag.
3960 //
3961 // Implementing this warning correctly in C is hard, so we follow GCC's
3962 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3963 // a non-const char* in C, rather than using this crude hack.
3964 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003965 // FIXME: This should behave just like a warning flag, and thus should also
3966 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3967 Arg *WriteStrings =
3968 Args.getLastArg(options::OPT_Wwrite_strings,
3969 options::OPT_Wno_write_strings, options::OPT_w);
3970 if (WriteStrings &&
3971 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003972 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003973 }
3974
Chandler Carruth61fbf622011-04-23 09:27:53 +00003975 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003976 // during C++ compilation, which it is by default. GCC keeps this define even
3977 // in the presence of '-w', match this behavior bug-for-bug.
3978 if (types::isCXX(InputType) &&
3979 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3980 true)) {
3981 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003982 }
3983
Chandler Carruthe0391482010-05-22 02:21:53 +00003984 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3985 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3986 if (Asm->getOption().matches(options::OPT_fasm))
3987 CmdArgs.push_back("-fgnu-keywords");
3988 else
3989 CmdArgs.push_back("-fno-gnu-keywords");
3990 }
3991
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003992 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3993 CmdArgs.push_back("-fno-dwarf-directory-asm");
3994
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003995 if (ShouldDisableAutolink(Args, getToolChain()))
3996 CmdArgs.push_back("-fno-autolink");
3997
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003998 // Add in -fdebug-compilation-dir if necessary.
3999 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004000
Richard Smith9a568822011-11-21 19:36:32 +00004001 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4002 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004003 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004004 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004005 }
4006
Richard Smith79c927b2013-11-06 19:31:51 +00004007 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4008 CmdArgs.push_back("-foperator-arrow-depth");
4009 CmdArgs.push_back(A->getValue());
4010 }
4011
Richard Smith9a568822011-11-21 19:36:32 +00004012 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4013 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004014 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004015 }
4016
Richard Smitha3d3bd22013-05-08 02:12:03 +00004017 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4018 CmdArgs.push_back("-fconstexpr-steps");
4019 CmdArgs.push_back(A->getValue());
4020 }
4021
Richard Smithb3a14522013-02-22 01:59:51 +00004022 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4023 CmdArgs.push_back("-fbracket-depth");
4024 CmdArgs.push_back(A->getValue());
4025 }
4026
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004027 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4028 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004029 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004030 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004031 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4032 } else
4033 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004034 }
4035
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004036 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004037 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004038
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004039 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4040 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004041 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004042 }
David Chisnall5778fce2009-08-31 16:41:57 +00004043
Chris Lattnere23003d2010-01-09 21:54:33 +00004044 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4045 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004046 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004047 }
4048
Chris Lattnerb35583d2010-04-07 20:49:23 +00004049 CmdArgs.push_back("-ferror-limit");
4050 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004051 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004052 else
4053 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004054
Chandler Carrutha77a7272010-05-06 04:55:18 +00004055 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4056 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004057 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004058 }
4059
4060 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4061 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004062 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004063 }
4064
Richard Smithf6f003a2011-12-16 19:06:07 +00004065 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4066 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004067 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004068 }
4069
Nick Lewycky24653262014-12-16 21:39:02 +00004070 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4071 CmdArgs.push_back("-fspell-checking-limit");
4072 CmdArgs.push_back(A->getValue());
4073 }
4074
Daniel Dunbar2c978472009-11-04 06:24:47 +00004075 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004076 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004077 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004078 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004079 } else {
4080 // If -fmessage-length=N was not specified, determine whether this is a
4081 // terminal and, if so, implicitly define -fmessage-length appropriately.
4082 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004083 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004084 }
4085
John McCallb4a99d32013-02-19 01:57:35 +00004086 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4087 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4088 options::OPT_fvisibility_ms_compat)) {
4089 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4090 CmdArgs.push_back("-fvisibility");
4091 CmdArgs.push_back(A->getValue());
4092 } else {
4093 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4094 CmdArgs.push_back("-fvisibility");
4095 CmdArgs.push_back("hidden");
4096 CmdArgs.push_back("-ftype-visibility");
4097 CmdArgs.push_back("default");
4098 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004099 }
4100
Douglas Gregor08329632010-06-15 17:05:35 +00004101 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004102
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004103 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4104
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004105 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004106 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4107 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004108 CmdArgs.push_back("-ffreestanding");
4109
Daniel Dunbare357d562009-12-03 18:42:11 +00004110 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004111 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004112 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00004113 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
4114 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00004115 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004116 // Emulated TLS is enabled by default on Android, and can be enabled manually
4117 // with -femulated-tls.
4118 bool EmulatedTLSDefault = Triple.getEnvironment() == llvm::Triple::Android;
4119 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4120 EmulatedTLSDefault))
4121 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004122 // AltiVec-like language extensions aren't relevant for assembling.
4123 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004124 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004125 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4126 }
Richard Trieu91844232012-06-26 18:18:47 +00004127 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4128 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004129
Alexey Bataevdb390212015-05-20 04:24:19 +00004130 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004131 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4132 options::OPT_fno_openmp, false))
4133 switch (getOpenMPRuntime(getToolChain(), Args)) {
4134 case OMPRT_OMP:
4135 case OMPRT_IOMP5:
4136 // Clang can generate useful OpenMP code for these two runtime libraries.
4137 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004138
4139 // If no option regarding the use of TLS in OpenMP codegeneration is
4140 // given, decide a default based on the target. Otherwise rely on the
4141 // options and pass the right information to the frontend.
4142 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
4143 options::OPT_fnoopenmp_use_tls,
4144 getToolChain().getArch() == llvm::Triple::ppc ||
4145 getToolChain().getArch() == llvm::Triple::ppc64 ||
4146 getToolChain().getArch() == llvm::Triple::ppc64le))
4147 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004148 break;
4149 default:
4150 // By default, if Clang doesn't know how to generate useful OpenMP code
4151 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4152 // down to the actual compilation.
4153 // FIXME: It would be better to have a mode which *only* omits IR
4154 // generation based on the OpenMP support so that we get consistent
4155 // semantic analysis, etc.
4156 break;
4157 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004158
Peter Collingbourne32701642013-11-01 18:16:25 +00004159 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004160 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004161
Eric Christopher459d2712013-02-19 06:16:53 +00004162 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004163 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4164 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4165 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4166 Arch == llvm::Triple::ppc64le))
4167 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4168 << "ppc/ppc64/ppc64le";
4169 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004170
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004171 // -fzvector is incompatible with -faltivec.
4172 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4173 if (Args.hasArg(options::OPT_faltivec))
4174 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4175 << "-faltivec";
4176
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004177 if (getToolChain().SupportsProfiling())
4178 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004179
4180 // -flax-vector-conversions is default.
4181 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4182 options::OPT_fno_lax_vector_conversions))
4183 CmdArgs.push_back("-fno-lax-vector-conversions");
4184
John Brawna7b4ec02015-08-10 11:11:28 +00004185 if (Args.getLastArg(options::OPT_fapple_kext) ||
4186 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004187 CmdArgs.push_back("-fapple-kext");
4188
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004189 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004190 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004191 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004192 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4193 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004194
4195 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4196 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004197 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004198 }
4199
Bob Wilson14adb362012-02-03 06:27:22 +00004200 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004201
Chandler Carruth6e501032011-03-27 00:04:55 +00004202 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4203 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004204 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004205 if (A->getOption().matches(options::OPT_fwrapv))
4206 CmdArgs.push_back("-fwrapv");
4207 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4208 options::OPT_fno_strict_overflow)) {
4209 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4210 CmdArgs.push_back("-fwrapv");
4211 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004212
4213 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4214 options::OPT_fno_reroll_loops))
4215 if (A->getOption().matches(options::OPT_freroll_loops))
4216 CmdArgs.push_back("-freroll-loops");
4217
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004218 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004219 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4220 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004221
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004222 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4223
Daniel Dunbar4930e332009-11-17 08:07:36 +00004224 // -stack-protector=0 is default.
4225 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004226 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4227 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4228 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4229 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4230 Args.ClaimAllArgs(options::OPT_fstack_protector);
4231 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004232 options::OPT_fstack_protector_all,
4233 options::OPT_fstack_protector_strong,
4234 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004235 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004236 StackProtectorLevel = std::max<unsigned>(
4237 LangOptions::SSPOn,
4238 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004239 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004240 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004241 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004242 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004243 } else {
4244 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004245 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004246 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004247 if (StackProtectorLevel) {
4248 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004249 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004250 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004251
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004252 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004253 for (const Arg *A : Args.filtered(options::OPT__param)) {
4254 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004255 if (Str.startswith("ssp-buffer-size=")) {
4256 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004257 CmdArgs.push_back("-stack-protector-buffer-size");
4258 // FIXME: Verify the argument is a valid integer.
4259 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004260 }
Sean Silva14facf32015-06-09 01:57:17 +00004261 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004262 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004263 }
4264
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004265 // Translate -mstackrealign
4266 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
4267 false)) {
4268 CmdArgs.push_back("-backend-option");
4269 CmdArgs.push_back("-force-align-stack");
4270 }
4271 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004272 false)) {
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004273 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
4274 }
4275
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004276 if (Args.hasArg(options::OPT_mstack_alignment)) {
4277 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4278 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004279 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004280
Hans Wennborg77dc2362015-01-20 19:45:50 +00004281 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4282 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4283
4284 if (!Size.empty())
4285 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4286 else
4287 CmdArgs.push_back("-mstack-probe-size=0");
4288 }
4289
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004290 if (getToolChain().getArch() == llvm::Triple::aarch64 ||
4291 getToolChain().getArch() == llvm::Triple::aarch64_be)
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004292 CmdArgs.push_back("-fallow-half-arguments-and-returns");
4293
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004294 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4295 options::OPT_mno_restrict_it)) {
4296 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4297 CmdArgs.push_back("-backend-option");
4298 CmdArgs.push_back("-arm-restrict-it");
4299 } else {
4300 CmdArgs.push_back("-backend-option");
4301 CmdArgs.push_back("-arm-no-restrict-it");
4302 }
James Y Knight2db38f32015-08-15 03:45:25 +00004303 } else if (Triple.isOSWindows() &&
4304 (Triple.getArch() == llvm::Triple::arm ||
4305 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004306 // Windows on ARM expects restricted IT blocks
4307 CmdArgs.push_back("-backend-option");
4308 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004309 }
4310
Daniel Dunbard18049a2009-04-07 21:16:11 +00004311 // Forward -f options with positive and negative forms; we translate
4312 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004313 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4314 StringRef fname = A->getValue();
4315 if (!llvm::sys::fs::exists(fname))
4316 D.Diag(diag::err_drv_no_such_file) << fname;
4317 else
4318 A->render(Args, CmdArgs);
4319 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004320
John Brawna7b4ec02015-08-10 11:11:28 +00004321 // -fbuiltin is default unless -mkernel is used
4322 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4323 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004324 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004325
Nuno Lopes13c88c72009-12-16 16:59:22 +00004326 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4327 options::OPT_fno_assume_sane_operator_new))
4328 CmdArgs.push_back("-fno-assume-sane-operator-new");
4329
Daniel Dunbar4930e332009-11-17 08:07:36 +00004330 // -fblocks=0 is default.
4331 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004332 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004333 (Args.hasArg(options::OPT_fgnu_runtime) &&
4334 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4335 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004336 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004337
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004338 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004339 !getToolChain().hasBlocksRuntime())
4340 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004341 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004342
Richard Smith47972af2015-06-16 00:08:24 +00004343 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004344 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004345 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004346 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004347 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004348 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4349 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004350 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004351 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004352 HaveModules = true;
4353 }
4354 }
4355
Richard Smith47972af2015-06-16 00:08:24 +00004356 // -fmodule-maps enables implicit reading of module map files. By default,
4357 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004358 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4359 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004360 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004361 }
4362
Daniel Jasperac42b752013-10-21 06:34:34 +00004363 // -fmodules-decluse checks that modules used are declared so (off by
4364 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004365 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004366 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004367 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004368 }
4369
Daniel Jasper962b38e2014-04-11 11:47:45 +00004370 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4371 // all #included headers are part of modules.
4372 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004373 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004374 CmdArgs.push_back("-fmodules-strict-decluse");
4375 }
4376
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004377 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4378 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4379 options::OPT_fno_implicit_modules)) {
4380 CmdArgs.push_back("-fno-implicit-modules");
4381 }
4382
Daniel Jasperac42b752013-10-21 06:34:34 +00004383 // -fmodule-name specifies the module that is currently being built (or
4384 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004385 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004386
Richard Smith9887d792014-10-17 01:42:53 +00004387 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004388 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004389 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004390
Richard Smithe842a472014-10-22 02:05:46 +00004391 // -fmodule-file can be used to specify files containing precompiled modules.
4392 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4393
4394 // -fmodule-cache-path specifies where our implicitly-built module files
4395 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004396 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004397 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004398 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004399 if (HaveModules) {
4400 if (C.isForDiagnostics()) {
4401 // When generating crash reports, we want to emit the modules along with
4402 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004403 Path = Output.getFilename();
4404 llvm::sys::path::replace_extension(Path, ".cache");
4405 llvm::sys::path::append(Path, "modules");
4406 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004407 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004408 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004409 llvm::sys::path::append(Path, "org.llvm.clang.");
4410 appendUserToPath(Path);
4411 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004412 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004413 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004414 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4415 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004416 }
4417
4418 // When building modules and generating crashdumps, we need to dump a module
4419 // dependency VFS alongside the output.
4420 if (HaveModules && C.isForDiagnostics()) {
4421 SmallString<128> VFSDir(Output.getFilename());
4422 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004423 // Add the cache directory as a temp so the crash diagnostics pick it up.
4424 C.addTempFile(Args.MakeArgString(VFSDir));
4425
Justin Bognera88f0122014-06-20 22:59:50 +00004426 llvm::sys::path::append(VFSDir, "vfs");
4427 CmdArgs.push_back("-module-dependency-dir");
4428 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004429 }
4430
Richard Smith9887d792014-10-17 01:42:53 +00004431 if (HaveModules)
4432 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004433
Douglas Gregor35b04d62013-02-07 19:01:24 +00004434 // Pass through all -fmodules-ignore-macro arguments.
4435 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004436 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4437 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004438
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004439 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4440
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004441 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4442 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4443 D.Diag(diag::err_drv_argument_not_allowed_with)
4444 << A->getAsString(Args) << "-fbuild-session-timestamp";
4445
4446 llvm::sys::fs::file_status Status;
4447 if (llvm::sys::fs::status(A->getValue(), Status))
4448 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004449 CmdArgs.push_back(Args.MakeArgString(
4450 "-fbuild-session-timestamp=" +
4451 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004452 }
4453
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004454 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004455 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4456 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004457 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4458
4459 Args.AddLastArg(CmdArgs,
4460 options::OPT_fmodules_validate_once_per_build_session);
4461 }
4462
Ben Langmuirdcf73862014-03-12 00:06:17 +00004463 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4464
John McCalldfea9982010-04-09 19:12:06 +00004465 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004466 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004467 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004468 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004469
Anders Carlssond470fef2010-11-21 00:09:52 +00004470 // -felide-constructors is the default.
4471 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004472 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004473 CmdArgs.push_back("-fno-elide-constructors");
4474
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004475 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004476
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004477 if (KernelOrKext || (types::isCXX(InputType) &&
4478 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4479 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004480 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004481
Tony Linthicum76329bf2011-12-12 21:14:55 +00004482 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004483 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4484 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004485 CmdArgs.push_back("-fshort-enums");
4486
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004487 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004488 if (Arg *A = Args.getLastArg(
4489 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4490 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4491 if (A->getOption().matches(options::OPT_funsigned_char) ||
4492 A->getOption().matches(options::OPT_fno_signed_char)) {
4493 CmdArgs.push_back("-fno-signed-char");
4494 }
4495 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004496 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004497 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004498
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004499 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004500 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4501 options::OPT_fno_use_cxa_atexit,
4502 !IsWindowsCygnus && !IsWindowsGNU &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004503 getToolChain().getArch() != llvm::Triple::hexagon &&
4504 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004505 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004506 CmdArgs.push_back("-fno-use-cxa-atexit");
4507
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004508 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004509 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004510 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004511 CmdArgs.push_back("-fms-extensions");
4512
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004513 // -fno-use-line-directives is default.
4514 if (Args.hasFlag(options::OPT_fuse_line_directives,
4515 options::OPT_fno_use_line_directives, false))
4516 CmdArgs.push_back("-fuse-line-directives");
4517
Francois Pichet1b4f1632011-09-17 04:32:15 +00004518 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004519 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004520 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004521 (IsWindowsMSVC &&
4522 Args.hasFlag(options::OPT_fms_extensions,
4523 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004524 CmdArgs.push_back("-fms-compatibility");
4525
David Majnemerc371ff02015-03-22 08:39:22 +00004526 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004527 VersionTuple MSVT = visualstudio::getMSVCVersion(
4528 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4529 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004530 CmdArgs.push_back(
4531 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004532
David Majnemer8db91762015-05-18 04:49:30 +00004533 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4534 if (ImplyVCPPCXXVer) {
4535 if (IsMSVC2015Compatible)
4536 CmdArgs.push_back("-std=c++14");
4537 else
4538 CmdArgs.push_back("-std=c++11");
4539 }
4540
Eric Christopher5ecce122013-02-18 00:38:31 +00004541 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004542 if (Args.hasFlag(options::OPT_fborland_extensions,
4543 options::OPT_fno_borland_extensions, false))
4544 CmdArgs.push_back("-fborland-extensions");
4545
David Majnemerc371ff02015-03-22 08:39:22 +00004546 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4547 // than 19.
4548 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4549 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004550 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004551 CmdArgs.push_back("-fno-threadsafe-statics");
4552
Francois Pichet02744872011-09-01 16:38:08 +00004553 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4554 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004555 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004556 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004557 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004558
Chandler Carruthe03aa552010-04-17 20:17:31 +00004559 // -fgnu-keywords default varies depending on language; only pass if
4560 // specified.
4561 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004562 options::OPT_fno_gnu_keywords))
4563 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004564
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004565 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004566 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004567 CmdArgs.push_back("-fgnu89-inline");
4568
Chad Rosier9c76d242012-03-15 22:31:42 +00004569 if (Args.hasArg(options::OPT_fno_inline))
4570 CmdArgs.push_back("-fno-inline");
4571
Chad Rosier64d6be92012-03-06 21:17:19 +00004572 if (Args.hasArg(options::OPT_fno_inline_functions))
4573 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004574
John McCall5fb5df92012-06-20 06:18:46 +00004575 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004576
John McCall5fb5df92012-06-20 06:18:46 +00004577 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004578 // legacy is the default. Except for deployment taget of 10.5,
4579 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4580 // gets ignored silently.
4581 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004582 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4583 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004584 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004585 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004586 if (getToolChain().UseObjCMixedDispatch())
4587 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4588 else
4589 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4590 }
4591 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004592
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004593 // When ObjectiveC legacy runtime is in effect on MacOSX,
4594 // turn on the option to do Array/Dictionary subscripting
4595 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004596 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004597 getToolChain().getTriple().isMacOSX() &&
4598 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4599 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004600 objcRuntime.isNeXTFamily())
4601 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004602
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004603 // -fencode-extended-block-signature=1 is default.
4604 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4605 CmdArgs.push_back("-fencode-extended-block-signature");
4606 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004607
John McCall24fc0de2011-07-06 00:26:06 +00004608 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4609 // NOTE: This logic is duplicated in ToolChains.cpp.
4610 bool ARC = isObjCAutoRefCount(Args);
4611 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004612 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004613
John McCall24fc0de2011-07-06 00:26:06 +00004614 CmdArgs.push_back("-fobjc-arc");
4615
Chandler Carruth491db322011-11-04 07:34:47 +00004616 // FIXME: It seems like this entire block, and several around it should be
4617 // wrapped in isObjC, but for now we just use it here as this is where it
4618 // was being used previously.
4619 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4620 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4621 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4622 else
4623 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4624 }
4625
John McCall24fc0de2011-07-06 00:26:06 +00004626 // Allow the user to enable full exceptions code emission.
4627 // We define off for Objective-CC, on for Objective-C++.
4628 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4629 options::OPT_fno_objc_arc_exceptions,
4630 /*default*/ types::isCXX(InputType)))
4631 CmdArgs.push_back("-fobjc-arc-exceptions");
4632 }
4633
4634 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4635 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004636 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004637 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004638
John McCall24fc0de2011-07-06 00:26:06 +00004639 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4640 // takes precedence.
4641 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4642 if (!GCArg)
4643 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4644 if (GCArg) {
4645 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004646 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004647 } else if (getToolChain().SupportsObjCGC()) {
4648 GCArg->render(Args, CmdArgs);
4649 } else {
4650 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004651 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004652 }
4653 }
4654
Bob Wilsonb111ec92015-03-02 19:01:14 +00004655 if (Args.hasFlag(options::OPT_fapplication_extension,
4656 options::OPT_fno_application_extension, false))
4657 CmdArgs.push_back("-fapplication-extension");
4658
Reid Klecknerc542d372014-06-27 17:02:02 +00004659 // Handle GCC-style exception args.
4660 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004661 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4662 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004663
4664 if (getToolChain().UseSjLjExceptions())
4665 CmdArgs.push_back("-fsjlj-exceptions");
4666
4667 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004668 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4669 options::OPT_fno_assume_sane_operator_new))
4670 CmdArgs.push_back("-fno-assume-sane-operator-new");
4671
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004672 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4673 // most platforms.
4674 if (Args.hasFlag(options::OPT_fsized_deallocation,
4675 options::OPT_fno_sized_deallocation, false))
4676 CmdArgs.push_back("-fsized-deallocation");
4677
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004678 // -fconstant-cfstrings is default, and may be subject to argument translation
4679 // on Darwin.
4680 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4681 options::OPT_fno_constant_cfstrings) ||
4682 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4683 options::OPT_mno_constant_cfstrings))
4684 CmdArgs.push_back("-fno-constant-cfstrings");
4685
John Thompsoned4e2952009-11-05 20:14:16 +00004686 // -fshort-wchar default varies depending on platform; only
4687 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004688 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4689 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004690 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004691
Hans Wennborg28c96312013-07-31 23:39:13 +00004692 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004693 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004694 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004695 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004696
Daniel Dunbar096ed292011-10-05 21:04:55 +00004697 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4698 // -fno-pack-struct doesn't apply to -fpack-struct=.
4699 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004700 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004701 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004702 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004703 } else if (Args.hasFlag(options::OPT_fpack_struct,
4704 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004705 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004706 }
4707
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004708 // Handle -fmax-type-align=N and -fno-type-align
4709 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4710 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4711 if (!SkipMaxTypeAlign) {
4712 std::string MaxTypeAlignStr = "-fmax-type-align=";
4713 MaxTypeAlignStr += A->getValue();
4714 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4715 }
4716 } else if (getToolChain().getTriple().isOSDarwin()) {
4717 if (!SkipMaxTypeAlign) {
4718 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4719 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4720 }
4721 }
4722
John Brawna7b4ec02015-08-10 11:11:28 +00004723 // -fcommon is the default unless compiling kernel code or the target says so
4724 bool NoCommonDefault =
4725 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
4726 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
4727 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004728 CmdArgs.push_back("-fno-common");
4729
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004730 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004731 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004732 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004733 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004734 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004735 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004736
Daniel Dunbar6358d682010-10-15 22:30:42 +00004737 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004738 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004739 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004740 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004741
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004742 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004743 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4744 StringRef value = inputCharset->getValue();
4745 if (value != "UTF-8")
4746 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4747 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004748 }
4749
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004750 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004751 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4752 StringRef value = execCharset->getValue();
4753 if (value != "UTF-8")
4754 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4755 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004756 }
4757
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004758 // -fcaret-diagnostics is default.
4759 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4760 options::OPT_fno_caret_diagnostics, true))
4761 CmdArgs.push_back("-fno-caret-diagnostics");
4762
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004763 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004764 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004765 options::OPT_fno_diagnostics_fixit_info))
4766 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004767
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004768 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004769 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004770 options::OPT_fno_diagnostics_show_option))
4771 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004772
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004773 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004774 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004775 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004776 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004777 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004778
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004779 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004780 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004781 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004782 }
4783
Chandler Carruthb6766f02011-03-27 01:50:55 +00004784 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004785 options::OPT_fdiagnostics_show_note_include_stack,
4786 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004787 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004788 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004789 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4790 else
4791 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4792 }
4793
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004794 // Color diagnostics are the default, unless the terminal doesn't support
4795 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004796 // Support both clang's -f[no-]color-diagnostics and gcc's
4797 // -f[no-]diagnostics-colors[=never|always|auto].
4798 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004799 for (const auto &Arg : Args) {
4800 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004801 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4802 !O.matches(options::OPT_fdiagnostics_color) &&
4803 !O.matches(options::OPT_fno_color_diagnostics) &&
4804 !O.matches(options::OPT_fno_diagnostics_color) &&
4805 !O.matches(options::OPT_fdiagnostics_color_EQ))
4806 continue;
4807
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004808 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004809 if (O.matches(options::OPT_fcolor_diagnostics) ||
4810 O.matches(options::OPT_fdiagnostics_color)) {
4811 ShowColors = Colors_On;
4812 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4813 O.matches(options::OPT_fno_diagnostics_color)) {
4814 ShowColors = Colors_Off;
4815 } else {
4816 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004817 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004818 if (value == "always")
4819 ShowColors = Colors_On;
4820 else if (value == "never")
4821 ShowColors = Colors_Off;
4822 else if (value == "auto")
4823 ShowColors = Colors_Auto;
4824 else
4825 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004826 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004827 }
4828 }
4829 if (ShowColors == Colors_On ||
4830 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004831 CmdArgs.push_back("-fcolor-diagnostics");
4832
Nico Rieck7857d462013-09-11 00:38:02 +00004833 if (Args.hasArg(options::OPT_fansi_escape_codes))
4834 CmdArgs.push_back("-fansi-escape-codes");
4835
Daniel Dunbardb097022009-06-08 21:13:54 +00004836 if (!Args.hasFlag(options::OPT_fshow_source_location,
4837 options::OPT_fno_show_source_location))
4838 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004839
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004840 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004841 true))
4842 CmdArgs.push_back("-fno-show-column");
4843
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004844 if (!Args.hasFlag(options::OPT_fspell_checking,
4845 options::OPT_fno_spell_checking))
4846 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004847
Chad Rosierc8e56e82012-12-05 21:08:21 +00004848 // -fno-asm-blocks is default.
4849 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4850 false))
4851 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004852
Steven Wucb0d13f2015-01-16 23:05:28 +00004853 // -fgnu-inline-asm is default.
4854 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4855 options::OPT_fno_gnu_inline_asm, true))
4856 CmdArgs.push_back("-fno-gnu-inline-asm");
4857
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004858 // Enable vectorization per default according to the optimization level
4859 // selected. For optimization levels that want vectorization we use the alias
4860 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004861 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004862 OptSpecifier VectorizeAliasOption =
4863 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004864 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004865 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004866 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004867
Chad Rosier136d67d2014-04-28 19:30:57 +00004868 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004869 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004870 OptSpecifier SLPVectAliasOption =
4871 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00004872 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004873 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004874 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004875
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004876 // -fno-slp-vectorize-aggressive is default.
4877 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004878 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004879 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004880
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004881 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4882 A->render(Args, CmdArgs);
4883
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004884 // -fdollars-in-identifiers default varies depending on platform and
4885 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004886 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004887 options::OPT_fno_dollars_in_identifiers)) {
4888 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004889 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004890 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004891 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004892 }
4893
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004894 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4895 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004896 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004897 options::OPT_fno_unit_at_a_time)) {
4898 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004899 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004900 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004901
Eli Friedman055c9702011-11-02 01:53:16 +00004902 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4903 options::OPT_fno_apple_pragma_pack, false))
4904 CmdArgs.push_back("-fapple-pragma-pack");
4905
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004906 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004907 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4908 // by default.
4909 if (getToolChain().getArch() == llvm::Triple::le32) {
4910 CmdArgs.push_back("-fno-math-builtin");
4911 }
4912
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004913// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4914//
4915// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004916#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004917 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004918 (getToolChain().getArch() == llvm::Triple::arm ||
4919 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004920 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4921 CmdArgs.push_back("-fno-builtin-strcat");
4922 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4923 CmdArgs.push_back("-fno-builtin-strcpy");
4924 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004925#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004926
Justin Bognera88f0122014-06-20 22:59:50 +00004927 // Enable rewrite includes if the user's asked for it or if we're generating
4928 // diagnostics.
4929 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4930 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004931 if (Args.hasFlag(options::OPT_frewrite_includes,
4932 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004933 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004934 CmdArgs.push_back("-frewrite-includes");
4935
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004936 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004937 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004938 options::OPT_traditional_cpp)) {
4939 if (isa<PreprocessJobAction>(JA))
4940 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004941 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004942 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004943 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004944
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004945 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004946 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004947
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004948 // Handle serialized diagnostics.
4949 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4950 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004951 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004952 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004953
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004954 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4955 CmdArgs.push_back("-fretain-comments-from-system-headers");
4956
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004957 // Forward -fcomment-block-commands to -cc1.
4958 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004959 // Forward -fparse-all-comments to -cc1.
4960 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004961
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004962 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4963 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004964 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00004965 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
4966 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004967
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004968 // We translate this by hand to the -cc1 argument, since nightly test uses
4969 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00004970 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004971 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004972 } else
Sean Silva14facf32015-06-09 01:57:17 +00004973 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004974 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004975
Bob Wilson23a55f12014-12-21 07:00:00 +00004976 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00004977 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
4978 // by the frontend.
4979 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
4980 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00004981
Daniel Dunbard67a3222009-03-30 06:36:42 +00004982 if (Output.getType() == types::TY_Dependencies) {
4983 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004984 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004985 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004986 CmdArgs.push_back(Output.getFilename());
4987 } else {
4988 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004989 }
4990
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004991 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004992
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004993 if (Input.isFilename())
4994 CmdArgs.push_back(Input.getFilename());
4995 else
4996 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004997
Chris Lattnere9d7d782009-11-03 19:50:27 +00004998 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4999
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005000 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005001
5002 // Optionally embed the -cc1 level arguments into the debug info, for build
5003 // analysis.
5004 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005005 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005006 for (const auto &Arg : Args)
5007 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005008
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005009 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005010 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005011 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005012 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005013 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005014 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005015 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005016 }
5017 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005018 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005019 }
5020
Eric Christopherd3804002013-02-22 20:12:52 +00005021 // Add the split debug info name to the command lines here so we
5022 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005023 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005024 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5025 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005026 const char *SplitDwarfOut;
5027 if (SplitDwarf) {
5028 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005029 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005030 CmdArgs.push_back(SplitDwarfOut);
5031 }
5032
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005033 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5034 // Include them with -fcuda-include-gpubinary.
5035 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005036 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005037 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005038 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005039 }
5040
Eric Christopherd3804002013-02-22 20:12:52 +00005041 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005042 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005043 Output.getType() == types::TY_Object &&
5044 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005045 auto CLCommand =
5046 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005047 C.addCommand(llvm::make_unique<FallbackCommand>(
5048 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005049 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005050 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005051 }
5052
Eric Christopherf1545832013-02-22 23:50:16 +00005053 // Handle the debug info splitting at object creation time if we're
5054 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005055 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005056 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005057 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005058
Roman Divacky178e01602011-02-10 16:52:03 +00005059 if (Arg *A = Args.getLastArg(options::OPT_pg))
5060 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005061 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5062 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005063
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005064 // Claim some arguments which clang supports automatically.
5065
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005066 // -fpch-preprocess is used with gcc to add a special marker in the output to
5067 // include the PCH file. Clang's PTH solution is completely transparent, so we
5068 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005069 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005070
Daniel Dunbar17731772009-03-23 19:03:36 +00005071 // Claim some arguments which clang doesn't support, but we don't
5072 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005073 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5074 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005075
Rafael Espindolab0092d72013-09-04 19:37:35 +00005076 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005077 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005078}
5079
John McCall5fb5df92012-06-20 06:18:46 +00005080/// Add options related to the Objective-C runtime/ABI.
5081///
5082/// Returns true if the runtime is non-fragile.
5083ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5084 ArgStringList &cmdArgs,
5085 RewriteKind rewriteKind) const {
5086 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005087 Arg *runtimeArg =
5088 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5089 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005090
5091 // Just forward -fobjc-runtime= to the frontend. This supercedes
5092 // options about fragility.
5093 if (runtimeArg &&
5094 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5095 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005096 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005097 if (runtime.tryParse(value)) {
5098 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005099 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005100 }
5101
5102 runtimeArg->render(args, cmdArgs);
5103 return runtime;
5104 }
5105
5106 // Otherwise, we'll need the ABI "version". Version numbers are
5107 // slightly confusing for historical reasons:
5108 // 1 - Traditional "fragile" ABI
5109 // 2 - Non-fragile ABI, version 1
5110 // 3 - Non-fragile ABI, version 2
5111 unsigned objcABIVersion = 1;
5112 // If -fobjc-abi-version= is present, use that to set the version.
5113 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005114 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005115 if (value == "1")
5116 objcABIVersion = 1;
5117 else if (value == "2")
5118 objcABIVersion = 2;
5119 else if (value == "3")
5120 objcABIVersion = 3;
5121 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005122 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005123 } else {
5124 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005125 bool nonFragileABIIsDefault =
5126 (rewriteKind == RK_NonFragile ||
5127 (rewriteKind == RK_None &&
5128 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005129 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5130 options::OPT_fno_objc_nonfragile_abi,
5131 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005132// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005133#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5134 unsigned nonFragileABIVersion = 1;
5135#else
5136 unsigned nonFragileABIVersion = 2;
5137#endif
5138
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005139 if (Arg *abiArg =
5140 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005141 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005142 if (value == "1")
5143 nonFragileABIVersion = 1;
5144 else if (value == "2")
5145 nonFragileABIVersion = 2;
5146 else
5147 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005148 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005149 }
5150
5151 objcABIVersion = 1 + nonFragileABIVersion;
5152 } else {
5153 objcABIVersion = 1;
5154 }
5155 }
5156
5157 // We don't actually care about the ABI version other than whether
5158 // it's non-fragile.
5159 bool isNonFragile = objcABIVersion != 1;
5160
5161 // If we have no runtime argument, ask the toolchain for its default runtime.
5162 // However, the rewriter only really supports the Mac runtime, so assume that.
5163 ObjCRuntime runtime;
5164 if (!runtimeArg) {
5165 switch (rewriteKind) {
5166 case RK_None:
5167 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5168 break;
5169 case RK_Fragile:
5170 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5171 break;
5172 case RK_NonFragile:
5173 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5174 break;
5175 }
5176
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005177 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005178 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5179 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005180 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005181 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5182
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005183 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005184 } else {
5185 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5186 }
5187
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005188 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005189 } else {
5190 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005191 // Legacy behaviour is to target the gnustep runtime if we are i
5192 // non-fragile mode or the GCC runtime in fragile mode.
5193 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005194 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005195 else
5196 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005197 }
5198
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005199 cmdArgs.push_back(
5200 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005201 return runtime;
5202}
5203
Reid Klecknerc542d372014-06-27 17:02:02 +00005204static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5205 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5206 I += HaveDash;
5207 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005208}
Reid Klecknerc542d372014-06-27 17:02:02 +00005209
5210struct EHFlags {
5211 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5212 bool Synch;
5213 bool Asynch;
5214 bool NoExceptC;
5215};
5216
5217/// /EH controls whether to run destructor cleanups when exceptions are
5218/// thrown. There are three modifiers:
5219/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5220/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5221/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5222/// - c: Assume that extern "C" functions are implicitly noexcept. This
5223/// modifier is an optimization, so we ignore it for now.
5224/// The default is /EHs-c-, meaning cleanups are disabled.
5225static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5226 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005227
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005228 std::vector<std::string> EHArgs =
5229 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005230 for (auto EHVal : EHArgs) {
5231 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5232 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005233 case 'a':
5234 EH.Asynch = maybeConsumeDash(EHVal, I);
5235 continue;
5236 case 'c':
5237 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5238 continue;
5239 case 's':
5240 EH.Synch = maybeConsumeDash(EHVal, I);
5241 continue;
5242 default:
5243 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005244 }
5245 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5246 break;
5247 }
5248 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005249
Reid Kleckner5c6efed2015-07-14 18:16:48 +00005250 // FIXME: Disable C++ EH completely, until it becomes more reliable. Users
5251 // can use -Xclang to manually enable C++ EH until then.
5252 EH = EHFlags();
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005253
Reid Klecknerc542d372014-06-27 17:02:02 +00005254 return EH;
5255}
5256
Hans Wennborg75958c42013-08-08 00:17:41 +00005257void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5258 unsigned RTOptionID = options::OPT__SLASH_MT;
5259
Hans Wennborgf1a74252013-09-10 20:18:04 +00005260 if (Args.hasArg(options::OPT__SLASH_LDd))
5261 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5262 // but defining _DEBUG is sticky.
5263 RTOptionID = options::OPT__SLASH_MTd;
5264
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005265 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005266 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005267
David Majnemere2afb472015-07-24 06:49:13 +00005268 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005269 switch (RTOptionID) {
5270 case options::OPT__SLASH_MD:
5271 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005272 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005273 CmdArgs.push_back("-D_MT");
5274 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005275 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005276 break;
5277 case options::OPT__SLASH_MDd:
5278 CmdArgs.push_back("-D_DEBUG");
5279 CmdArgs.push_back("-D_MT");
5280 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005281 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005282 break;
5283 case options::OPT__SLASH_MT:
5284 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005285 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005286 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005287 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005288 break;
5289 case options::OPT__SLASH_MTd:
5290 CmdArgs.push_back("-D_DEBUG");
5291 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005292 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005293 break;
5294 default:
5295 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005296 }
5297
David Majnemere2afb472015-07-24 06:49:13 +00005298 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5299 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5300 } else {
5301 CmdArgs.push_back(FlagForCRT.data());
5302
5303 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5304 // users want. The /Za flag to cl.exe turns this off, but it's not
5305 // implemented in clang.
5306 CmdArgs.push_back("--dependent-lib=oldnames");
5307 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005308
Hans Wennborg8858a032014-07-21 23:42:07 +00005309 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5310 // would produce interleaved output, so ignore /showIncludes in such cases.
5311 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5312 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5313 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005314
David Majnemerf6072342014-07-01 22:24:56 +00005315 // This controls whether or not we emit RTTI data for polymorphic types.
5316 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5317 /*default=*/false))
5318 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005319
Reid Kleckner124955a2015-08-05 18:51:13 +00005320 // Emit CodeView if -Z7 is present.
5321 bool EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
5322 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5323 // If we are emitting CV but not DWARF, don't build information that LLVM
5324 // can't yet process.
5325 if (EmitCodeView && !EmitDwarf)
5326 CmdArgs.push_back("-gline-tables-only");
5327 if (EmitCodeView)
5328 CmdArgs.push_back("-gcodeview");
5329
Reid Klecknerc542d372014-06-27 17:02:02 +00005330 const Driver &D = getToolChain().getDriver();
5331 EHFlags EH = parseClangCLEHFlags(D, Args);
5332 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005333 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005334 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005335 CmdArgs.push_back("-fexceptions");
5336 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005337
Hans Wennborge50cec32014-06-13 20:59:54 +00005338 // /EP should expand to -E -P.
5339 if (Args.hasArg(options::OPT__SLASH_EP)) {
5340 CmdArgs.push_back("-E");
5341 CmdArgs.push_back("-P");
5342 }
5343
David Majnemera5b195a2015-02-14 01:35:12 +00005344 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005345 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5346 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005347 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5348 else
5349 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5350
5351 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5352 VolatileOptionID = A->getOption().getID();
5353
5354 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5355 CmdArgs.push_back("-fms-volatile");
5356
David Majnemer86c318f2014-02-11 21:05:00 +00005357 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5358 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5359 if (MostGeneralArg && BestCaseArg)
5360 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5361 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5362
5363 if (MostGeneralArg) {
5364 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5365 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5366 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5367
5368 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5369 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5370 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5371 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5372 << FirstConflict->getAsString(Args)
5373 << SecondConflict->getAsString(Args);
5374
5375 if (SingleArg)
5376 CmdArgs.push_back("-fms-memptr-rep=single");
5377 else if (MultipleArg)
5378 CmdArgs.push_back("-fms-memptr-rep=multiple");
5379 else
5380 CmdArgs.push_back("-fms-memptr-rep=virtual");
5381 }
5382
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005383 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5384 A->render(Args, CmdArgs);
5385
Hans Wennborg81f74482013-09-10 01:07:07 +00005386 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5387 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005388 if (Args.hasArg(options::OPT__SLASH_fallback))
5389 CmdArgs.push_back("msvc-fallback");
5390 else
5391 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005392 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005393}
5394
Douglas Katzman95354292015-06-23 20:42:09 +00005395visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005396 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005397 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005398 return CLFallback.get();
5399}
5400
Daniel Sanders7f933f42015-01-30 17:35:23 +00005401void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5402 ArgStringList &CmdArgs) const {
5403 StringRef CPUName;
5404 StringRef ABIName;
5405 const llvm::Triple &Triple = getToolChain().getTriple();
5406 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5407
5408 CmdArgs.push_back("-target-abi");
5409 CmdArgs.push_back(ABIName.data());
5410}
5411
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005412void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005413 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005414 const ArgList &Args,
5415 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005416 ArgStringList CmdArgs;
5417
5418 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5419 const InputInfo &Input = Inputs[0];
5420
James Y Knight2db38f32015-08-15 03:45:25 +00005421 std::string TripleStr =
5422 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5423 const llvm::Triple Triple(TripleStr);
5424
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005425 // Don't warn about "clang -w -c foo.s"
5426 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005427 // and "clang -emit-llvm -c foo.s"
5428 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005429
Rafael Espindola577637a2015-01-03 00:06:04 +00005430 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005431
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005432 // Invoke ourselves in -cc1as mode.
5433 //
5434 // FIXME: Implement custom jobs for internal actions.
5435 CmdArgs.push_back("-cc1as");
5436
5437 // Add the "effective" target triple.
5438 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005439 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5440
5441 // Set the output mode, we currently only expect to be used as a real
5442 // assembler.
5443 CmdArgs.push_back("-filetype");
5444 CmdArgs.push_back("obj");
5445
Eric Christopher45f2e712012-12-18 00:31:10 +00005446 // Set the main file name, so that debug info works even with
5447 // -save-temps or preprocessed assembly.
5448 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005449 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005450
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005451 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005452 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005453 if (!CPU.empty()) {
5454 CmdArgs.push_back("-target-cpu");
5455 CmdArgs.push_back(Args.MakeArgString(CPU));
5456 }
5457
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005458 // Add the target features
5459 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005460 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005461
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005462 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005463 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005464
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005465 // Pass along any -I options so we get proper .include search paths.
5466 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5467
Eric Christopherfc3ee562012-01-10 00:38:01 +00005468 // Determine the original source input.
5469 const Action *SourceAction = &JA;
5470 while (SourceAction->getKind() != Action::InputClass) {
5471 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5472 SourceAction = SourceAction->getInputs()[0];
5473 }
5474
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005475 // Forward -g and handle debug info related flags, assuming we are dealing
5476 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005477 if (SourceAction->getType() == types::TY_Asm ||
5478 SourceAction->getType() == types::TY_PP_Asm) {
5479 Args.ClaimAllArgs(options::OPT_g_Group);
5480 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5481 if (!A->getOption().matches(options::OPT_g0))
5482 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005483
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005484 if (Args.hasArg(options::OPT_gdwarf_2))
5485 CmdArgs.push_back("-gdwarf-2");
5486 if (Args.hasArg(options::OPT_gdwarf_3))
5487 CmdArgs.push_back("-gdwarf-3");
5488 if (Args.hasArg(options::OPT_gdwarf_4))
5489 CmdArgs.push_back("-gdwarf-4");
5490
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005491 // Add the -fdebug-compilation-dir flag if needed.
5492 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005493
5494 // Set the AT_producer to the clang version when using the integrated
5495 // assembler on assembly source files.
5496 CmdArgs.push_back("-dwarf-debug-producer");
5497 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005498
5499 // And pass along -I options
5500 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005501 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005502
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005503 // Handle -fPIC et al -- the relocation-model affects the assembler
5504 // for some targets.
5505 llvm::Reloc::Model RelocationModel;
5506 unsigned PICLevel;
5507 bool IsPIE;
5508 std::tie(RelocationModel, PICLevel, IsPIE) =
5509 ParsePICArgs(getToolChain(), Triple, Args);
5510
5511 const char *RMName = RelocationModelName(RelocationModel);
5512 if (RMName) {
5513 CmdArgs.push_back("-mrelocation-model");
5514 CmdArgs.push_back(RMName);
5515 }
5516
Kevin Enderby292dc082011-12-22 19:31:58 +00005517 // Optionally embed the -cc1as level arguments into the debug info, for build
5518 // analysis.
5519 if (getToolChain().UseDwarfDebugFlags()) {
5520 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005521 for (const auto &Arg : Args)
5522 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005523
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005524 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005525 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5526 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005527 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005528 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005529 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005530 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005531 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005532 }
5533 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005534 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005535 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005536
5537 // FIXME: Add -static support, once we have it.
5538
Daniel Sanders7f933f42015-01-30 17:35:23 +00005539 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005540 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005541 default:
5542 break;
5543
5544 case llvm::Triple::mips:
5545 case llvm::Triple::mipsel:
5546 case llvm::Triple::mips64:
5547 case llvm::Triple::mips64el:
5548 AddMIPSTargetArgs(Args, CmdArgs);
5549 break;
5550 }
5551
David Blaikie372d9502014-01-17 03:17:40 +00005552 // Consume all the warning flags. Usually this would be handled more
5553 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5554 // doesn't handle that so rather than warning about unused flags that are
5555 // actually used, we'll lie by omission instead.
5556 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005557 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5558 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005559
David Blaikie9260ed62013-07-25 21:19:01 +00005560 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5561 getToolChain().getDriver());
5562
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005563 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005564
5565 assert(Output.isFilename() && "Unexpected lipo output.");
5566 CmdArgs.push_back("-o");
5567 CmdArgs.push_back(Output.getFilename());
5568
Daniel Dunbarb440f562010-08-02 02:38:21 +00005569 assert(Input.isFilename() && "Invalid input.");
5570 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005571
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005572 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005573 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005574
5575 // Handle the debug info splitting at object creation time if we're
5576 // creating an object.
5577 // TODO: Currently only works on linux with newer objcopy.
5578 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005579 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005580 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005581 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005582}
5583
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005584void GnuTool::anchor() {}
5585
Daniel Dunbara3246a02009-03-18 08:07:30 +00005586void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005587 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005588 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005589 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005590 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005591 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005592
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005593 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005594 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005595 // Don't forward any -g arguments to assembly steps.
5596 if (isa<AssembleJobAction>(JA) &&
5597 A->getOption().matches(options::OPT_g_Group))
5598 continue;
5599
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005600 // Don't forward any -W arguments to assembly and link steps.
5601 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5602 A->getOption().matches(options::OPT_W_Group))
5603 continue;
5604
Daniel Dunbar2da02722009-03-19 07:55:12 +00005605 // It is unfortunate that we have to claim here, as this means
5606 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005607 // platforms using a generic gcc, even if we are just using gcc
5608 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005609 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005610 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005611 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005612 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005613
Daniel Dunbar4e295052010-01-25 22:35:08 +00005614 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005615
5616 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005617 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005618 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005619 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005620 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005621 }
5622
Daniel Dunbar5716d872009-05-02 21:41:52 +00005623 // Try to force gcc to match the tool chain we want, if we recognize
5624 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005625 //
5626 // FIXME: The triple class should directly provide the information we want
5627 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005628 switch (getToolChain().getArch()) {
5629 default:
5630 break;
5631 case llvm::Triple::x86:
5632 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005633 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005634 break;
5635 case llvm::Triple::x86_64:
5636 case llvm::Triple::ppc64:
5637 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005638 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005639 break;
5640 case llvm::Triple::sparcel:
5641 CmdArgs.push_back("-EL");
5642 break;
5643 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005644
Daniel Dunbarb440f562010-08-02 02:38:21 +00005645 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005646 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005647 CmdArgs.push_back(Output.getFilename());
5648 } else {
5649 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005650 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005651 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005652
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005653 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005654
5655 // Only pass -x if gcc will understand it; otherwise hope gcc
5656 // understands the suffix correctly. The main use case this would go
5657 // wrong in is for linker inputs if they happened to have an odd
5658 // suffix; really the only way to get this to happen is a command
5659 // like '-x foobar a.c' which will treat a.c like a linker input.
5660 //
5661 // FIXME: For the linker case specifically, can we safely convert
5662 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005663 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005664 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005665 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5666 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005667 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005668 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005669 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005670 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005671 else if (II.getType() == types::TY_ModuleFile)
5672 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005673 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005674
Daniel Dunbara3246a02009-03-18 08:07:30 +00005675 if (types::canTypeBeUserSpecified(II.getType())) {
5676 CmdArgs.push_back("-x");
5677 CmdArgs.push_back(types::getTypeName(II.getType()));
5678 }
5679
Daniel Dunbarb440f562010-08-02 02:38:21 +00005680 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005681 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005682 else {
5683 const Arg &A = II.getInputArg();
5684
5685 // Reverse translate some rewritten options.
5686 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5687 CmdArgs.push_back("-lstdc++");
5688 continue;
5689 }
5690
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005691 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005692 A.render(Args, CmdArgs);
5693 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005694 }
5695
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005696 const std::string customGCCName = D.getCCCGenericGCCName();
5697 const char *GCCName;
5698 if (!customGCCName.empty())
5699 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005700 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005701 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005702 } else
5703 GCCName = "gcc";
5704
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005705 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005706 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005707}
5708
Douglas Katzman95354292015-06-23 20:42:09 +00005709void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5710 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005711 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005712}
5713
Douglas Katzman95354292015-06-23 20:42:09 +00005714void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5715 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005716 const Driver &D = getToolChain().getDriver();
5717
Eric Christophercc7ff502015-01-29 00:56:17 +00005718 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005719 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005720 case types::TY_LLVM_IR:
5721 case types::TY_LTO_IR:
5722 case types::TY_LLVM_BC:
5723 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005724 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005725 break;
5726 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005727 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005728 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005729 case types::TY_Nothing:
5730 CmdArgs.push_back("-fsyntax-only");
5731 break;
5732 default:
5733 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005734 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005735}
5736
Douglas Katzman95354292015-06-23 20:42:09 +00005737void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5738 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005739 // The types are (hopefully) good enough.
5740}
5741
Tony Linthicum76329bf2011-12-12 21:14:55 +00005742// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005743void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5744 ArgStringList &CmdArgs) const {}
5745void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5746 const InputInfo &Output,
5747 const InputInfoList &Inputs,
5748 const ArgList &Args,
5749 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005750 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005751
5752 const Driver &D = getToolChain().getDriver();
5753 ArgStringList CmdArgs;
5754
5755 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005756 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005757 CmdArgs.push_back(Args.MakeArgString(MarchString));
5758
5759 RenderExtraToolArgs(JA, CmdArgs);
5760
5761 if (Output.isFilename()) {
5762 CmdArgs.push_back("-o");
5763 CmdArgs.push_back(Output.getFilename());
5764 } else {
5765 assert(Output.isNothing() && "Unexpected output");
5766 CmdArgs.push_back("-fsyntax-only");
5767 }
5768
Douglas Katzman54366072015-07-27 16:53:08 +00005769 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005770 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005771
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005772 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005773
Tony Linthicum76329bf2011-12-12 21:14:55 +00005774 // Only pass -x if gcc will understand it; otherwise hope gcc
5775 // understands the suffix correctly. The main use case this would go
5776 // wrong in is for linker inputs if they happened to have an odd
5777 // suffix; really the only way to get this to happen is a command
5778 // like '-x foobar a.c' which will treat a.c like a linker input.
5779 //
5780 // FIXME: For the linker case specifically, can we safely convert
5781 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005782 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005783 // Don't try to pass LLVM or AST inputs to a generic gcc.
5784 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5785 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5786 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005787 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005788 else if (II.getType() == types::TY_AST)
5789 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005790 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005791 else if (II.getType() == types::TY_ModuleFile)
5792 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005793 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005794
5795 if (II.isFilename())
5796 CmdArgs.push_back(II.getFilename());
5797 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005798 // Don't render as input, we need gcc to do the translations.
5799 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005800 II.getInputArg().render(Args, CmdArgs);
5801 }
5802
5803 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005804 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005805 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005806}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005807
Douglas Katzman95354292015-06-23 20:42:09 +00005808void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5809 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005810 // The types are (hopefully) good enough.
5811}
5812
Douglas Katzman54366072015-07-27 16:53:08 +00005813static void
5814constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5815 const toolchains::HexagonToolChain &ToolChain,
5816 const InputInfo &Output, const InputInfoList &Inputs,
5817 const ArgList &Args, ArgStringList &CmdArgs,
5818 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005819
Matthew Curtise689b052012-12-06 15:46:07 +00005820 const Driver &D = ToolChain.getDriver();
5821
Matthew Curtise689b052012-12-06 15:46:07 +00005822 //----------------------------------------------------------------------------
5823 //
5824 //----------------------------------------------------------------------------
5825 bool hasStaticArg = Args.hasArg(options::OPT_static);
5826 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005827 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005828 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5829 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5830 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005831 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005832 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005833
Matthew Curtise689b052012-12-06 15:46:07 +00005834 //----------------------------------------------------------------------------
5835 // Silence warnings for various options
5836 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005837
Matthew Curtise689b052012-12-06 15:46:07 +00005838 Args.ClaimAllArgs(options::OPT_g_Group);
5839 Args.ClaimAllArgs(options::OPT_emit_llvm);
5840 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5841 // handled somewhere else.
5842 Args.ClaimAllArgs(options::OPT_static_libgcc);
5843
5844 //----------------------------------------------------------------------------
5845 //
5846 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005847 for (const auto &Opt : ToolChain.ExtraOpts)
5848 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005849
Douglas Katzman54366072015-07-27 16:53:08 +00005850 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00005851 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005852
Matthew Curtise689b052012-12-06 15:46:07 +00005853 if (buildingLib) {
5854 CmdArgs.push_back("-shared");
5855 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5856 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005857 }
5858
Matthew Curtise689b052012-12-06 15:46:07 +00005859 if (hasStaticArg)
5860 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005861
Matthew Curtise8f80a12012-12-06 17:49:03 +00005862 if (buildPIE && !buildingLib)
5863 CmdArgs.push_back("-pie");
5864
Douglas Katzman54366072015-07-27 16:53:08 +00005865 if (const char *v =
5866 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005867 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00005868 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005869 }
5870
Matthew Curtise689b052012-12-06 15:46:07 +00005871 //----------------------------------------------------------------------------
5872 //
5873 //----------------------------------------------------------------------------
5874 CmdArgs.push_back("-o");
5875 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005876
Matthew Curtise689b052012-12-06 15:46:07 +00005877 const std::string MarchSuffix = "/" + MarchString;
5878 const std::string G0Suffix = "/G0";
5879 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005880 const std::string RootDir =
Douglas Katzman54366072015-07-27 16:53:08 +00005881 toolchains::HexagonToolChain::GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005882 const std::string StartFilesDir =
5883 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005884
5885 //----------------------------------------------------------------------------
5886 // moslib
5887 //----------------------------------------------------------------------------
5888 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005889 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005890
Sean Silva14facf32015-06-09 01:57:17 +00005891 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5892 A->claim();
5893 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005894 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005895 }
Matthew Curtise689b052012-12-06 15:46:07 +00005896 if (oslibs.empty()) {
5897 oslibs.push_back("standalone");
5898 hasStandalone = true;
5899 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005900
Matthew Curtise689b052012-12-06 15:46:07 +00005901 //----------------------------------------------------------------------------
5902 // Start Files
5903 //----------------------------------------------------------------------------
5904 if (incStdLib && incStartFiles) {
5905
5906 if (!buildingLib) {
5907 if (hasStandalone) {
5908 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005909 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00005910 }
5911 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5912 }
5913 std::string initObj = useShared ? "/initS.o" : "/init.o";
5914 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5915 }
5916
5917 //----------------------------------------------------------------------------
5918 // Library Search Paths
5919 //----------------------------------------------------------------------------
5920 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005921 for (const auto &LibPath : LibPaths)
5922 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005923
5924 //----------------------------------------------------------------------------
5925 //
5926 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00005927 Args.AddAllArgs(CmdArgs,
5928 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
5929 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00005930
5931 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5932
5933 //----------------------------------------------------------------------------
5934 // Libraries
5935 //----------------------------------------------------------------------------
5936 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005937 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005938 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5939 CmdArgs.push_back("-lm");
5940 }
5941
5942 CmdArgs.push_back("--start-group");
5943
5944 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00005945 for (const std::string &Lib : oslibs)
5946 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00005947 CmdArgs.push_back("-lc");
5948 }
5949 CmdArgs.push_back("-lgcc");
5950
5951 CmdArgs.push_back("--end-group");
5952 }
5953
5954 //----------------------------------------------------------------------------
5955 // End files
5956 //----------------------------------------------------------------------------
5957 if (incStdLib && incStartFiles) {
5958 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5959 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5960 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005961}
5962
Douglas Katzman95354292015-06-23 20:42:09 +00005963void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5964 const InputInfo &Output,
5965 const InputInfoList &Inputs,
5966 const ArgList &Args,
5967 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005968
Douglas Katzman54366072015-07-27 16:53:08 +00005969 const toolchains::HexagonToolChain &ToolChain =
5970 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005971
5972 ArgStringList CmdArgs;
5973 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
5974 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00005975
5976 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005977 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00005978 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005979}
5980// Hexagon tools end.
5981
Tom Stellard8fa33092015-07-18 01:49:05 +00005982void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5983 const InputInfo &Output,
5984 const InputInfoList &Inputs,
5985 const ArgList &Args,
5986 const char *LinkingOutput) const {
5987
5988 std::string Linker = getToolChain().GetProgramPath(getShortName());
5989 ArgStringList CmdArgs;
5990 CmdArgs.push_back("-flavor");
5991 CmdArgs.push_back("gnu");
5992 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00005993 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00005994 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5995 CmdArgs.push_back("-o");
5996 CmdArgs.push_back(Output.getFilename());
5997 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5998 CmdArgs, Inputs));
5999}
6000// AMDGPU tools end.
6001
Renato Golin7c542b42015-07-27 23:44:45 +00006002const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006003 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006004 if (!Arch.empty())
6005 MArch = Arch;
6006 else
Bernard Ogden31561762013-12-12 13:27:11 +00006007 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006008 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00006009
6010 // Handle -march=native.
6011 if (MArch == "native") {
6012 std::string CPU = llvm::sys::getHostCPUName();
6013 if (CPU != "generic") {
6014 // Translate the native cpu into the architecture suffix for that CPU.
6015 const char *Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
6016 // If there is no valid architecture suffix for this CPU we don't know how
6017 // to handle it, so return no architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006018 if (strcmp(Suffix, "") == 0)
John Brawn94fd9632015-05-21 12:19:49 +00006019 MArch = "";
6020 else
6021 MArch = std::string("arm") + Suffix;
6022 }
6023 }
6024
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006025 return MArch;
6026}
6027/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006028const char *arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006029 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006030 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6031 // here means an -march=native that we can't handle, so instead return no CPU.
6032 if (MArch.empty())
6033 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00006034
John Brawna95c1a82015-05-08 12:52:18 +00006035 // We need to return an empty string here on invalid MArch values as the
6036 // various places that call this function can't cope with a null result.
6037 const char *result = Triple.getARMCPUForArch(MArch);
6038 if (result)
6039 return result;
6040 else
6041 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00006042}
6043
6044/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006045std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006046 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006047 // FIXME: Warn on inconsistent use of -mcpu and -march.
6048 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006049 if (!CPU.empty()) {
6050 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006051 // Handle -mcpu=native.
6052 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006053 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006054 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006055 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006056 }
6057
Renato Goline17c5802015-07-27 23:44:42 +00006058 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006059}
6060
6061/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006062/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006063// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006064const char *arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00006065 if (CPU == "generic")
6066 return llvm::ARMTargetParser::getSubArch(
6067 llvm::ARMTargetParser::parseArch(Arch));
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006068
Renato Golin3c007252015-05-28 15:05:53 +00006069 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
6070 if (ArchKind == llvm::ARM::AK_INVALID)
6071 return "";
6072 return llvm::ARMTargetParser::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006073}
6074
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006075void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006076 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006077 if (Args.hasArg(options::OPT_r))
6078 return;
6079
John Brawn94fd9632015-05-21 12:19:49 +00006080 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6081 // to generate BE-8 executables.
6082 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6083 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006084}
6085
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006086mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
6087 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6088 .Case("mips1", NanLegacy)
6089 .Case("mips2", NanLegacy)
6090 .Case("mips3", NanLegacy)
6091 .Case("mips4", NanLegacy)
6092 .Case("mips5", NanLegacy)
6093 .Case("mips32", NanLegacy)
6094 .Case("mips32r2", NanLegacy)
6095 .Case("mips32r3", NanLegacy | Nan2008)
6096 .Case("mips32r5", NanLegacy | Nan2008)
6097 .Case("mips32r6", Nan2008)
6098 .Case("mips64", NanLegacy)
6099 .Case("mips64r2", NanLegacy)
6100 .Case("mips64r3", NanLegacy | Nan2008)
6101 .Case("mips64r5", NanLegacy | Nan2008)
6102 .Case("mips64r6", Nan2008)
6103 .Default(NanLegacy);
6104}
6105
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006106bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6107 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6108 return A && (A->getValue() == StringRef(Value));
6109}
6110
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006111bool mips::isUCLibc(const ArgList &Args) {
6112 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006113 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006114}
6115
Daniel Sanders2bf13662014-07-10 14:40:57 +00006116bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006117 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6118 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006119 .Case("2008", true)
6120 .Case("legacy", false)
6121 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006122
6123 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006124 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006125 .Cases("mips32r6", "mips64r6", true)
6126 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006127
6128 return false;
6129}
6130
Daniel Sanders379d44b2014-07-16 11:52:23 +00006131bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Toma Tabacu94ea6862015-06-16 13:54:13 +00006132 StringRef ABIName, StringRef FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006133 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006134 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006135 return false;
6136
6137 if (ABIName != "32")
6138 return false;
6139
Toma Tabacu94ea6862015-06-16 13:54:13 +00006140 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6141 // present.
6142 if (FloatABI == "soft")
6143 return false;
6144
Daniel Sanders379d44b2014-07-16 11:52:23 +00006145 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006146 .Cases("mips2", "mips3", "mips4", "mips5", true)
6147 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6148 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6149 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006150}
6151
Toma Tabacu94ea6862015-06-16 13:54:13 +00006152bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6153 StringRef CPUName, StringRef ABIName,
6154 StringRef FloatABI) {
6155 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6156
6157 // FPXX shouldn't be used if -msingle-float is present.
6158 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6159 options::OPT_mdouble_float))
6160 if (A->getOption().matches(options::OPT_msingle_float))
6161 UseFPXX = false;
6162
6163 return UseFPXX;
6164}
6165
Tim Northover157d9112014-01-16 08:48:16 +00006166llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006167 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6168 // archs which Darwin doesn't use.
6169
6170 // The matching this routine does is fairly pointless, since it is neither the
6171 // complete architecture list, nor a reasonable subset. The problem is that
6172 // historically the driver driver accepts this and also ties its -march=
6173 // handling to the architecture name, so we need to be careful before removing
6174 // support for it.
6175
6176 // This code must be kept in sync with Clang's Darwin specific argument
6177 // translation.
6178
6179 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006180 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6181 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6182 .Case("ppc64", llvm::Triple::ppc64)
6183 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6184 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6185 llvm::Triple::x86)
6186 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6187 // This is derived from the driver driver.
6188 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6189 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6190 .Cases("armv7s", "xscale", llvm::Triple::arm)
6191 .Case("arm64", llvm::Triple::aarch64)
6192 .Case("r600", llvm::Triple::r600)
6193 .Case("amdgcn", llvm::Triple::amdgcn)
6194 .Case("nvptx", llvm::Triple::nvptx)
6195 .Case("nvptx64", llvm::Triple::nvptx64)
6196 .Case("amdil", llvm::Triple::amdil)
6197 .Case("spir", llvm::Triple::spir)
6198 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006199}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006200
Tim Northover157d9112014-01-16 08:48:16 +00006201void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006202 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006203 T.setArch(Arch);
6204
6205 if (Str == "x86_64h")
6206 T.setArchName(Str);
6207 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6208 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006209 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006210 }
6211}
6212
Bob Wilsondecc03e2012-11-23 06:14:39 +00006213const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006214 const InputInfo &Input) {
6215 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006216}
6217
Bob Wilsondecc03e2012-11-23 06:14:39 +00006218const char *Clang::getBaseInputStem(const ArgList &Args,
6219 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006220 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006221
Chris Lattner906bb902011-01-16 08:14:11 +00006222 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006223 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006224
6225 return Str;
6226}
6227
Bob Wilsondecc03e2012-11-23 06:14:39 +00006228const char *Clang::getDependencyFileName(const ArgList &Args,
6229 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006230 // FIXME: Think about this more.
6231 std::string Res;
6232
6233 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006234 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006235 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006236 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006237 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006238 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006239 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006240}
6241
Douglas Katzman95354292015-06-23 20:42:09 +00006242void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6243 const InputInfo &Output,
6244 const InputInfoList &Inputs,
6245 const ArgList &Args,
6246 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006247 const ToolChain &ToolChain = getToolChain();
6248 const Driver &D = ToolChain.getDriver();
6249 ArgStringList CmdArgs;
6250
6251 // Silence warning for "clang -g foo.o -o foo"
6252 Args.ClaimAllArgs(options::OPT_g_Group);
6253 // and "clang -emit-llvm foo.o -o foo"
6254 Args.ClaimAllArgs(options::OPT_emit_llvm);
6255 // and for "clang -w foo.o -o foo". Other warning options are already
6256 // handled somewhere else.
6257 Args.ClaimAllArgs(options::OPT_w);
6258
6259 if (!D.SysRoot.empty())
6260 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6261
6262 // CloudABI only supports static linkage.
6263 CmdArgs.push_back("-Bstatic");
6264 CmdArgs.push_back("--eh-frame-hdr");
6265 CmdArgs.push_back("--gc-sections");
6266
6267 if (Output.isFilename()) {
6268 CmdArgs.push_back("-o");
6269 CmdArgs.push_back(Output.getFilename());
6270 } else {
6271 assert(Output.isNothing() && "Invalid output.");
6272 }
6273
6274 if (!Args.hasArg(options::OPT_nostdlib) &&
6275 !Args.hasArg(options::OPT_nostartfiles)) {
6276 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6277 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6278 }
6279
6280 Args.AddAllArgs(CmdArgs, options::OPT_L);
6281 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6282 for (const auto &Path : Paths)
6283 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006284 Args.AddAllArgs(CmdArgs,
6285 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6286 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006287
Alexey Samsonov907880e2015-06-19 19:57:46 +00006288 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006289 AddGoldPlugin(ToolChain, Args, CmdArgs);
6290
6291 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6292
6293 if (!Args.hasArg(options::OPT_nostdlib) &&
6294 !Args.hasArg(options::OPT_nodefaultlibs)) {
6295 if (D.CCCIsCXX())
6296 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6297 CmdArgs.push_back("-lc");
6298 CmdArgs.push_back("-lcompiler_rt");
6299 }
6300
6301 if (!Args.hasArg(options::OPT_nostdlib) &&
6302 !Args.hasArg(options::OPT_nostartfiles))
6303 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6304
6305 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006306 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006307}
6308
Douglas Katzman95354292015-06-23 20:42:09 +00006309void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6310 const InputInfo &Output,
6311 const InputInfoList &Inputs,
6312 const ArgList &Args,
6313 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006314 ArgStringList CmdArgs;
6315
6316 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6317 const InputInfo &Input = Inputs[0];
6318
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006319 // Determine the original source input.
6320 const Action *SourceAction = &JA;
6321 while (SourceAction->getKind() != Action::InputClass) {
6322 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6323 SourceAction = SourceAction->getInputs()[0];
6324 }
6325
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006326 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006327 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006328 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6329 // FIXME: at run-time detect assembler capabilities or rely on version
6330 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006331 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006332 const llvm::Triple &T(getToolChain().getTriple());
6333 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006334 CmdArgs.push_back("-Q");
6335 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006336
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006337 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006338 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006339 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006340 if (Args.hasArg(options::OPT_gstabs))
6341 CmdArgs.push_back("--gstabs");
6342 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006343 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006344 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006345
Daniel Dunbarbe220842009-03-20 16:06:39 +00006346 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006347 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006348
Daniel Dunbar6d484762010-07-22 01:47:22 +00006349 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006350 if (getToolChain().getArch() == llvm::Triple::x86 ||
6351 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006352 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6353 CmdArgs.push_back("-force_cpusubtype_ALL");
6354
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006355 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006356 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006357 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006358 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006359 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006360 CmdArgs.push_back("-static");
6361
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006362 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006363
6364 assert(Output.isFilename() && "Unexpected lipo output.");
6365 CmdArgs.push_back("-o");
6366 CmdArgs.push_back(Output.getFilename());
6367
Daniel Dunbarb440f562010-08-02 02:38:21 +00006368 assert(Input.isFilename() && "Invalid input.");
6369 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006370
6371 // asm_final spec is empty.
6372
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006373 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006374 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006375}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006376
Tim Northover157d9112014-01-16 08:48:16 +00006377void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006378
Tim Northover157d9112014-01-16 08:48:16 +00006379void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6380 ArgStringList &CmdArgs) const {
6381 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006382
Daniel Dunbarc1964212009-03-26 16:23:12 +00006383 // Derived from darwin_arch spec.
6384 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006385 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006386
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006387 // FIXME: Is this needed anymore?
6388 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006389 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006390}
6391
Douglas Katzman95354292015-06-23 20:42:09 +00006392bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006393 // We only need to generate a temp path for LTO if we aren't compiling object
6394 // files. When compiling source files, we run 'dsymutil' after linking. We
6395 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006396 for (const auto &Input : Inputs)
6397 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006398 return true;
6399
6400 return false;
6401}
6402
Douglas Katzman95354292015-06-23 20:42:09 +00006403void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6404 ArgStringList &CmdArgs,
6405 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006406 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006407 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006408
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006409 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006410 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6411 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006412 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6413 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006414 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006415 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006416 }
6417
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006418 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006419 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006420 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6421 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006422
Bob Wilson3d27dad2013-08-02 22:25:34 +00006423 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6424 CmdArgs.push_back("-export_dynamic");
6425
Bob Wilsonb111ec92015-03-02 19:01:14 +00006426 // If we are using App Extension restrictions, pass a flag to the linker
6427 // telling it that the compiled code has been audited.
6428 if (Args.hasFlag(options::OPT_fapplication_extension,
6429 options::OPT_fno_application_extension, false))
6430 CmdArgs.push_back("-application_extension");
6431
Bill Wendling313b6bf2012-11-16 23:03:00 +00006432 // If we are using LTO, then automatically create a temporary file path for
6433 // the linker to use, so that it's lifetime will extend past a possible
6434 // dsymutil step.
Alexey Samsonov907880e2015-06-19 19:57:46 +00006435 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006436 const char *TmpPath = C.getArgs().MakeArgString(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006437 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Bill Wendling313b6bf2012-11-16 23:03:00 +00006438 C.addTempFile(TmpPath);
6439 CmdArgs.push_back("-object_path_lto");
6440 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006441 }
6442
Daniel Dunbarc1964212009-03-26 16:23:12 +00006443 // Derived from the "link" spec.
6444 Args.AddAllArgs(CmdArgs, options::OPT_static);
6445 if (!Args.hasArg(options::OPT_static))
6446 CmdArgs.push_back("-dynamic");
6447 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6448 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6449 // here. How do we wish to handle such things?
6450 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006451
Daniel Dunbarc1964212009-03-26 16:23:12 +00006452 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006453 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006454 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006455 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006456
6457 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6458 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6459 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6460
6461 Arg *A;
6462 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6463 (A = Args.getLastArg(options::OPT_current__version)) ||
6464 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006465 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6466 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006467
6468 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6469 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6470 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6471 } else {
6472 CmdArgs.push_back("-dylib");
6473
6474 Arg *A;
6475 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6476 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6477 (A = Args.getLastArg(options::OPT_client__name)) ||
6478 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6479 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6480 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006481 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6482 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006483
Daniel Dunbarc1964212009-03-26 16:23:12 +00006484 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6485 "-dylib_compatibility_version");
6486 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6487 "-dylib_current_version");
6488
Tim Northover157d9112014-01-16 08:48:16 +00006489 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006490
6491 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6492 "-dylib_install_name");
6493 }
6494
6495 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6496 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6497 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006498 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006499 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006500 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6501 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6502 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6503 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6504 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6505 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006506 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006507 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6508 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6509 Args.AddAllArgs(CmdArgs, options::OPT_init);
6510
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006511 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006512 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006513
Daniel Dunbarc1964212009-03-26 16:23:12 +00006514 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6515 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6516 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6517 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6518 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006519
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006520 if (const Arg *A =
6521 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6522 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006523 if (A->getOption().matches(options::OPT_fpie) ||
6524 A->getOption().matches(options::OPT_fPIE))
6525 CmdArgs.push_back("-pie");
6526 else
6527 CmdArgs.push_back("-no_pie");
6528 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006529
6530 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6531 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6532 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6533 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6534 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6535 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6536 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6537 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6538 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6539 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6540 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6541 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6542 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6543 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6544 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6545 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006546
Daniel Dunbar84384642011-05-02 21:03:47 +00006547 // Give --sysroot= preference, over the Apple specific behavior to also use
6548 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006549 StringRef sysroot = C.getSysRoot();
6550 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006551 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006552 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006553 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6554 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006555 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006556 }
6557
Daniel Dunbarc1964212009-03-26 16:23:12 +00006558 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6559 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6560 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6561 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6562 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006563 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006564 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6565 Args.AddAllArgs(CmdArgs, options::OPT_y);
6566 Args.AddLastArg(CmdArgs, options::OPT_w);
6567 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6568 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6569 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6570 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6571 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6572 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6573 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6574 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6575 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6576 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6577 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6578 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6579}
6580
Douglas Katzman95354292015-06-23 20:42:09 +00006581void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6582 const InputInfo &Output,
6583 const InputInfoList &Inputs,
6584 const ArgList &Args,
6585 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006586 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006587
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006588 // If the number of arguments surpasses the system limits, we will encode the
6589 // input files in a separate file, shortening the command line. To this end,
6590 // build a list of input file names that can be passed via a file with the
6591 // -filelist linker option.
6592 llvm::opt::ArgStringList InputFileList;
6593
Daniel Dunbarc1964212009-03-26 16:23:12 +00006594 // The logic here is derived from gcc's behavior; most of which
6595 // comes from specs (starting with link_command). Consult gcc for
6596 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006597 ArgStringList CmdArgs;
6598
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006599 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6600 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6601 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006602 for (const auto &Arg : Args)
6603 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006604 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006605 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006606 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006607 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006608 return;
6609 }
6610
Daniel Dunbarc1964212009-03-26 16:23:12 +00006611 // I'm not sure why this particular decomposition exists in gcc, but
6612 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006613 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006614
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006615 // It seems that the 'e' option is completely ignored for dynamic executables
6616 // (the default), and with static executables, the last one wins, as expected.
6617 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6618 options::OPT_Z_Flag, options::OPT_u_Group,
6619 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006620
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006621 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6622 // members of static archive libraries which implement Objective-C classes or
6623 // categories.
6624 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6625 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006626
Daniel Dunbarc1964212009-03-26 16:23:12 +00006627 CmdArgs.push_back("-o");
6628 CmdArgs.push_back(Output.getFilename());
6629
Chad Rosier06fd3c62012-05-16 23:45:12 +00006630 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006631 !Args.hasArg(options::OPT_nostartfiles))
6632 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006633
Peter Collingbournec4122c12015-06-15 21:08:13 +00006634 // SafeStack requires its own runtime libraries
6635 // These libraries should be linked first, to make sure the
6636 // __safestack_init constructor executes before everything else
6637 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6638 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6639 "libclang_rt.safestack_osx.a",
6640 /*AlwaysLink=*/true);
6641 }
6642
Daniel Dunbarc1964212009-03-26 16:23:12 +00006643 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006644
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006645 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6646 options::OPT_fno_openmp, false)) {
6647 switch (getOpenMPRuntime(getToolChain(), Args)) {
6648 case OMPRT_OMP:
6649 CmdArgs.push_back("-lomp");
6650 break;
6651 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006652 CmdArgs.push_back("-lgomp");
6653 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006654 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006655 CmdArgs.push_back("-liomp5");
6656 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006657 case OMPRT_Unknown:
6658 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006659 break;
6660 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006661 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006662
Douglas Gregor9295df02012-05-15 21:00:27 +00006663 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006664 // Build the input file for -filelist (list of linker input files) in case we
6665 // need it later
6666 for (const auto &II : Inputs) {
6667 if (!II.isFilename()) {
6668 // This is a linker input argument.
6669 // We cannot mix input arguments and file names in a -filelist input, thus
6670 // we prematurely stop our list (remaining files shall be passed as
6671 // arguments).
6672 if (InputFileList.size() > 0)
6673 break;
6674
6675 continue;
6676 }
6677
6678 InputFileList.push_back(II.getFilename());
6679 }
6680
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006681 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006682 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006683 // We use arclite library for both ARC and subscripting support.
6684 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6685
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006686 CmdArgs.push_back("-framework");
6687 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006688 // Link libobj.
6689 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006690 }
John McCall31168b02011-06-15 23:02:42 +00006691
Daniel Dunbarc1964212009-03-26 16:23:12 +00006692 if (LinkingOutput) {
6693 CmdArgs.push_back("-arch_multiple");
6694 CmdArgs.push_back("-final_output");
6695 CmdArgs.push_back(LinkingOutput);
6696 }
6697
Daniel Dunbarc1964212009-03-26 16:23:12 +00006698 if (Args.hasArg(options::OPT_fnested_functions))
6699 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006700
Justin Bognerc7701242015-05-12 05:44:36 +00006701 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6702 // paths are different enough from other toolchains that this needs a fair
6703 // amount of refactoring done first.
6704 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6705
Daniel Dunbarc1964212009-03-26 16:23:12 +00006706 if (!Args.hasArg(options::OPT_nostdlib) &&
6707 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006708 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006709 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006710
Daniel Dunbarc1964212009-03-26 16:23:12 +00006711 // link_ssp spec is empty.
6712
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006713 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006714 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006715 }
6716
Chad Rosier06fd3c62012-05-16 23:45:12 +00006717 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006718 !Args.hasArg(options::OPT_nostartfiles)) {
6719 // endfile_spec is empty.
6720 }
6721
6722 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6723 Args.AddAllArgs(CmdArgs, options::OPT_F);
6724
Steven Wu3ffb61b2015-02-06 18:08:29 +00006725 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006726 for (const Arg *A : Args.filtered(options::OPT_iframework))
6727 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006728
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006729 if (!Args.hasArg(options::OPT_nostdlib) &&
6730 !Args.hasArg(options::OPT_nodefaultlibs)) {
6731 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6732 if (A->getValue() == StringRef("Accelerate")) {
6733 CmdArgs.push_back("-framework");
6734 CmdArgs.push_back("Accelerate");
6735 }
6736 }
6737 }
6738
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006739 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006740 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006741 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006742 Cmd->setInputFileList(std::move(InputFileList));
6743 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006744}
6745
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006746void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006747 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006748 const InputInfoList &Inputs,
6749 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006750 const char *LinkingOutput) const {
6751 ArgStringList CmdArgs;
6752
6753 CmdArgs.push_back("-create");
6754 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006755
6756 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006757 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006758
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006759 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006760 assert(II.isFilename() && "Unexpected lipo input.");
6761 CmdArgs.push_back(II.getFilename());
6762 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006763
6764 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006765 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006766}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006767
Daniel Dunbar88299622010-06-04 18:28:36 +00006768void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006769 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006770 const InputInfoList &Inputs,
6771 const ArgList &Args,
6772 const char *LinkingOutput) const {
6773 ArgStringList CmdArgs;
6774
Daniel Dunbareb86b042011-05-09 17:23:16 +00006775 CmdArgs.push_back("-o");
6776 CmdArgs.push_back(Output.getFilename());
6777
Daniel Dunbar88299622010-06-04 18:28:36 +00006778 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6779 const InputInfo &Input = Inputs[0];
6780 assert(Input.isFilename() && "Unexpected dsymutil input.");
6781 CmdArgs.push_back(Input.getFilename());
6782
Daniel Dunbar88299622010-06-04 18:28:36 +00006783 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006784 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006785 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006786}
6787
Eric Christopher551ef452011-08-23 17:56:55 +00006788void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006789 const InputInfo &Output,
6790 const InputInfoList &Inputs,
6791 const ArgList &Args,
6792 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006793 ArgStringList CmdArgs;
6794 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006795 CmdArgs.push_back("--debug-info");
6796 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006797 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006798
6799 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6800 const InputInfo &Input = Inputs[0];
6801 assert(Input.isFilename() && "Unexpected verify input");
6802
6803 // Grabbing the output of the earlier dsymutil run.
6804 CmdArgs.push_back(Input.getFilename());
6805
6806 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006807 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006808 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00006809}
6810
Douglas Katzman95354292015-06-23 20:42:09 +00006811void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006812 const InputInfo &Output,
6813 const InputInfoList &Inputs,
6814 const ArgList &Args,
6815 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006816 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006817 ArgStringList CmdArgs;
6818
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006819 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006820
6821 CmdArgs.push_back("-o");
6822 CmdArgs.push_back(Output.getFilename());
6823
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006824 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006825 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006826
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006827 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006828 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006829}
6830
Douglas Katzman95354292015-06-23 20:42:09 +00006831void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6832 const InputInfo &Output,
6833 const InputInfoList &Inputs,
6834 const ArgList &Args,
6835 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006836 // FIXME: Find a real GCC, don't hard-code versions here
6837 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6838 const llvm::Triple &T = getToolChain().getTriple();
6839 std::string LibPath = "/usr/lib/";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006840 const llvm::Triple::ArchType Arch = T.getArch();
David Chisnallf571cde2012-02-15 13:39:01 +00006841 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006842 case llvm::Triple::x86:
6843 GCCLibPath +=
6844 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6845 break;
6846 case llvm::Triple::x86_64:
6847 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6848 GCCLibPath += "/4.5.2/amd64/";
6849 LibPath += "amd64/";
6850 break;
6851 default:
6852 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006853 }
6854
6855 ArgStringList CmdArgs;
6856
David Chisnall272a0712012-02-29 15:06:12 +00006857 // Demangle C++ names in errors
6858 CmdArgs.push_back("-C");
6859
David Chisnallf571cde2012-02-15 13:39:01 +00006860 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6861 (!Args.hasArg(options::OPT_shared))) {
6862 CmdArgs.push_back("-e");
6863 CmdArgs.push_back("_start");
6864 }
6865
6866 if (Args.hasArg(options::OPT_static)) {
6867 CmdArgs.push_back("-Bstatic");
6868 CmdArgs.push_back("-dn");
6869 } else {
6870 CmdArgs.push_back("-Bdynamic");
6871 if (Args.hasArg(options::OPT_shared)) {
6872 CmdArgs.push_back("-shared");
6873 } else {
6874 CmdArgs.push_back("--dynamic-linker");
6875 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6876 }
6877 }
6878
6879 if (Output.isFilename()) {
6880 CmdArgs.push_back("-o");
6881 CmdArgs.push_back(Output.getFilename());
6882 } else {
6883 assert(Output.isNothing() && "Invalid output.");
6884 }
6885
6886 if (!Args.hasArg(options::OPT_nostdlib) &&
6887 !Args.hasArg(options::OPT_nostartfiles)) {
6888 if (!Args.hasArg(options::OPT_shared)) {
6889 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6890 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006891 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006892 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6893 } else {
6894 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006895 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6896 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006897 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006898 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006899 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006900 }
6901
6902 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6903
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006904 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
6905 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00006906
6907 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6908
6909 if (!Args.hasArg(options::OPT_nostdlib) &&
6910 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006911 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006912 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006913 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006914 if (!Args.hasArg(options::OPT_shared)) {
6915 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006916 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006917 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006918 }
David Chisnallf571cde2012-02-15 13:39:01 +00006919 }
6920
6921 if (!Args.hasArg(options::OPT_nostdlib) &&
6922 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006923 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006924 }
David Chisnall96de9932012-02-16 16:00:47 +00006925 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006926
Alexey Samsonov7811d192014-02-20 13:57:37 +00006927 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006928
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006929 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006930 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006931}
6932
Douglas Katzman95354292015-06-23 20:42:09 +00006933void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6934 const InputInfo &Output,
6935 const InputInfoList &Inputs,
6936 const ArgList &Args,
6937 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006938 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006939 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006940 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006941
Rafael Espindolacc126272014-02-28 01:55:21 +00006942 switch (getToolChain().getArch()) {
6943 case llvm::Triple::x86:
6944 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6945 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006946 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006947 break;
6948
6949 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006950 CmdArgs.push_back("-mppc");
6951 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006952 break;
6953
6954 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006955 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00006956 CmdArgs.push_back("-32");
6957 NeedsKPIC = true;
6958 break;
6959
6960 case llvm::Triple::sparcv9:
6961 CmdArgs.push_back("-64");
6962 CmdArgs.push_back("-Av9a");
6963 NeedsKPIC = true;
6964 break;
6965
6966 case llvm::Triple::mips64:
6967 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006968 StringRef CPUName;
6969 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006970 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006971
6972 CmdArgs.push_back("-mabi");
6973 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6974
6975 if (getToolChain().getArch() == llvm::Triple::mips64)
6976 CmdArgs.push_back("-EB");
6977 else
6978 CmdArgs.push_back("-EL");
6979
Rafael Espindolacc126272014-02-28 01:55:21 +00006980 NeedsKPIC = true;
6981 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006982 }
6983
Rafael Espindolacc126272014-02-28 01:55:21 +00006984 default:
6985 break;
6986 }
6987
6988 if (NeedsKPIC)
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006989 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00006990
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006991 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006992
6993 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006994 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006995
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006996 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006997 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006998
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006999 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007000 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007001}
7002
Douglas Katzman95354292015-06-23 20:42:09 +00007003void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7004 const InputInfo &Output,
7005 const InputInfoList &Inputs,
7006 const ArgList &Args,
7007 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007008 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007009 ArgStringList CmdArgs;
7010
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007011 // Silence warning for "clang -g foo.o -o foo"
7012 Args.ClaimAllArgs(options::OPT_g_Group);
7013 // and "clang -emit-llvm foo.o -o foo"
7014 Args.ClaimAllArgs(options::OPT_emit_llvm);
7015 // and for "clang -w foo.o -o foo". Other warning options are already
7016 // handled somewhere else.
7017 Args.ClaimAllArgs(options::OPT_w);
7018
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007019 if (getToolChain().getArch() == llvm::Triple::mips64)
7020 CmdArgs.push_back("-EB");
7021 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7022 CmdArgs.push_back("-EL");
7023
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007024 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007025 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007026 CmdArgs.push_back("-e");
7027 CmdArgs.push_back("__start");
7028 }
7029
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007030 if (Args.hasArg(options::OPT_static)) {
7031 CmdArgs.push_back("-Bstatic");
7032 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007033 if (Args.hasArg(options::OPT_rdynamic))
7034 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007035 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007036 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007037 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007038 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007039 } else {
7040 CmdArgs.push_back("-dynamic-linker");
7041 CmdArgs.push_back("/usr/libexec/ld.so");
7042 }
7043 }
7044
Rafael Espindola044f7832013-06-05 04:28:55 +00007045 if (Args.hasArg(options::OPT_nopie))
7046 CmdArgs.push_back("-nopie");
7047
Daniel Dunbarb440f562010-08-02 02:38:21 +00007048 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007049 CmdArgs.push_back("-o");
7050 CmdArgs.push_back(Output.getFilename());
7051 } else {
7052 assert(Output.isNothing() && "Invalid output.");
7053 }
7054
7055 if (!Args.hasArg(options::OPT_nostdlib) &&
7056 !Args.hasArg(options::OPT_nostartfiles)) {
7057 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007058 if (Args.hasArg(options::OPT_pg))
7059 CmdArgs.push_back(
7060 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007061 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007062 CmdArgs.push_back(
7063 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7064 CmdArgs.push_back(
7065 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007066 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007067 CmdArgs.push_back(
7068 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007069 }
7070 }
7071
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007072 std::string Triple = getToolChain().getTripleString();
7073 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007074 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007075 CmdArgs.push_back(
7076 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007077
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007078 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7079 options::OPT_e, options::OPT_s, options::OPT_t,
7080 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007081
Daniel Dunbar54423b22010-09-17 00:24:54 +00007082 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007083
7084 if (!Args.hasArg(options::OPT_nostdlib) &&
7085 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007086 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007087 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007088 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007089 CmdArgs.push_back("-lm_p");
7090 else
7091 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007092 }
7093
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007094 // FIXME: For some reason GCC passes -lgcc before adding
7095 // the default system libraries. Just mimic this for now.
7096 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007097
Eric Christopher17674ec2012-09-13 06:32:34 +00007098 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007099 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7100 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007101 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007102 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007103 }
7104
Chandler Carruth45661652011-12-17 22:32:42 +00007105 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007106 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007107 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007108 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007109 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007110 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007111
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007112 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007113 }
7114
7115 if (!Args.hasArg(options::OPT_nostdlib) &&
7116 !Args.hasArg(options::OPT_nostartfiles)) {
7117 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007118 CmdArgs.push_back(
7119 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007120 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007121 CmdArgs.push_back(
7122 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007123 }
7124
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007125 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007126 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007127}
Ed Schoutene33194b2009-04-02 19:13:12 +00007128
Douglas Katzman95354292015-06-23 20:42:09 +00007129void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7130 const InputInfo &Output,
7131 const InputInfoList &Inputs,
7132 const ArgList &Args,
7133 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007134 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007135 ArgStringList CmdArgs;
7136
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007137 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007138
7139 CmdArgs.push_back("-o");
7140 CmdArgs.push_back(Output.getFilename());
7141
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007142 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007143 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007144
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007145 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007146 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007147}
7148
Douglas Katzman95354292015-06-23 20:42:09 +00007149void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7150 const InputInfo &Output,
7151 const InputInfoList &Inputs,
7152 const ArgList &Args,
7153 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007154 const Driver &D = getToolChain().getDriver();
7155 ArgStringList CmdArgs;
7156
7157 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7158 (!Args.hasArg(options::OPT_shared))) {
7159 CmdArgs.push_back("-e");
7160 CmdArgs.push_back("__start");
7161 }
7162
7163 if (Args.hasArg(options::OPT_static)) {
7164 CmdArgs.push_back("-Bstatic");
7165 } else {
7166 if (Args.hasArg(options::OPT_rdynamic))
7167 CmdArgs.push_back("-export-dynamic");
7168 CmdArgs.push_back("--eh-frame-hdr");
7169 CmdArgs.push_back("-Bdynamic");
7170 if (Args.hasArg(options::OPT_shared)) {
7171 CmdArgs.push_back("-shared");
7172 } else {
7173 CmdArgs.push_back("-dynamic-linker");
7174 CmdArgs.push_back("/usr/libexec/ld.so");
7175 }
7176 }
7177
7178 if (Output.isFilename()) {
7179 CmdArgs.push_back("-o");
7180 CmdArgs.push_back(Output.getFilename());
7181 } else {
7182 assert(Output.isNothing() && "Invalid output.");
7183 }
7184
7185 if (!Args.hasArg(options::OPT_nostdlib) &&
7186 !Args.hasArg(options::OPT_nostartfiles)) {
7187 if (!Args.hasArg(options::OPT_shared)) {
7188 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007189 CmdArgs.push_back(
7190 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007191 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007192 CmdArgs.push_back(
7193 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7194 CmdArgs.push_back(
7195 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007196 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007197 CmdArgs.push_back(
7198 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007199 }
7200 }
7201
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007202 Args.AddAllArgs(CmdArgs,
7203 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007204
7205 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7206
7207 if (!Args.hasArg(options::OPT_nostdlib) &&
7208 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007209 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007210 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7211 if (Args.hasArg(options::OPT_pg))
7212 CmdArgs.push_back("-lm_p");
7213 else
7214 CmdArgs.push_back("-lm");
7215 }
7216
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007217 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007218 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007219 CmdArgs.push_back("-lpthread_p");
7220 else
7221 CmdArgs.push_back("-lpthread");
7222 }
7223
Eli Friedman9fa28852012-08-08 23:57:20 +00007224 if (!Args.hasArg(options::OPT_shared)) {
7225 if (Args.hasArg(options::OPT_pg))
7226 CmdArgs.push_back("-lc_p");
7227 else
7228 CmdArgs.push_back("-lc");
7229 }
7230
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007231 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007232 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007233 case llvm::Triple::arm:
7234 MyArch = "arm";
7235 break;
7236 case llvm::Triple::x86:
7237 MyArch = "i386";
7238 break;
7239 case llvm::Triple::x86_64:
7240 MyArch = "amd64";
7241 break;
7242 default:
7243 llvm_unreachable("Unsupported architecture");
7244 }
7245 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007246 }
7247
7248 if (!Args.hasArg(options::OPT_nostdlib) &&
7249 !Args.hasArg(options::OPT_nostartfiles)) {
7250 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007251 CmdArgs.push_back(
7252 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007253 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007254 CmdArgs.push_back(
7255 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007256 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007257
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007258 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007259 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007260}
7261
Douglas Katzman95354292015-06-23 20:42:09 +00007262void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7263 const InputInfo &Output,
7264 const InputInfoList &Inputs,
7265 const ArgList &Args,
7266 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007267 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007268 ArgStringList CmdArgs;
7269
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007270 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7271 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007272 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007273 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007274 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007275 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007276 else if (getToolChain().getArch() == llvm::Triple::mips ||
7277 getToolChain().getArch() == llvm::Triple::mipsel ||
7278 getToolChain().getArch() == llvm::Triple::mips64 ||
7279 getToolChain().getArch() == llvm::Triple::mips64el) {
7280 StringRef CPUName;
7281 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007282 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007283
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007284 CmdArgs.push_back("-march");
7285 CmdArgs.push_back(CPUName.data());
7286
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007287 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007288 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007289
7290 if (getToolChain().getArch() == llvm::Triple::mips ||
7291 getToolChain().getArch() == llvm::Triple::mips64)
7292 CmdArgs.push_back("-EB");
7293 else
7294 CmdArgs.push_back("-EL");
7295
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007296 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007297 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007298 getToolChain().getArch() == llvm::Triple::armeb ||
7299 getToolChain().getArch() == llvm::Triple::thumb ||
7300 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00007301 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007302 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00007303 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
7304
7305 if (FloatABI == "hard") {
7306 CmdArgs.push_back("-mfpu=vfp");
7307 } else {
7308 CmdArgs.push_back("-mfpu=softvfp");
7309 }
7310
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007311 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007312 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007313 case llvm::Triple::GNUEABI:
7314 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007315 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007316 break;
7317
7318 default:
7319 CmdArgs.push_back("-matpcs");
7320 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007321 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007322 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007323 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007324 if (getToolChain().getArch() == llvm::Triple::sparc)
7325 CmdArgs.push_back("-Av8plusa");
7326 else
7327 CmdArgs.push_back("-Av9a");
7328
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007329 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007330 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007331
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007332 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007333
7334 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007335 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007336
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007337 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007338 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007339
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007340 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007341 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007342}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007343
Douglas Katzman95354292015-06-23 20:42:09 +00007344void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7345 const InputInfo &Output,
7346 const InputInfoList &Inputs,
7347 const ArgList &Args,
7348 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007349 const toolchains::FreeBSD &ToolChain =
7350 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007351 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007352 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007353 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007354 !Args.hasArg(options::OPT_shared) &&
7355 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007356 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007357
7358 // Silence warning for "clang -g foo.o -o foo"
7359 Args.ClaimAllArgs(options::OPT_g_Group);
7360 // and "clang -emit-llvm foo.o -o foo"
7361 Args.ClaimAllArgs(options::OPT_emit_llvm);
7362 // and for "clang -w foo.o -o foo". Other warning options are already
7363 // handled somewhere else.
7364 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007365
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007366 if (!D.SysRoot.empty())
7367 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7368
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007369 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007370 CmdArgs.push_back("-pie");
7371
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007372 if (Args.hasArg(options::OPT_static)) {
7373 CmdArgs.push_back("-Bstatic");
7374 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007375 if (Args.hasArg(options::OPT_rdynamic))
7376 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007377 CmdArgs.push_back("--eh-frame-hdr");
7378 if (Args.hasArg(options::OPT_shared)) {
7379 CmdArgs.push_back("-Bshareable");
7380 } else {
7381 CmdArgs.push_back("-dynamic-linker");
7382 CmdArgs.push_back("/libexec/ld-elf.so.1");
7383 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007384 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007385 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7386 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7387 CmdArgs.push_back("--hash-style=both");
7388 }
7389 }
7390 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007391 }
7392
7393 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7394 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007395 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007396 CmdArgs.push_back("-m");
7397 CmdArgs.push_back("elf_i386_fbsd");
7398 }
7399
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007400 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007401 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007402 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007403 }
7404
Daniel Dunbarb440f562010-08-02 02:38:21 +00007405 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007406 CmdArgs.push_back("-o");
7407 CmdArgs.push_back(Output.getFilename());
7408 } else {
7409 assert(Output.isNothing() && "Invalid output.");
7410 }
7411
7412 if (!Args.hasArg(options::OPT_nostdlib) &&
7413 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007414 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007415 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007416 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007417 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007418 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007419 crt1 = "Scrt1.o";
7420 else
7421 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007422 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007423 if (crt1)
7424 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7425
7426 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7427
Craig Topper92fc2df2014-05-17 16:56:41 +00007428 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007429 if (Args.hasArg(options::OPT_static))
7430 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007431 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007432 crtbegin = "crtbeginS.o";
7433 else
7434 crtbegin = "crtbegin.o";
7435
7436 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007437 }
7438
7439 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007440 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007441 for (const auto &Path : Paths)
7442 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007443 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7444 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007445 Args.AddAllArgs(CmdArgs, options::OPT_s);
7446 Args.AddAllArgs(CmdArgs, options::OPT_t);
7447 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7448 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007449
Alexey Samsonov907880e2015-06-19 19:57:46 +00007450 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007451 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007452
Alexey Samsonov52550342014-09-15 19:58:40 +00007453 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007454 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007455
7456 if (!Args.hasArg(options::OPT_nostdlib) &&
7457 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007458 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007459 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007460 if (Args.hasArg(options::OPT_pg))
7461 CmdArgs.push_back("-lm_p");
7462 else
7463 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007464 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007465 if (NeedsSanitizerDeps)
7466 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007467 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7468 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007469 if (Args.hasArg(options::OPT_pg))
7470 CmdArgs.push_back("-lgcc_p");
7471 else
7472 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007473 if (Args.hasArg(options::OPT_static)) {
7474 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007475 } else if (Args.hasArg(options::OPT_pg)) {
7476 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007477 } else {
7478 CmdArgs.push_back("--as-needed");
7479 CmdArgs.push_back("-lgcc_s");
7480 CmdArgs.push_back("--no-as-needed");
7481 }
7482
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007483 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007484 if (Args.hasArg(options::OPT_pg))
7485 CmdArgs.push_back("-lpthread_p");
7486 else
7487 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007488 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007489
Roman Divacky66f22762011-02-10 16:59:40 +00007490 if (Args.hasArg(options::OPT_pg)) {
7491 if (Args.hasArg(options::OPT_shared))
7492 CmdArgs.push_back("-lc");
7493 else
7494 CmdArgs.push_back("-lc_p");
7495 CmdArgs.push_back("-lgcc_p");
7496 } else {
7497 CmdArgs.push_back("-lc");
7498 CmdArgs.push_back("-lgcc");
7499 }
7500
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007501 if (Args.hasArg(options::OPT_static)) {
7502 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007503 } else if (Args.hasArg(options::OPT_pg)) {
7504 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007505 } else {
7506 CmdArgs.push_back("--as-needed");
7507 CmdArgs.push_back("-lgcc_s");
7508 CmdArgs.push_back("--no-as-needed");
7509 }
7510 }
7511
7512 if (!Args.hasArg(options::OPT_nostdlib) &&
7513 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007514 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007515 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007516 else
7517 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007518 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007519 }
7520
Alexey Samsonov7811d192014-02-20 13:57:37 +00007521 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007522
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007523 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007524 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007525}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007526
Douglas Katzman95354292015-06-23 20:42:09 +00007527void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007528 const InputInfo &Output,
7529 const InputInfoList &Inputs,
7530 const ArgList &Args,
7531 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007532 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007533 ArgStringList CmdArgs;
7534
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007535 // GNU as needs different flags for creating the correct output format
7536 // on architectures with different ABIs or optional feature sets.
7537 switch (getToolChain().getArch()) {
7538 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007539 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007540 break;
7541 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007542 case llvm::Triple::armeb:
7543 case llvm::Triple::thumb:
7544 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007545 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007546 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7547 std::string Arch =
7548 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007549 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007550 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007551 }
7552
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007553 case llvm::Triple::mips:
7554 case llvm::Triple::mipsel:
7555 case llvm::Triple::mips64:
7556 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007557 StringRef CPUName;
7558 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007559 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007560
7561 CmdArgs.push_back("-march");
7562 CmdArgs.push_back(CPUName.data());
7563
7564 CmdArgs.push_back("-mabi");
7565 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7566
7567 if (getToolChain().getArch() == llvm::Triple::mips ||
7568 getToolChain().getArch() == llvm::Triple::mips64)
7569 CmdArgs.push_back("-EB");
7570 else
7571 CmdArgs.push_back("-EL");
7572
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007573 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007574 break;
7575 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007576
7577 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007578 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007579 CmdArgs.push_back("-32");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007580 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007581 break;
7582
7583 case llvm::Triple::sparcv9:
7584 CmdArgs.push_back("-64");
7585 CmdArgs.push_back("-Av9");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007586 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007587 break;
7588
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007589 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007590 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007591 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007592
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007593 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007594
7595 CmdArgs.push_back("-o");
7596 CmdArgs.push_back(Output.getFilename());
7597
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007598 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007599 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007600
David Chisnallddbd68f2011-09-27 22:03:18 +00007601 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007602 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007603}
7604
Douglas Katzman95354292015-06-23 20:42:09 +00007605void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7606 const InputInfo &Output,
7607 const InputInfoList &Inputs,
7608 const ArgList &Args,
7609 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007610 const Driver &D = getToolChain().getDriver();
7611 ArgStringList CmdArgs;
7612
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007613 if (!D.SysRoot.empty())
7614 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7615
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007616 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007617 if (Args.hasArg(options::OPT_static)) {
7618 CmdArgs.push_back("-Bstatic");
7619 } else {
7620 if (Args.hasArg(options::OPT_rdynamic))
7621 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007622 if (Args.hasArg(options::OPT_shared)) {
7623 CmdArgs.push_back("-Bshareable");
7624 } else {
7625 CmdArgs.push_back("-dynamic-linker");
7626 CmdArgs.push_back("/libexec/ld.elf_so");
7627 }
7628 }
7629
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007630 // Many NetBSD architectures support more than one ABI.
7631 // Determine the correct emulation for ld.
7632 switch (getToolChain().getArch()) {
7633 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007634 CmdArgs.push_back("-m");
7635 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007636 break;
7637 case llvm::Triple::arm:
7638 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007639 CmdArgs.push_back("-m");
7640 switch (getToolChain().getTriple().getEnvironment()) {
7641 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007642 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007643 CmdArgs.push_back("armelf_nbsd_eabi");
7644 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007645 case llvm::Triple::EABIHF:
7646 case llvm::Triple::GNUEABIHF:
7647 CmdArgs.push_back("armelf_nbsd_eabihf");
7648 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007649 default:
7650 CmdArgs.push_back("armelf_nbsd");
7651 break;
7652 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007653 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007654 case llvm::Triple::armeb:
7655 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007656 arm::appendEBLinkFlags(
7657 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007658 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007659 CmdArgs.push_back("-m");
7660 switch (getToolChain().getTriple().getEnvironment()) {
7661 case llvm::Triple::EABI:
7662 case llvm::Triple::GNUEABI:
7663 CmdArgs.push_back("armelfb_nbsd_eabi");
7664 break;
7665 case llvm::Triple::EABIHF:
7666 case llvm::Triple::GNUEABIHF:
7667 CmdArgs.push_back("armelfb_nbsd_eabihf");
7668 break;
7669 default:
7670 CmdArgs.push_back("armelfb_nbsd");
7671 break;
7672 }
7673 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007674 case llvm::Triple::mips64:
7675 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007676 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007677 CmdArgs.push_back("-m");
7678 if (getToolChain().getArch() == llvm::Triple::mips64)
7679 CmdArgs.push_back("elf32btsmip");
7680 else
7681 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007682 } else if (mips::hasMipsAbiArg(Args, "64")) {
7683 CmdArgs.push_back("-m");
7684 if (getToolChain().getArch() == llvm::Triple::mips64)
7685 CmdArgs.push_back("elf64btsmip");
7686 else
7687 CmdArgs.push_back("elf64ltsmip");
7688 }
7689 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007690 case llvm::Triple::ppc:
7691 CmdArgs.push_back("-m");
7692 CmdArgs.push_back("elf32ppc_nbsd");
7693 break;
7694
7695 case llvm::Triple::ppc64:
7696 case llvm::Triple::ppc64le:
7697 CmdArgs.push_back("-m");
7698 CmdArgs.push_back("elf64ppc");
7699 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007700
7701 case llvm::Triple::sparc:
7702 CmdArgs.push_back("-m");
7703 CmdArgs.push_back("elf32_sparc");
7704 break;
7705
7706 case llvm::Triple::sparcv9:
7707 CmdArgs.push_back("-m");
7708 CmdArgs.push_back("elf64_sparc");
7709 break;
7710
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007711 default:
7712 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007713 }
7714
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007715 if (Output.isFilename()) {
7716 CmdArgs.push_back("-o");
7717 CmdArgs.push_back(Output.getFilename());
7718 } else {
7719 assert(Output.isNothing() && "Invalid output.");
7720 }
7721
7722 if (!Args.hasArg(options::OPT_nostdlib) &&
7723 !Args.hasArg(options::OPT_nostartfiles)) {
7724 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007725 CmdArgs.push_back(
7726 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7727 CmdArgs.push_back(
7728 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7729 CmdArgs.push_back(
7730 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007731 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007732 CmdArgs.push_back(
7733 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7734 CmdArgs.push_back(
7735 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007736 }
7737 }
7738
7739 Args.AddAllArgs(CmdArgs, options::OPT_L);
7740 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7741 Args.AddAllArgs(CmdArgs, options::OPT_e);
7742 Args.AddAllArgs(CmdArgs, options::OPT_s);
7743 Args.AddAllArgs(CmdArgs, options::OPT_t);
7744 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7745 Args.AddAllArgs(CmdArgs, options::OPT_r);
7746
7747 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7748
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007749 unsigned Major, Minor, Micro;
7750 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7751 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007752 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007753 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007754 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007755 case llvm::Triple::arm:
7756 case llvm::Triple::armeb:
7757 case llvm::Triple::thumb:
7758 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007759 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007760 case llvm::Triple::ppc64:
7761 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007762 case llvm::Triple::x86:
7763 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007764 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007765 break;
7766 default:
7767 break;
7768 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007769 }
7770
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007771 if (!Args.hasArg(options::OPT_nostdlib) &&
7772 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007773 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007774 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7775 CmdArgs.push_back("-lm");
7776 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007777 if (Args.hasArg(options::OPT_pthread))
7778 CmdArgs.push_back("-lpthread");
7779 CmdArgs.push_back("-lc");
7780
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007781 if (useLibgcc) {
7782 if (Args.hasArg(options::OPT_static)) {
7783 // libgcc_eh depends on libc, so resolve as much as possible,
7784 // pull in any new requirements from libc and then get the rest
7785 // of libgcc.
7786 CmdArgs.push_back("-lgcc_eh");
7787 CmdArgs.push_back("-lc");
7788 CmdArgs.push_back("-lgcc");
7789 } else {
7790 CmdArgs.push_back("-lgcc");
7791 CmdArgs.push_back("--as-needed");
7792 CmdArgs.push_back("-lgcc_s");
7793 CmdArgs.push_back("--no-as-needed");
7794 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007795 }
7796 }
7797
7798 if (!Args.hasArg(options::OPT_nostdlib) &&
7799 !Args.hasArg(options::OPT_nostartfiles)) {
7800 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007801 CmdArgs.push_back(
7802 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007803 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007804 CmdArgs.push_back(
7805 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7806 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007807 }
7808
Alexey Samsonov7811d192014-02-20 13:57:37 +00007809 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007810
Logan Chieneb9162f2014-06-26 14:23:45 +00007811 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007812 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007813}
7814
Douglas Katzman95354292015-06-23 20:42:09 +00007815void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7816 const InputInfo &Output,
7817 const InputInfoList &Inputs,
7818 const ArgList &Args,
7819 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007820 claimNoWarnArgs(Args);
7821
James Y Knight2db38f32015-08-15 03:45:25 +00007822 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
7823 llvm::Triple Triple = llvm::Triple(TripleStr);
7824
Rafael Espindola92b00932010-08-10 00:25:48 +00007825 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007826 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007827
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007828 llvm::Reloc::Model RelocationModel;
7829 unsigned PICLevel;
7830 bool IsPIE;
7831 std::tie(RelocationModel, PICLevel, IsPIE) =
7832 ParsePICArgs(getToolChain(), Triple, Args);
7833
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007834 switch (getToolChain().getArch()) {
7835 default:
7836 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007837 // Add --32/--64 to make sure we get the format we want.
7838 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007839 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007840 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007841 break;
7842 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007843 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7844 CmdArgs.push_back("--x32");
7845 else
7846 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007847 break;
7848 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007849 CmdArgs.push_back("-a32");
7850 CmdArgs.push_back("-mppc");
7851 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007852 break;
7853 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007854 CmdArgs.push_back("-a64");
7855 CmdArgs.push_back("-mppc64");
7856 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007857 break;
7858 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007859 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007860 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007861 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007862 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007863 break;
7864 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007865 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007866 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007867 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007868 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007869 break;
7870 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007871 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007872 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007873 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007874 break;
7875 case llvm::Triple::arm:
7876 case llvm::Triple::armeb:
7877 case llvm::Triple::thumb:
7878 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00007879 const llvm::Triple &Triple2 = getToolChain().getTriple();
7880 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00007881 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007882 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007883 break;
7884 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007885 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007886 break;
7887 default:
7888 break;
7889 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007890
James Y Knight2db38f32015-08-15 03:45:25 +00007891 StringRef ARMFloatABI =
7892 tools::arm::getARMFloatABI(getToolChain().getDriver(), Args, Triple);
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007893 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007894
7895 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007896
7897 // FIXME: remove krait check when GNU tools support krait cpu
7898 // for now replace it with -march=armv7-a to avoid a lower
7899 // march from being picked in the absence of a cpu flag.
7900 Arg *A;
7901 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007902 StringRef(A->getValue()).lower() == "krait")
7903 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00007904 else
7905 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007906 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007907 break;
7908 }
7909 case llvm::Triple::mips:
7910 case llvm::Triple::mipsel:
7911 case llvm::Triple::mips64:
7912 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007913 StringRef CPUName;
7914 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007915 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007916 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007917
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007918 CmdArgs.push_back("-march");
7919 CmdArgs.push_back(CPUName.data());
7920
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007921 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007922 CmdArgs.push_back(ABIName.data());
7923
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007924 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7925 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007926 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007927 CmdArgs.push_back("-mno-shared");
7928
Daniel Sanders379d44b2014-07-16 11:52:23 +00007929 // LLVM doesn't support -mplt yet and acts as if it is always given.
7930 // However, -mplt has no effect with the N64 ABI.
7931 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007932
7933 if (getToolChain().getArch() == llvm::Triple::mips ||
7934 getToolChain().getArch() == llvm::Triple::mips64)
7935 CmdArgs.push_back("-EB");
7936 else
7937 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007938
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007939 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7940 if (StringRef(A->getValue()) == "2008")
7941 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7942 }
7943
Daniel Sanders379d44b2014-07-16 11:52:23 +00007944 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
Toma Tabacu94ea6862015-06-16 13:54:13 +00007945 StringRef MIPSFloatABI = getMipsFloatABI(getToolChain().getDriver(), Args);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007946 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7947 options::OPT_mfp64)) {
7948 A->claim();
7949 A->render(Args, CmdArgs);
Toma Tabacu94ea6862015-06-16 13:54:13 +00007950 } else if (mips::shouldUseFPXX(Args, getToolChain().getTriple(), CPUName,
7951 ABIName, MIPSFloatABI))
Daniel Sanders379d44b2014-07-16 11:52:23 +00007952 CmdArgs.push_back("-mfpxx");
7953
7954 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7955 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007956 if (Arg *A =
7957 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007958 if (A->getOption().matches(options::OPT_mips16)) {
7959 A->claim();
7960 A->render(Args, CmdArgs);
7961 } else {
7962 A->claim();
7963 CmdArgs.push_back("-no-mips16");
7964 }
7965 }
7966
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007967 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7968 options::OPT_mno_micromips);
7969 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7970 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7971
Simon Atanasyanbd986632013-11-26 11:58:04 +00007972 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7973 // Do not use AddLastArg because not all versions of MIPS assembler
7974 // support -mmsa / -mno-msa options.
7975 if (A->getOption().matches(options::OPT_mmsa))
7976 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7977 }
7978
Daniel Sanders379d44b2014-07-16 11:52:23 +00007979 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7980 options::OPT_msoft_float);
7981
Toma Tabacub36d6102015-06-11 12:13:18 +00007982 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
7983 options::OPT_msingle_float);
7984
Daniel Sanders379d44b2014-07-16 11:52:23 +00007985 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7986 options::OPT_mno_odd_spreg);
7987
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007988 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007989 break;
7990 }
7991 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007992 // Always pass an -march option, since our default of z10 is later
7993 // than the GNU assembler's default.
7994 StringRef CPUName = getSystemZTargetCPU(Args);
7995 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007996 break;
7997 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007998 }
7999
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008000 if (NeedsKPIC) {
8001 if (RelocationModel != llvm::Reloc::Static)
8002 CmdArgs.push_back("-KPIC");
8003 }
Rafael Espindola92b00932010-08-10 00:25:48 +00008004
Renato Golina74bbc72015-07-22 15:32:36 +00008005 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008006 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008007
8008 CmdArgs.push_back("-o");
8009 CmdArgs.push_back(Output.getFilename());
8010
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008011 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008012 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008013
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008014 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008015 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008016
8017 // Handle the debug info splitting at object creation time if we're
8018 // creating an object.
8019 // TODO: Currently only works on linux with newer objcopy.
8020 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008021 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008022 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008023 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008024}
8025
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008026static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008027 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00008028 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Reid Kleckner0213a472015-07-22 16:01:38 +00008029 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008030 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8031 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008032 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008033 CmdArgs.push_back("-lgcc");
8034
Logan Chien3d3373c2012-11-19 12:04:11 +00008035 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008036 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008037 CmdArgs.push_back("-lgcc");
8038 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008039 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008040 CmdArgs.push_back("--as-needed");
8041 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008042 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008043 CmdArgs.push_back("--no-as-needed");
8044 }
8045
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008046 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008047 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008048 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008049 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008050
8051 // According to Android ABI, we have to link with libdl if we are
8052 // linking with non-static libgcc.
8053 //
8054 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8055 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8056 if (isAndroid && !StaticLibgcc)
8057 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008058}
8059
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008060static std::string getLinuxDynamicLinker(const ArgList &Args,
8061 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008062 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8063
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008064 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
8065 if (ToolChain.getTriple().isArch64Bit())
8066 return "/system/bin/linker64";
8067 else
8068 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008069 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8070 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008071 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008072 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008073 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008074 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008075 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008076 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008077 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
8078 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008079 return "/lib/ld-linux-armhf.so.3";
8080 else
8081 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008082 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8083 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008084 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
8085 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008086 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008087 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008088 return "/lib/ld-linux.so.3";
8089 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8090 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008091 StringRef CPUName;
8092 StringRef ABIName;
8093 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
8094 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
8095
8096 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
8097 .Case("o32", "/lib")
8098 .Case("n32", "/lib32")
8099 .Case("n64", "/lib64")
8100 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008101 StringRef LibName;
8102 if (mips::isUCLibc(Args))
8103 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
8104 else
8105 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008106
8107 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008108 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008109 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008110 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008111 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8112 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008113 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008114 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008115 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8116 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008117 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008118 } else if (Arch == llvm::Triple::systemz)
Ulrich Weigand8afad612014-07-28 13:17:52 +00008119 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008120 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008121 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008122 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008123 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8124 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008125 else
8126 return "/lib64/ld-linux-x86-64.so.2";
8127}
8128
Renato Golinc4b49242014-02-13 10:01:16 +00008129static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008130 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008131 // Make use of compiler-rt if --rtlib option is used
8132 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8133
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008134 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008135 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008136 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008137 default:
8138 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008139 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008140 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008141 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008142 break;
8143 }
Renato Golinc4b49242014-02-13 10:01:16 +00008144 break;
8145 case ToolChain::RLT_Libgcc:
8146 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8147 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008148 }
8149}
8150
Rafael Espindola1e085772014-08-15 17:14:35 +00008151static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8152 switch (T.getArch()) {
8153 case llvm::Triple::x86:
8154 return "elf_i386";
8155 case llvm::Triple::aarch64:
8156 return "aarch64linux";
8157 case llvm::Triple::aarch64_be:
8158 return "aarch64_be_linux";
8159 case llvm::Triple::arm:
8160 case llvm::Triple::thumb:
8161 return "armelf_linux_eabi";
8162 case llvm::Triple::armeb:
8163 case llvm::Triple::thumbeb:
8164 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8165 case llvm::Triple::ppc:
8166 return "elf32ppclinux";
8167 case llvm::Triple::ppc64:
8168 return "elf64ppc";
8169 case llvm::Triple::ppc64le:
8170 return "elf64lppc";
8171 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008172 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008173 return "elf32_sparc";
8174 case llvm::Triple::sparcv9:
8175 return "elf64_sparc";
8176 case llvm::Triple::mips:
8177 return "elf32btsmip";
8178 case llvm::Triple::mipsel:
8179 return "elf32ltsmip";
8180 case llvm::Triple::mips64:
8181 if (mips::hasMipsAbiArg(Args, "n32"))
8182 return "elf32btsmipn32";
8183 return "elf64btsmip";
8184 case llvm::Triple::mips64el:
8185 if (mips::hasMipsAbiArg(Args, "n32"))
8186 return "elf32ltsmipn32";
8187 return "elf64ltsmip";
8188 case llvm::Triple::systemz:
8189 return "elf64_s390";
8190 case llvm::Triple::x86_64:
8191 if (T.getEnvironment() == llvm::Triple::GNUX32)
8192 return "elf32_x86_64";
8193 return "elf_x86_64";
8194 default:
8195 llvm_unreachable("Unexpected arch");
8196 }
8197}
8198
Douglas Katzman95354292015-06-23 20:42:09 +00008199void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8200 const InputInfo &Output,
8201 const InputInfoList &Inputs,
8202 const ArgList &Args,
8203 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008204 const toolchains::Linux &ToolChain =
8205 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008206 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008207
8208 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8209 llvm::Triple Triple = llvm::Triple(TripleStr);
8210
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008211 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008212 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008213 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008214 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008215 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8216 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008217
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008218 ArgStringList CmdArgs;
8219
Rafael Espindolad1002f62010-11-15 18:28:16 +00008220 // Silence warning for "clang -g foo.o -o foo"
8221 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008222 // and "clang -emit-llvm foo.o -o foo"
8223 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008224 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008225 // handled somewhere else.
8226 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008227
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008228 if (!D.SysRoot.empty())
8229 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008230
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008231 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008232 CmdArgs.push_back("-pie");
8233
Rafael Espindola1c76c592010-11-07 22:57:16 +00008234 if (Args.hasArg(options::OPT_rdynamic))
8235 CmdArgs.push_back("-export-dynamic");
8236
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008237 if (Args.hasArg(options::OPT_s))
8238 CmdArgs.push_back("-s");
8239
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008240 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008241 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008242
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008243 for (const auto &Opt : ToolChain.ExtraOpts)
8244 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008245
8246 if (!Args.hasArg(options::OPT_static)) {
8247 CmdArgs.push_back("--eh-frame-hdr");
8248 }
8249
8250 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008251 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008252
8253 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008254 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8255 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008256 CmdArgs.push_back("-Bstatic");
8257 else
8258 CmdArgs.push_back("-static");
8259 } else if (Args.hasArg(options::OPT_shared)) {
8260 CmdArgs.push_back("-shared");
8261 }
8262
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008263 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8264 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008265 (!Args.hasArg(options::OPT_static) &&
8266 !Args.hasArg(options::OPT_shared))) {
8267 CmdArgs.push_back("-dynamic-linker");
8268 CmdArgs.push_back(Args.MakeArgString(
8269 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8270 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008271
8272 CmdArgs.push_back("-o");
8273 CmdArgs.push_back(Output.getFilename());
8274
Rafael Espindola81937ec2010-12-01 01:52:43 +00008275 if (!Args.hasArg(options::OPT_nostdlib) &&
8276 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008277 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008278 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008279 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008280 if (Args.hasArg(options::OPT_pg))
8281 crt1 = "gcrt1.o";
8282 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008283 crt1 = "Scrt1.o";
8284 else
8285 crt1 = "crt1.o";
8286 }
8287 if (crt1)
8288 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008289
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008290 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8291 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008292
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008293 const char *crtbegin;
8294 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008295 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008296 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008297 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008298 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008299 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008300 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008301 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008302 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008303
8304 // Add crtfastmath.o if available and fast math is enabled.
8305 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008306 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008307
8308 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008309 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008310
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008311 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008312
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008313 for (const auto &Path : Paths)
8314 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008315
Alexey Samsonov907880e2015-06-19 19:57:46 +00008316 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008317 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008318
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008319 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8320 CmdArgs.push_back("--no-demangle");
8321
Alexey Samsonov52550342014-09-15 19:58:40 +00008322 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008323 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008324 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008325 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008326
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008327 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008328 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008329 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008330 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008331 if (OnlyLibstdcxxStatic)
8332 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008333 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008334 if (OnlyLibstdcxxStatic)
8335 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008336 CmdArgs.push_back("-lm");
8337 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008338 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8339 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008340
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008341 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008342 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8343 if (Args.hasArg(options::OPT_static))
8344 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008345
Alexey Samsonov52550342014-09-15 19:58:40 +00008346 if (NeedsSanitizerDeps)
8347 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8348
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008349 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8350 Args.hasArg(options::OPT_pthreads);
8351
8352 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8353 options::OPT_fno_openmp, false)) {
8354 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8355 // FIXME: Does this really make sense for all GNU toolchains?
8356 WantPthread = true;
8357
8358 // Also link the particular OpenMP runtimes.
8359 switch (getOpenMPRuntime(ToolChain, Args)) {
8360 case OMPRT_OMP:
8361 CmdArgs.push_back("-lomp");
8362 break;
8363 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008364 CmdArgs.push_back("-lgomp");
8365
8366 // FIXME: Exclude this for platforms with libgomp that don't require
8367 // librt. Most modern Linux platforms require it, but some may not.
8368 CmdArgs.push_back("-lrt");
8369 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008370 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008371 CmdArgs.push_back("-liomp5");
8372 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008373 case OMPRT_Unknown:
8374 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008375 break;
8376 }
Chandler Carruth01538002013-01-17 13:19:29 +00008377 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008378
Renato Golinc4b49242014-02-13 10:01:16 +00008379 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008380
Richard Smith31d1de22015-05-20 22:48:44 +00008381 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008382 CmdArgs.push_back("-lpthread");
8383
8384 CmdArgs.push_back("-lc");
8385
8386 if (Args.hasArg(options::OPT_static))
8387 CmdArgs.push_back("--end-group");
8388 else
Renato Golinc4b49242014-02-13 10:01:16 +00008389 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008390 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008391
Rafael Espindola81937ec2010-12-01 01:52:43 +00008392 if (!Args.hasArg(options::OPT_nostartfiles)) {
8393 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008394 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008395 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008396 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008397 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008398 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008399 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008400
Rafael Espindola81937ec2010-12-01 01:52:43 +00008401 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008402 if (!isAndroid)
8403 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008404 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008405 }
8406
Justin Bognerd3371d82015-07-17 03:35:54 +00008407 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8408 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008409}
8410
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008411// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8412// for the various SFI requirements like register masking. The assembly tool
8413// inserts the file containing the macros as an input into all the assembly
8414// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008415void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8416 const InputInfo &Output,
8417 const InputInfoList &Inputs,
8418 const ArgList &Args,
8419 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008420 const toolchains::NaClToolChain &ToolChain =
8421 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008422 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8423 "nacl-arm-macros.s");
8424 InputInfoList NewInputs;
8425 NewInputs.push_back(NaClMacros);
8426 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008427 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8428 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008429}
8430
Douglas Katzman750cfc52015-06-29 18:42:16 +00008431// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008432// we use static by default, do not yet support sanitizers or LTO, and a few
8433// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008434// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008435void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8436 const InputInfo &Output,
8437 const InputInfoList &Inputs,
8438 const ArgList &Args,
8439 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008440
Douglas Katzman54366072015-07-27 16:53:08 +00008441 const toolchains::NaClToolChain &ToolChain =
8442 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008443 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008444 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008445 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008446 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008447
8448 ArgStringList CmdArgs;
8449
8450 // Silence warning for "clang -g foo.o -o foo"
8451 Args.ClaimAllArgs(options::OPT_g_Group);
8452 // and "clang -emit-llvm foo.o -o foo"
8453 Args.ClaimAllArgs(options::OPT_emit_llvm);
8454 // and for "clang -w foo.o -o foo". Other warning options are already
8455 // handled somewhere else.
8456 Args.ClaimAllArgs(options::OPT_w);
8457
8458 if (!D.SysRoot.empty())
8459 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8460
8461 if (Args.hasArg(options::OPT_rdynamic))
8462 CmdArgs.push_back("-export-dynamic");
8463
8464 if (Args.hasArg(options::OPT_s))
8465 CmdArgs.push_back("-s");
8466
Douglas Katzman54366072015-07-27 16:53:08 +00008467 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8468 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008469 CmdArgs.push_back("--build-id");
8470
8471 if (!IsStatic)
8472 CmdArgs.push_back("--eh-frame-hdr");
8473
8474 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008475 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008476 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008477 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008478 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008479 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008480 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008481 else if (Arch == llvm::Triple::mipsel)
8482 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008483 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008484 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8485 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008486
8487 if (IsStatic)
8488 CmdArgs.push_back("-static");
8489 else if (Args.hasArg(options::OPT_shared))
8490 CmdArgs.push_back("-shared");
8491
8492 CmdArgs.push_back("-o");
8493 CmdArgs.push_back(Output.getFilename());
8494 if (!Args.hasArg(options::OPT_nostdlib) &&
8495 !Args.hasArg(options::OPT_nostartfiles)) {
8496 if (!Args.hasArg(options::OPT_shared))
8497 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8498 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8499
8500 const char *crtbegin;
8501 if (IsStatic)
8502 crtbegin = "crtbeginT.o";
8503 else if (Args.hasArg(options::OPT_shared))
8504 crtbegin = "crtbeginS.o";
8505 else
8506 crtbegin = "crtbegin.o";
8507 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8508 }
8509
8510 Args.AddAllArgs(CmdArgs, options::OPT_L);
8511 Args.AddAllArgs(CmdArgs, options::OPT_u);
8512
8513 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8514
8515 for (const auto &Path : Paths)
8516 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8517
8518 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8519 CmdArgs.push_back("--no-demangle");
8520
8521 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8522
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008523 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008524 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008525 bool OnlyLibstdcxxStatic =
8526 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008527 if (OnlyLibstdcxxStatic)
8528 CmdArgs.push_back("-Bstatic");
8529 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8530 if (OnlyLibstdcxxStatic)
8531 CmdArgs.push_back("-Bdynamic");
8532 CmdArgs.push_back("-lm");
8533 }
8534
8535 if (!Args.hasArg(options::OPT_nostdlib)) {
8536 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8537 // Always use groups, since it has no effect on dynamic libraries.
8538 CmdArgs.push_back("--start-group");
8539 CmdArgs.push_back("-lc");
8540 // NaCl's libc++ currently requires libpthread, so just always include it
8541 // in the group for C++.
8542 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008543 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008544 // Gold, used by Mips, handles nested groups differently than ld, and
8545 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8546 // which is not a desired behaviour here.
8547 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8548 if (getToolChain().getArch() == llvm::Triple::mipsel)
8549 CmdArgs.push_back("-lnacl");
8550
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008551 CmdArgs.push_back("-lpthread");
8552 }
8553
8554 CmdArgs.push_back("-lgcc");
8555 CmdArgs.push_back("--as-needed");
8556 if (IsStatic)
8557 CmdArgs.push_back("-lgcc_eh");
8558 else
8559 CmdArgs.push_back("-lgcc_s");
8560 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008561
8562 // Mips needs to create and use pnacl_legacy library that contains
8563 // definitions from bitcode/pnaclmm.c and definitions for
8564 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8565 if (getToolChain().getArch() == llvm::Triple::mipsel)
8566 CmdArgs.push_back("-lpnacl_legacy");
8567
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008568 CmdArgs.push_back("--end-group");
8569 }
8570
8571 if (!Args.hasArg(options::OPT_nostartfiles)) {
8572 const char *crtend;
8573 if (Args.hasArg(options::OPT_shared))
8574 crtend = "crtendS.o";
8575 else
8576 crtend = "crtend.o";
8577
8578 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8579 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8580 }
8581 }
8582
Justin Bognerd3371d82015-07-17 03:35:54 +00008583 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8584 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008585}
8586
Douglas Katzman95354292015-06-23 20:42:09 +00008587void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8588 const InputInfo &Output,
8589 const InputInfoList &Inputs,
8590 const ArgList &Args,
8591 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008592 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008593 ArgStringList CmdArgs;
8594
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008595 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008596
8597 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008598 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008599
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008600 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008601 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008602
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008603 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008604 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008605}
8606
Douglas Katzman95354292015-06-23 20:42:09 +00008607void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8608 const InputInfo &Output,
8609 const InputInfoList &Inputs,
8610 const ArgList &Args,
8611 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008612 const Driver &D = getToolChain().getDriver();
8613 ArgStringList CmdArgs;
8614
Daniel Dunbarb440f562010-08-02 02:38:21 +00008615 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008616 CmdArgs.push_back("-o");
8617 CmdArgs.push_back(Output.getFilename());
8618 } else {
8619 assert(Output.isNothing() && "Invalid output.");
8620 }
8621
8622 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008623 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008624 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8625 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8626 CmdArgs.push_back(
8627 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8628 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008629 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008630
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008631 Args.AddAllArgs(CmdArgs,
8632 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008633
Daniel Dunbar54423b22010-09-17 00:24:54 +00008634 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008635
Alexey Samsonov7811d192014-02-20 13:57:37 +00008636 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008637
Chris Lattner3e2ee142010-07-07 16:01:42 +00008638 if (!Args.hasArg(options::OPT_nostdlib) &&
8639 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008640 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008641 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008642 CmdArgs.push_back("-lm");
8643 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008644 }
8645
8646 if (!Args.hasArg(options::OPT_nostdlib) &&
8647 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008648 if (Args.hasArg(options::OPT_pthread))
8649 CmdArgs.push_back("-lpthread");
8650 CmdArgs.push_back("-lc");
8651 CmdArgs.push_back("-lCompilerRT-Generic");
8652 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8653 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008654 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008655 }
8656
Logan Chieneb9162f2014-06-26 14:23:45 +00008657 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008658 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008659}
8660
Daniel Dunbarcc912342009-05-02 18:28:39 +00008661/// DragonFly Tools
8662
8663// For now, DragonFly Assemble does just about the same as for
8664// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008665void dragonfly::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);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008671 ArgStringList CmdArgs;
8672
8673 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8674 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008675 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008676 CmdArgs.push_back("--32");
8677
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008678 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008679
8680 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008681 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008682
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008683 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008684 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008685
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008686 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008687 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008688}
8689
Douglas Katzman95354292015-06-23 20:42:09 +00008690void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8691 const InputInfo &Output,
8692 const InputInfoList &Inputs,
8693 const ArgList &Args,
8694 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008695 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008696 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008697 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008698
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008699 if (!D.SysRoot.empty())
8700 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8701
John McCall65b8da02013-04-11 22:55:55 +00008702 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008703 if (Args.hasArg(options::OPT_static)) {
8704 CmdArgs.push_back("-Bstatic");
8705 } else {
John McCall65b8da02013-04-11 22:55:55 +00008706 if (Args.hasArg(options::OPT_rdynamic))
8707 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008708 if (Args.hasArg(options::OPT_shared))
8709 CmdArgs.push_back("-Bshareable");
8710 else {
8711 CmdArgs.push_back("-dynamic-linker");
8712 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8713 }
John McCall65b8da02013-04-11 22:55:55 +00008714 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008715 }
8716
8717 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8718 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008719 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008720 CmdArgs.push_back("-m");
8721 CmdArgs.push_back("elf_i386");
8722 }
8723
Daniel Dunbarb440f562010-08-02 02:38:21 +00008724 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008725 CmdArgs.push_back("-o");
8726 CmdArgs.push_back(Output.getFilename());
8727 } else {
8728 assert(Output.isNothing() && "Invalid output.");
8729 }
8730
8731 if (!Args.hasArg(options::OPT_nostdlib) &&
8732 !Args.hasArg(options::OPT_nostartfiles)) {
8733 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008734 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008735 CmdArgs.push_back(
8736 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008737 else {
8738 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008739 CmdArgs.push_back(
8740 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008741 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008742 CmdArgs.push_back(
8743 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008744 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008745 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008746 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008747 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008748 CmdArgs.push_back(
8749 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008750 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008751 CmdArgs.push_back(
8752 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008753 }
8754
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008755 Args.AddAllArgs(CmdArgs,
8756 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00008757
Daniel Dunbar54423b22010-09-17 00:24:54 +00008758 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008759
8760 if (!Args.hasArg(options::OPT_nostdlib) &&
8761 !Args.hasArg(options::OPT_nodefaultlibs)) {
8762 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8763 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008764 if (UseGCC47)
8765 CmdArgs.push_back("-L/usr/lib/gcc47");
8766 else
8767 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008768
8769 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008770 if (UseGCC47) {
8771 CmdArgs.push_back("-rpath");
8772 CmdArgs.push_back("/usr/lib/gcc47");
8773 } else {
8774 CmdArgs.push_back("-rpath");
8775 CmdArgs.push_back("/usr/lib/gcc44");
8776 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008777 }
8778
Hans Wennborg70850d82013-07-18 20:29:38 +00008779 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008780 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008781 CmdArgs.push_back("-lm");
8782 }
8783
Daniel Dunbarcc912342009-05-02 18:28:39 +00008784 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008785 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008786
8787 if (!Args.hasArg(options::OPT_nolibc)) {
8788 CmdArgs.push_back("-lc");
8789 }
8790
John McCall65b8da02013-04-11 22:55:55 +00008791 if (UseGCC47) {
8792 if (Args.hasArg(options::OPT_static) ||
8793 Args.hasArg(options::OPT_static_libgcc)) {
8794 CmdArgs.push_back("-lgcc");
8795 CmdArgs.push_back("-lgcc_eh");
8796 } else {
8797 if (Args.hasArg(options::OPT_shared_libgcc)) {
8798 CmdArgs.push_back("-lgcc_pic");
8799 if (!Args.hasArg(options::OPT_shared))
8800 CmdArgs.push_back("-lgcc");
8801 } else {
8802 CmdArgs.push_back("-lgcc");
8803 CmdArgs.push_back("--as-needed");
8804 CmdArgs.push_back("-lgcc_pic");
8805 CmdArgs.push_back("--no-as-needed");
8806 }
8807 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008808 } else {
John McCall65b8da02013-04-11 22:55:55 +00008809 if (Args.hasArg(options::OPT_shared)) {
8810 CmdArgs.push_back("-lgcc_pic");
8811 } else {
8812 CmdArgs.push_back("-lgcc");
8813 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008814 }
8815 }
8816
8817 if (!Args.hasArg(options::OPT_nostdlib) &&
8818 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008819 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008820 CmdArgs.push_back(
8821 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008822 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008823 CmdArgs.push_back(
8824 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8825 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008826 }
8827
Alexey Samsonov7811d192014-02-20 13:57:37 +00008828 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008829
Logan Chieneb9162f2014-06-26 14:23:45 +00008830 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008831 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008832}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008833
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008834// Try to find Exe from a Visual Studio distribution. This first tries to find
8835// an installed copy of Visual Studio and, failing that, looks in the PATH,
8836// making sure that whatever executable that's found is not a same-named exe
8837// from clang itself to prevent clang from falling back to itself.
8838static std::string FindVisualStudioExecutable(const ToolChain &TC,
8839 const char *Exe,
8840 const char *ClangProgramPath) {
8841 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8842 std::string visualStudioBinDir;
8843 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8844 visualStudioBinDir)) {
8845 SmallString<128> FilePath(visualStudioBinDir);
8846 llvm::sys::path::append(FilePath, Exe);
8847 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8848 return FilePath.str();
8849 }
8850
8851 return Exe;
8852}
8853
Douglas Katzman95354292015-06-23 20:42:09 +00008854void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8855 const InputInfo &Output,
8856 const InputInfoList &Inputs,
8857 const ArgList &Args,
8858 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008859 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008860 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008861
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008862 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8863 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008864 CmdArgs.push_back(
8865 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008866
8867 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008868 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008869 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008870
Zachary Turner10d75b22014-10-22 20:40:43 +00008871 if (!llvm::sys::Process::GetEnv("LIB")) {
8872 // If the VC environment hasn't been configured (perhaps because the user
8873 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008874 // the environment variable is set however, assume the user knows what
8875 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008876 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008877 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008878 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8879 SmallString<128> LibDir(VisualStudioDir);
8880 llvm::sys::path::append(LibDir, "VC", "lib");
8881 switch (MSVC.getArch()) {
8882 case llvm::Triple::x86:
8883 // x86 just puts the libraries directly in lib
8884 break;
8885 case llvm::Triple::x86_64:
8886 llvm::sys::path::append(LibDir, "amd64");
8887 break;
8888 case llvm::Triple::arm:
8889 llvm::sys::path::append(LibDir, "arm");
8890 break;
8891 default:
8892 break;
8893 }
8894 CmdArgs.push_back(
8895 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8896 }
8897
8898 std::string WindowsSdkLibPath;
8899 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8900 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8901 WindowsSdkLibPath.c_str()));
8902 }
8903
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008904 CmdArgs.push_back("-nologo");
8905
Reid Kleckner124955a2015-08-05 18:51:13 +00008906 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008907 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008908
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008909 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00008910 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008911 if (DLL) {
8912 CmdArgs.push_back(Args.MakeArgString("-dll"));
8913
8914 SmallString<128> ImplibName(Output.getFilename());
8915 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008916 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008917 }
8918
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008919 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008920 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008921 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008922 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008923 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008924 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008925 };
8926 for (const auto &Component : CompilerRTComponents)
8927 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008928 // Make sure the dynamic runtime thunk is not optimized out at link time
8929 // to ensure proper SEH handling.
8930 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008931 } else if (DLL) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008932 CmdArgs.push_back(
8933 Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008934 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008935 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008936 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008937 };
8938 for (const auto &Component : CompilerRTComponents)
8939 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008940 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008941 }
8942
Hans Wennborg2e274592013-08-13 23:38:57 +00008943 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008944
Alexey Bataevc7e84352015-08-19 04:49:01 +00008945 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8946 options::OPT_fno_openmp, false)) {
8947 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
8948 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
8949 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8950 TC.getDriver().Dir + "/../lib"));
8951 switch (getOpenMPRuntime(getToolChain(), Args)) {
8952 case OMPRT_OMP:
8953 CmdArgs.push_back("-defaultlib:libomp.lib");
8954 break;
8955 case OMPRT_IOMP5:
8956 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
8957 break;
8958 case OMPRT_GOMP:
8959 break;
8960 case OMPRT_Unknown:
8961 // Already diagnosed.
8962 break;
8963 }
8964 }
8965
Reid Kleckner337188f2014-09-16 19:22:00 +00008966 // Add filenames, libraries, and other linker inputs.
8967 for (const auto &Input : Inputs) {
8968 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008969 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008970 continue;
8971 }
8972
8973 const Arg &A = Input.getInputArg();
8974
8975 // Render -l options differently for the MSVC linker.
8976 if (A.getOption().matches(options::OPT_l)) {
8977 StringRef Lib = A.getValue();
8978 const char *LinkLibArg;
8979 if (Lib.endswith(".lib"))
8980 LinkLibArg = Args.MakeArgString(Lib);
8981 else
8982 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8983 CmdArgs.push_back(LinkLibArg);
8984 continue;
8985 }
8986
8987 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8988 // or -L. Render it, even if MSVC doesn't understand it.
8989 A.renderAsInput(Args, CmdArgs);
8990 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008991
Zachary Turner719f58c2014-12-01 23:06:47 +00008992 // We need to special case some linker paths. In the case of lld, we need to
8993 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8994 // linker, we need to use a special search algorithm.
8995 llvm::SmallString<128> linkPath;
8996 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8997 if (Linker.equals_lower("lld"))
8998 Linker = "lld-link";
8999
9000 if (Linker.equals_lower("link")) {
9001 // If we're using the MSVC linker, it's not sufficient to just use link
9002 // from the program PATH, because other environments like GnuWin32 install
9003 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009004 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009005 C.getDriver().getClangProgramPath());
9006 } else {
9007 linkPath = Linker;
9008 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009009 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009010 }
9011
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009012 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009013 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009014}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009015
Douglas Katzman95354292015-06-23 20:42:09 +00009016void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9017 const InputInfo &Output,
9018 const InputInfoList &Inputs,
9019 const ArgList &Args,
9020 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009021 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9022}
9023
Douglas Katzman95354292015-06-23 20:42:09 +00009024std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009025 Compilation &C, const JobAction &JA, const InputInfo &Output,
9026 const InputInfoList &Inputs, const ArgList &Args,
9027 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009028 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009029 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009030 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009031 CmdArgs.push_back("/W0"); // No warnings.
9032
9033 // The goal is to be able to invoke this tool correctly based on
9034 // any flag accepted by clang-cl.
9035
9036 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009037 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009038
9039 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009040 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9041 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9042 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009043 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9044 if (A->getOption().getID() == options::OPT_O0) {
9045 CmdArgs.push_back("/Od");
9046 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009047 CmdArgs.push_back("/Og");
9048
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009049 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009050 if (OptLevel == "s" || OptLevel == "z")
9051 CmdArgs.push_back("/Os");
9052 else
9053 CmdArgs.push_back("/Ot");
9054
9055 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009056 }
9057 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009058 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9059 options::OPT_fno_omit_frame_pointer))
9060 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9061 ? "/Oy"
9062 : "/Oy-");
9063 if (!Args.hasArg(options::OPT_fwritable_strings))
9064 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009065
Nico Weber3f8dafb2015-03-12 19:37:10 +00009066 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009067 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9068
David Majnemerf6072342014-07-01 22:24:56 +00009069 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9070 /*default=*/false))
9071 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009072 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9073 options::OPT_fno_function_sections))
9074 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9075 ? "/Gy"
9076 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009077 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9078 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009079 CmdArgs.push_back(
9080 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009081 if (Args.hasArg(options::OPT_fsyntax_only))
9082 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009083 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9084 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009085 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009086
Nico Weber3f8dafb2015-03-12 19:37:10 +00009087 std::vector<std::string> Includes =
9088 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009089 for (const auto &Include : Includes)
9090 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009091
Hans Wennborg87cfa712013-09-19 20:32:16 +00009092 // Flags that can simply be passed through.
9093 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9094 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009095 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009096 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009097
9098 // The order of these flags is relevant, so pick the last one.
9099 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9100 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9101 A->render(Args, CmdArgs);
9102
Hans Wennborg87cfa712013-09-19 20:32:16 +00009103 // Input filename.
9104 assert(Inputs.size() == 1);
9105 const InputInfo &II = Inputs[0];
9106 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9107 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9108 if (II.isFilename())
9109 CmdArgs.push_back(II.getFilename());
9110 else
9111 II.getInputArg().renderAsInput(Args, CmdArgs);
9112
9113 // Output filename.
9114 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009115 const char *Fo =
9116 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009117 CmdArgs.push_back(Fo);
9118
Hans Wennborg188382e2013-09-20 18:16:35 +00009119 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009120 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9121 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009122 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009123 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009124}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009125
Yaron Keren1c0070c2015-07-02 04:45:27 +00009126/// MinGW Tools
9127void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9128 const InputInfo &Output,
9129 const InputInfoList &Inputs,
9130 const ArgList &Args,
9131 const char *LinkingOutput) const {
9132 claimNoWarnArgs(Args);
9133 ArgStringList CmdArgs;
9134
9135 if (getToolChain().getArch() == llvm::Triple::x86) {
9136 CmdArgs.push_back("--32");
9137 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9138 CmdArgs.push_back("--64");
9139 }
9140
9141 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9142
9143 CmdArgs.push_back("-o");
9144 CmdArgs.push_back(Output.getFilename());
9145
9146 for (const auto &II : Inputs)
9147 CmdArgs.push_back(II.getFilename());
9148
9149 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009150 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009151
9152 if (Args.hasArg(options::OPT_gsplit_dwarf))
9153 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9154 SplitDebugName(Args, Inputs[0]));
9155}
9156
9157void MinGW::Linker::AddLibGCC(const ArgList &Args,
9158 ArgStringList &CmdArgs) const {
9159 if (Args.hasArg(options::OPT_mthreads))
9160 CmdArgs.push_back("-lmingwthrd");
9161 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009162
Yaron Kerenaa281332015-08-09 00:24:07 +00009163 // Make use of compiler-rt if --rtlib option is used
9164 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9165 if (RLT == ToolChain::RLT_Libgcc) {
9166 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9167 Args.hasArg(options::OPT_static);
9168 bool Shared = Args.hasArg(options::OPT_shared);
9169 bool CXX = getToolChain().getDriver().CCCIsCXX();
9170
9171 if (Static || (!CXX && !Shared)) {
9172 CmdArgs.push_back("-lgcc");
9173 CmdArgs.push_back("-lgcc_eh");
9174 } else {
9175 CmdArgs.push_back("-lgcc_s");
9176 CmdArgs.push_back("-lgcc");
9177 }
9178 } else {
9179 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9180 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009181
Yaron Keren1c0070c2015-07-02 04:45:27 +00009182 CmdArgs.push_back("-lmoldname");
9183 CmdArgs.push_back("-lmingwex");
9184 CmdArgs.push_back("-lmsvcrt");
9185}
9186
9187void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9188 const InputInfo &Output,
9189 const InputInfoList &Inputs,
9190 const ArgList &Args,
9191 const char *LinkingOutput) const {
9192 const ToolChain &TC = getToolChain();
9193 const Driver &D = TC.getDriver();
9194 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9195
9196 ArgStringList CmdArgs;
9197
9198 // Silence warning for "clang -g foo.o -o foo"
9199 Args.ClaimAllArgs(options::OPT_g_Group);
9200 // and "clang -emit-llvm foo.o -o foo"
9201 Args.ClaimAllArgs(options::OPT_emit_llvm);
9202 // and for "clang -w foo.o -o foo". Other warning options are already
9203 // handled somewhere else.
9204 Args.ClaimAllArgs(options::OPT_w);
9205
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009206 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9207 if (LinkerName.equals_lower("lld")) {
9208 CmdArgs.push_back("-flavor");
9209 CmdArgs.push_back("gnu");
9210 }
9211
Yaron Keren1c0070c2015-07-02 04:45:27 +00009212 if (!D.SysRoot.empty())
9213 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9214
9215 if (Args.hasArg(options::OPT_s))
9216 CmdArgs.push_back("-s");
9217
9218 CmdArgs.push_back("-m");
9219 if (TC.getArch() == llvm::Triple::x86)
9220 CmdArgs.push_back("i386pe");
9221 if (TC.getArch() == llvm::Triple::x86_64)
9222 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009223 if (TC.getArch() == llvm::Triple::arm)
9224 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009225
9226 if (Args.hasArg(options::OPT_mwindows)) {
9227 CmdArgs.push_back("--subsystem");
9228 CmdArgs.push_back("windows");
9229 } else if (Args.hasArg(options::OPT_mconsole)) {
9230 CmdArgs.push_back("--subsystem");
9231 CmdArgs.push_back("console");
9232 }
9233
9234 if (Args.hasArg(options::OPT_static))
9235 CmdArgs.push_back("-Bstatic");
9236 else {
9237 if (Args.hasArg(options::OPT_mdll))
9238 CmdArgs.push_back("--dll");
9239 else if (Args.hasArg(options::OPT_shared))
9240 CmdArgs.push_back("--shared");
9241 CmdArgs.push_back("-Bdynamic");
9242 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9243 CmdArgs.push_back("-e");
9244 if (TC.getArch() == llvm::Triple::x86)
9245 CmdArgs.push_back("_DllMainCRTStartup@12");
9246 else
9247 CmdArgs.push_back("DllMainCRTStartup");
9248 CmdArgs.push_back("--enable-auto-image-base");
9249 }
9250 }
9251
9252 CmdArgs.push_back("-o");
9253 CmdArgs.push_back(Output.getFilename());
9254
9255 Args.AddAllArgs(CmdArgs, options::OPT_e);
9256 // FIXME: add -N, -n flags
9257 Args.AddLastArg(CmdArgs, options::OPT_r);
9258 Args.AddLastArg(CmdArgs, options::OPT_s);
9259 Args.AddLastArg(CmdArgs, options::OPT_t);
9260 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9261 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9262
9263 if (!Args.hasArg(options::OPT_nostdlib) &&
9264 !Args.hasArg(options::OPT_nostartfiles)) {
9265 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9266 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9267 } else {
9268 if (Args.hasArg(options::OPT_municode))
9269 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9270 else
9271 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9272 }
9273 if (Args.hasArg(options::OPT_pg))
9274 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9275 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9276 }
9277
9278 Args.AddAllArgs(CmdArgs, options::OPT_L);
9279 const ToolChain::path_list Paths = TC.getFilePaths();
9280 for (const auto &Path : Paths)
9281 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9282
9283 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9284
9285 // TODO: Add ASan stuff here
9286
9287 // TODO: Add profile stuff here
9288
9289 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9290 !Args.hasArg(options::OPT_nodefaultlibs)) {
9291 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9292 !Args.hasArg(options::OPT_static);
9293 if (OnlyLibstdcxxStatic)
9294 CmdArgs.push_back("-Bstatic");
9295 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9296 if (OnlyLibstdcxxStatic)
9297 CmdArgs.push_back("-Bdynamic");
9298 }
9299
9300 if (!Args.hasArg(options::OPT_nostdlib)) {
9301 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9302 if (Args.hasArg(options::OPT_static))
9303 CmdArgs.push_back("--start-group");
9304
9305 if (Args.hasArg(options::OPT_fstack_protector) ||
9306 Args.hasArg(options::OPT_fstack_protector_strong) ||
9307 Args.hasArg(options::OPT_fstack_protector_all)) {
9308 CmdArgs.push_back("-lssp_nonshared");
9309 CmdArgs.push_back("-lssp");
9310 }
9311 if (Args.hasArg(options::OPT_fopenmp))
9312 CmdArgs.push_back("-lgomp");
9313
9314 AddLibGCC(Args, CmdArgs);
9315
9316 if (Args.hasArg(options::OPT_pg))
9317 CmdArgs.push_back("-lgmon");
9318
Yaron Kerenadce68e2015-07-06 18:52:19 +00009319 if (Args.hasArg(options::OPT_pthread))
9320 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009321
9322 // add system libraries
9323 if (Args.hasArg(options::OPT_mwindows)) {
9324 CmdArgs.push_back("-lgdi32");
9325 CmdArgs.push_back("-lcomdlg32");
9326 }
9327 CmdArgs.push_back("-ladvapi32");
9328 CmdArgs.push_back("-lshell32");
9329 CmdArgs.push_back("-luser32");
9330 CmdArgs.push_back("-lkernel32");
9331
9332 if (Args.hasArg(options::OPT_static))
9333 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009334 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009335 AddLibGCC(Args, CmdArgs);
9336 }
9337
9338 if (!Args.hasArg(options::OPT_nostartfiles)) {
9339 // Add crtfastmath.o if available and fast math is enabled.
9340 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9341
9342 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9343 }
9344 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009345 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009346 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009347}
9348
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009349/// XCore Tools
9350// We pass assemble and link construction to the xcc tool.
9351
Douglas Katzman95354292015-06-23 20:42:09 +00009352void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9353 const InputInfo &Output,
9354 const InputInfoList &Inputs,
9355 const ArgList &Args,
9356 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009357 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009358 ArgStringList CmdArgs;
9359
9360 CmdArgs.push_back("-o");
9361 CmdArgs.push_back(Output.getFilename());
9362
9363 CmdArgs.push_back("-c");
9364
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009365 if (Args.hasArg(options::OPT_v))
9366 CmdArgs.push_back("-v");
9367
Robert Lytton894d25c2014-05-02 09:33:25 +00009368 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9369 if (!A->getOption().matches(options::OPT_g0))
9370 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009371
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009372 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9373 false))
9374 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009375
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009376 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009377
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009378 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009379 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009380
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009381 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009382 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009383}
9384
Douglas Katzman95354292015-06-23 20:42:09 +00009385void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9386 const InputInfo &Output,
9387 const InputInfoList &Inputs,
9388 const ArgList &Args,
9389 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009390 ArgStringList CmdArgs;
9391
9392 if (Output.isFilename()) {
9393 CmdArgs.push_back("-o");
9394 CmdArgs.push_back(Output.getFilename());
9395 } else {
9396 assert(Output.isNothing() && "Invalid output.");
9397 }
9398
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009399 if (Args.hasArg(options::OPT_v))
9400 CmdArgs.push_back("-v");
9401
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009402 // Pass -fexceptions through to the linker if it was present.
9403 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9404 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009405 CmdArgs.push_back("-fexceptions");
9406
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009407 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9408
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009409 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009410 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009411}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009412
Douglas Katzman95354292015-06-23 20:42:09 +00009413void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9414 const InputInfo &Output,
9415 const InputInfoList &Inputs,
9416 const ArgList &Args,
9417 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009418 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009419 const auto &TC =
9420 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9421 ArgStringList CmdArgs;
9422 const char *Exec;
9423
9424 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009425 default:
9426 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009427 case llvm::Triple::arm:
9428 case llvm::Triple::thumb:
9429 break;
9430 case llvm::Triple::x86:
9431 CmdArgs.push_back("--32");
9432 break;
9433 case llvm::Triple::x86_64:
9434 CmdArgs.push_back("--64");
9435 break;
9436 }
9437
9438 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9439
9440 CmdArgs.push_back("-o");
9441 CmdArgs.push_back(Output.getFilename());
9442
9443 for (const auto &Input : Inputs)
9444 CmdArgs.push_back(Input.getFilename());
9445
9446 const std::string Assembler = TC.GetProgramPath("as");
9447 Exec = Args.MakeArgString(Assembler);
9448
Justin Bognerd3371d82015-07-17 03:35:54 +00009449 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009450}
9451
Douglas Katzman95354292015-06-23 20:42:09 +00009452void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9453 const InputInfo &Output,
9454 const InputInfoList &Inputs,
9455 const ArgList &Args,
9456 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009457 const auto &TC =
9458 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9459 const llvm::Triple &T = TC.getTriple();
9460 const Driver &D = TC.getDriver();
9461 SmallString<128> EntryPoint;
9462 ArgStringList CmdArgs;
9463 const char *Exec;
9464
9465 // Silence warning for "clang -g foo.o -o foo"
9466 Args.ClaimAllArgs(options::OPT_g_Group);
9467 // and "clang -emit-llvm foo.o -o foo"
9468 Args.ClaimAllArgs(options::OPT_emit_llvm);
9469 // and for "clang -w foo.o -o foo"
9470 Args.ClaimAllArgs(options::OPT_w);
9471 // Other warning options are already handled somewhere else.
9472
9473 if (!D.SysRoot.empty())
9474 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9475
9476 if (Args.hasArg(options::OPT_pie))
9477 CmdArgs.push_back("-pie");
9478 if (Args.hasArg(options::OPT_rdynamic))
9479 CmdArgs.push_back("-export-dynamic");
9480 if (Args.hasArg(options::OPT_s))
9481 CmdArgs.push_back("--strip-all");
9482
9483 CmdArgs.push_back("-m");
9484 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009485 default:
9486 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009487 case llvm::Triple::arm:
9488 case llvm::Triple::thumb:
9489 // FIXME: this is incorrect for WinCE
9490 CmdArgs.push_back("thumb2pe");
9491 break;
9492 case llvm::Triple::x86:
9493 CmdArgs.push_back("i386pe");
9494 EntryPoint.append("_");
9495 break;
9496 case llvm::Triple::x86_64:
9497 CmdArgs.push_back("i386pep");
9498 break;
9499 }
9500
9501 if (Args.hasArg(options::OPT_shared)) {
9502 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009503 default:
9504 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009505 case llvm::Triple::arm:
9506 case llvm::Triple::thumb:
9507 case llvm::Triple::x86_64:
9508 EntryPoint.append("_DllMainCRTStartup");
9509 break;
9510 case llvm::Triple::x86:
9511 EntryPoint.append("_DllMainCRTStartup@12");
9512 break;
9513 }
9514
9515 CmdArgs.push_back("-shared");
9516 CmdArgs.push_back("-Bdynamic");
9517
9518 CmdArgs.push_back("--enable-auto-image-base");
9519
9520 CmdArgs.push_back("--entry");
9521 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9522 } else {
9523 EntryPoint.append("mainCRTStartup");
9524
9525 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9526 : "-Bdynamic");
9527
9528 if (!Args.hasArg(options::OPT_nostdlib) &&
9529 !Args.hasArg(options::OPT_nostartfiles)) {
9530 CmdArgs.push_back("--entry");
9531 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9532 }
9533
9534 // FIXME: handle subsystem
9535 }
9536
9537 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009538 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009539
9540 CmdArgs.push_back("-o");
9541 CmdArgs.push_back(Output.getFilename());
9542
9543 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9544 SmallString<261> ImpLib(Output.getFilename());
9545 llvm::sys::path::replace_extension(ImpLib, ".lib");
9546
9547 CmdArgs.push_back("--out-implib");
9548 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9549 }
9550
9551 if (!Args.hasArg(options::OPT_nostdlib) &&
9552 !Args.hasArg(options::OPT_nostartfiles)) {
9553 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9554 const char *CRTBegin;
9555
9556 CRTBegin =
9557 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9558 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9559 }
9560
9561 Args.AddAllArgs(CmdArgs, options::OPT_L);
9562
9563 const auto &Paths = TC.getFilePaths();
9564 for (const auto &Path : Paths)
9565 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9566
9567 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9568
9569 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9570 !Args.hasArg(options::OPT_nodefaultlibs)) {
9571 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9572 !Args.hasArg(options::OPT_static);
9573 if (StaticCXX)
9574 CmdArgs.push_back("-Bstatic");
9575 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9576 if (StaticCXX)
9577 CmdArgs.push_back("-Bdynamic");
9578 }
9579
9580 if (!Args.hasArg(options::OPT_nostdlib)) {
9581 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9582 // TODO handle /MT[d] /MD[d]
9583 CmdArgs.push_back("-lmsvcrt");
9584 AddRunTimeLibs(TC, D, CmdArgs, Args);
9585 }
9586 }
9587
9588 const std::string Linker = TC.GetProgramPath("ld");
9589 Exec = Args.MakeArgString(Linker);
9590
Justin Bognerd3371d82015-07-17 03:35:54 +00009591 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009592}
Douglas Katzman84a75642015-06-19 14:55:19 +00009593
Douglas Katzman95354292015-06-23 20:42:09 +00009594void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9595 const InputInfo &Output,
9596 const InputInfoList &Inputs,
9597 const ArgList &Args,
9598 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009599
9600 ArgStringList CmdArgs;
9601
9602 assert(Inputs.size() == 1);
9603 const InputInfo &II = Inputs[0];
9604 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9605 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9606
Douglas Katzman84a75642015-06-19 14:55:19 +00009607 CmdArgs.push_back("-DMYRIAD2");
9608 CmdArgs.push_back("-mcpu=myriad2");
9609 CmdArgs.push_back("-S");
9610
Douglas Katzmanf6071112015-08-03 14:34:22 +00009611 // Append all -I, -iquote, -isystem paths, defines/undefines,
9612 // 'f' flags, optimize flags, and warning options.
9613 // These are spelled the same way in clang and moviCompile.
9614 Args.AddAllArgs(CmdArgs,
9615 {options::OPT_I_Group, options::OPT_clang_i_Group,
9616 options::OPT_D, options::OPT_U,
9617 options::OPT_f_Group,
9618 options::OPT_f_clang_Group,
9619 options::OPT_g_Group,
9620 options::OPT_O_Group,
9621 options::OPT_W_Group});
Douglas Katzman84a75642015-06-19 14:55:19 +00009622 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9623
9624 CmdArgs.push_back(II.getFilename());
9625 CmdArgs.push_back("-o");
9626 CmdArgs.push_back(Output.getFilename());
9627
9628 std::string Exec =
9629 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009630 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9631 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009632}
9633
Douglas Katzman95354292015-06-23 20:42:09 +00009634void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9635 const InputInfo &Output,
9636 const InputInfoList &Inputs,
9637 const ArgList &Args,
9638 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009639 ArgStringList CmdArgs;
9640
9641 assert(Inputs.size() == 1);
9642 const InputInfo &II = Inputs[0];
9643 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9644 assert(Output.getType() == types::TY_Object);
9645
9646 CmdArgs.push_back("-no6thSlotCompression");
9647 CmdArgs.push_back("-cv:myriad2"); // Chip Version ?
9648 CmdArgs.push_back("-noSPrefixing");
9649 CmdArgs.push_back("-a"); // Mystery option.
9650 for (auto Arg : Args.filtered(options::OPT_I)) {
9651 Arg->claim();
9652 CmdArgs.push_back(
9653 Args.MakeArgString(std::string("-i:") + Arg->getValue(0)));
9654 }
9655 CmdArgs.push_back("-elf"); // Output format.
9656 CmdArgs.push_back(II.getFilename());
9657 CmdArgs.push_back(
9658 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9659
9660 std::string Exec =
9661 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009662 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9663 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009664}