blob: c45955441c4ec373709b69e1199958527dce4898 [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"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000027#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000028#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000029#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000030#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000031#include "llvm/Option/Arg.h"
32#include "llvm/Option/ArgList.h"
33#include "llvm/Option/Option.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000034#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000035#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000036#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000037#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000038#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000039#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000040#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000041#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000042#include "llvm/Support/raw_ostream.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000043
Ben Langmuir3b7b5402015-02-03 19:28:37 +000044#ifdef LLVM_ON_UNIX
45#include <unistd.h> // For getuid().
46#endif
47
Daniel Dunbar1a093d22009-03-18 06:00:36 +000048using namespace clang::driver;
49using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000050using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000051using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000052
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +000053static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
54 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
55 options::OPT_fpic, options::OPT_fno_pic,
56 options::OPT_fPIE, options::OPT_fno_PIE,
57 options::OPT_fpie, options::OPT_fno_pie);
58 if (!LastPICArg)
59 return;
60 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
61 LastPICArg->getOption().matches(options::OPT_fpic) ||
62 LastPICArg->getOption().matches(options::OPT_fPIE) ||
63 LastPICArg->getOption().matches(options::OPT_fpie)) {
64 CmdArgs.push_back("-KPIC");
65 }
66}
67
Daniel Dunbar64198ef2009-09-10 01:21:05 +000068/// CheckPreprocessingOptions - Perform some validation of preprocessing
69/// arguments that is shared with gcc.
70static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000071 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
72 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
73 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000074 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000075 << A->getBaseArg().getAsString(Args)
76 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
77 }
78 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000079}
80
Daniel Dunbar4eadb602009-09-10 01:21:12 +000081/// CheckCodeGenerationOptions - Perform some validation of code generation
82/// arguments that is shared with gcc.
83static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
84 // In gcc, only ARM checks this, but it seems reasonable to check universally.
85 if (Args.hasArg(options::OPT_static))
86 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
87 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000088 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000089 << A->getAsString(Args) << "-static";
90}
91
Bob Wilsond5aad2a2014-11-04 22:28:48 +000092// Add backslashes to escape spaces and other backslashes.
93// This is used for the space-separated argument list specified with
94// the -dwarf-debug-flags option.
95static void EscapeSpacesAndBackslashes(const char *Arg,
96 SmallVectorImpl<char> &Res) {
97 for ( ; *Arg; ++Arg) {
98 switch (*Arg) {
99 default: break;
100 case ' ':
101 case '\\':
102 Res.push_back('\\');
103 break;
104 }
105 Res.push_back(*Arg);
106 }
107}
108
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000109// Quote target names for inclusion in GNU Make dependency files.
110// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000111static void QuoteTarget(StringRef Target,
112 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000113 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
114 switch (Target[i]) {
115 case ' ':
116 case '\t':
117 // Escape the preceding backslashes
118 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
119 Res.push_back('\\');
120
121 // Escape the space/tab
122 Res.push_back('\\');
123 break;
124 case '$':
125 Res.push_back('$');
126 break;
127 case '#':
128 Res.push_back('\\');
129 break;
130 default:
131 break;
132 }
133
134 Res.push_back(Target[i]);
135 }
136}
137
Bill Wendlingc0938f32012-03-12 22:10:06 +0000138static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +0000139 ArgStringList &CmdArgs,
140 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +0000141 const char *EnvVar) {
142 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000143 bool CombinedArg = false;
144
Bill Wendling281ca292012-03-12 21:22:35 +0000145 if (!DirList)
146 return; // Nothing to do.
147
Chad Rosier616e8a52012-10-30 21:42:09 +0000148 StringRef Name(ArgName);
149 if (Name.equals("-I") || Name.equals("-L"))
150 CombinedArg = true;
151
Bill Wendling281ca292012-03-12 21:22:35 +0000152 StringRef Dirs(DirList);
153 if (Dirs.empty()) // Empty string should not add '.'.
154 return;
155
156 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000157 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000158 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000159 if (CombinedArg) {
160 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
161 } else {
162 CmdArgs.push_back(ArgName);
163 CmdArgs.push_back(".");
164 }
Bill Wendling281ca292012-03-12 21:22:35 +0000165 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000166 if (CombinedArg) {
167 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
168 } else {
169 CmdArgs.push_back(ArgName);
170 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
171 }
Bill Wendling281ca292012-03-12 21:22:35 +0000172 }
Nico Weber89355782012-03-19 15:00:03 +0000173 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000174 }
175
176 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000177 if (CombinedArg) {
178 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
179 } else {
180 CmdArgs.push_back(ArgName);
181 CmdArgs.push_back(".");
182 }
Bill Wendling281ca292012-03-12 21:22:35 +0000183 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000184 if (CombinedArg) {
185 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
186 } else {
187 CmdArgs.push_back(ArgName);
188 CmdArgs.push_back(Args.MakeArgString(Dirs));
189 }
Bill Wendling281ca292012-03-12 21:22:35 +0000190 }
191}
192
Daniel Dunbar54423b22010-09-17 00:24:54 +0000193static void AddLinkerInputs(const ToolChain &TC,
194 const InputInfoList &Inputs, const ArgList &Args,
195 ArgStringList &CmdArgs) {
196 const Driver &D = TC.getDriver();
197
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000198 // Add extra linker input arguments which are not treated as inputs
199 // (constructed via -Xarch_).
200 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
201
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000202 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000203 if (!TC.HasNativeLLVMSupport()) {
204 // Don't try to pass LLVM inputs unless we have native support.
205 if (II.getType() == types::TY_LLVM_IR ||
206 II.getType() == types::TY_LTO_IR ||
207 II.getType() == types::TY_LLVM_BC ||
208 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000209 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000210 << TC.getTripleString();
211 }
212
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000213 // Add filenames immediately.
214 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000215 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000216 continue;
217 }
218
219 // Otherwise, this is a linker input argument.
220 const Arg &A = II.getInputArg();
221
222 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000223 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000224 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000225 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000226 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000227 else if (A.getOption().matches(options::OPT_z)) {
228 // Pass -z prefix for gcc linker compatibility.
229 A.claim();
230 A.render(Args, CmdArgs);
231 } else {
232 A.renderAsInput(Args, CmdArgs);
233 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000234 }
Bill Wendling281ca292012-03-12 21:22:35 +0000235
236 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000237 // and only supported on native toolchains.
238 if (!TC.isCrossCompiling())
239 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000240}
241
John McCall31168b02011-06-15 23:02:42 +0000242/// \brief Determine whether Objective-C automated reference counting is
243/// enabled.
244static bool isObjCAutoRefCount(const ArgList &Args) {
245 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
246}
247
Ted Kremeneke65b0862012-03-06 20:05:56 +0000248/// \brief Determine whether we are linking the ObjC runtime.
249static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000250 if (isObjCAutoRefCount(Args)) {
251 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000252 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000253 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000254 return Args.hasArg(options::OPT_fobjc_link_runtime);
255}
256
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000257static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000258 // Don't forward inputs from the original command line. They are added from
259 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000260 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000261 !O.hasFlag(options::DriverOption) &&
262 !O.hasFlag(options::LinkerInput);
263}
264
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000265void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000266 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000267 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000268 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000269 ArgStringList &CmdArgs,
270 const InputInfo &Output,
271 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000272 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000273
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000274 CheckPreprocessingOptions(D, Args);
275
276 Args.AddLastArg(CmdArgs, options::OPT_C);
277 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000278
279 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000280 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000281 (A = Args.getLastArg(options::OPT_MD)) ||
282 (A = Args.getLastArg(options::OPT_MMD))) {
283 // Determine the output location.
284 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000285 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000286 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000287 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000288 } else if (Output.getType() == types::TY_Dependencies) {
289 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000290 } else if (A->getOption().matches(options::OPT_M) ||
291 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000292 DepFile = "-";
293 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000294 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000295 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000296 }
297 CmdArgs.push_back("-dependency-file");
298 CmdArgs.push_back(DepFile);
299
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000300 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000301 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
302 const char *DepTarget;
303
304 // If user provided -o, that is the dependency target, except
305 // when we are only generating a dependency file.
306 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
307 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000308 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000309 } else {
310 // Otherwise derive from the base input.
311 //
312 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000313 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000314 llvm::sys::path::replace_extension(P, "o");
315 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000316 }
317
318 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000319 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000320 QuoteTarget(DepTarget, Quoted);
321 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000322 }
323
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000324 if (A->getOption().matches(options::OPT_M) ||
325 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 CmdArgs.push_back("-sys-header-deps");
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000327
328 if (isa<PrecompileJobAction>(JA))
329 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000330 }
331
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000332 if (Args.hasArg(options::OPT_MG)) {
333 if (!A || A->getOption().matches(options::OPT_MD) ||
334 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000335 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000336 CmdArgs.push_back("-MG");
337 }
338
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000339 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000340
341 // Convert all -MQ <target> args to -MT <quoted target>
342 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
343 options::OPT_MQ),
344 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000345 const Arg *A = *it;
346 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000347
Daniel Dunbara442fd52010-06-11 22:00:13 +0000348 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000349 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000350 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000351 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000352 CmdArgs.push_back(Args.MakeArgString(Quoted));
353
354 // -MT flag - no change
355 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000356 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000357 }
358 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000359
Douglas Gregor111af7d2009-04-18 00:34:01 +0000360 // Add -i* options, and automatically translate to
361 // -include-pch/-include-pth for transparent PCH support. It's
362 // wonky, but we include looking for .gch so we can support seamless
363 // replacement into a build system already set up to be generating
364 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000365 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000366 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
367 ie = Args.filtered_end(); it != ie; ++it) {
368 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000369
370 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000371 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
372 RenderedImplicitInclude = true;
373
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000374 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000375 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000376
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000377 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000378 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000379 SmallString<128> P(A->getValue());
380 // We want the files to have a name like foo.h.pch. Add a dummy extension
381 // so that replace_extension does the right thing.
382 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000383 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000384 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000385 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000386 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000387 }
388
Douglas Gregor111af7d2009-04-18 00:34:01 +0000389 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000390 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000391 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000392 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000393 }
394
Douglas Gregor111af7d2009-04-18 00:34:01 +0000395 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000396 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000397 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000398 FoundPCH = UsePCH;
399 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000400 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000401 }
402
403 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000404 if (IsFirstImplicitInclude) {
405 A->claim();
406 if (UsePCH)
407 CmdArgs.push_back("-include-pch");
408 else
409 CmdArgs.push_back("-include-pth");
410 CmdArgs.push_back(Args.MakeArgString(P.str()));
411 continue;
412 } else {
413 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000414 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000415 << P.str() << A->getAsString(Args);
416 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000417 }
418 }
419
420 // Not translated, render as usual.
421 A->claim();
422 A->render(Args, CmdArgs);
423 }
424
425 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000426 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
427 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000428
429 // Add -Wp, and -Xassembler if using the preprocessor.
430
431 // FIXME: There is a very unfortunate problem here, some troubled
432 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
433 // really support that we would have to parse and then translate
434 // those options. :(
435 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
436 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000437
438 // -I- is a deprecated GCC feature, reject it.
439 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000440 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000441
442 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
443 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000444 StringRef sysroot = C.getSysRoot();
445 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000446 if (!Args.hasArg(options::OPT_isysroot)) {
447 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000448 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000449 }
450 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000451
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000452 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000453 // FIXME: We should probably sink the logic for handling these from the
454 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000455 // CPATH - included following the user specified includes (but prior to
456 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000457 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000458 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000459 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000460 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000461 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000462 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000463 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000464 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000465 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000466
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000467 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000468 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000469 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000470
471 // Add system include arguments.
472 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000473}
474
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000475// FIXME: Move to target hook.
476static bool isSignedCharDefault(const llvm::Triple &Triple) {
477 switch (Triple.getArch()) {
478 default:
479 return true;
480
Tim Northover9bb857a2013-01-31 12:13:10 +0000481 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000482 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000483 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000484 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000485 case llvm::Triple::thumb:
486 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000487 if (Triple.isOSDarwin() || Triple.isOSWindows())
488 return true;
489 return false;
490
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000491 case llvm::Triple::ppc:
492 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000493 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000494 return true;
495 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000496
Bill Schmidt778d3872013-07-26 01:36:11 +0000497 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000498 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000499 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000500 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000501 }
502}
503
Robert Lytton0e076492013-08-13 09:43:10 +0000504static bool isNoCommonDefault(const llvm::Triple &Triple) {
505 switch (Triple.getArch()) {
506 default:
507 return false;
508
509 case llvm::Triple::xcore:
510 return true;
511 }
512}
513
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000514// Handle -mhwdiv=.
515static void getARMHWDivFeatures(const Driver &D, const Arg *A,
516 const ArgList &Args,
517 std::vector<const char *> &Features) {
518 StringRef HWDiv = A->getValue();
519 if (HWDiv == "arm") {
520 Features.push_back("+hwdiv-arm");
521 Features.push_back("-hwdiv");
522 } else if (HWDiv == "thumb") {
523 Features.push_back("-hwdiv-arm");
524 Features.push_back("+hwdiv");
525 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
526 Features.push_back("+hwdiv-arm");
527 Features.push_back("+hwdiv");
528 } else if (HWDiv == "none") {
529 Features.push_back("-hwdiv-arm");
530 Features.push_back("-hwdiv");
531 } else
532 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
533}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000534
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000535// Handle -mfpu=.
536//
537// FIXME: Centralize feature selection, defaulting shouldn't be also in the
538// frontend target.
539static void getARMFPUFeatures(const Driver &D, const Arg *A,
540 const ArgList &Args,
541 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000542 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000543
544 // Set the target features based on the FPU.
545 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
546 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000547 Features.push_back("-vfp2");
548 Features.push_back("-vfp3");
549 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000550 } else if (FPU == "vfp") {
551 Features.push_back("+vfp2");
552 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000553 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000554 Features.push_back("+vfp3");
555 Features.push_back("+d16");
556 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000557 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000558 Features.push_back("+vfp3");
559 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000560 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
561 Features.push_back("+vfp4");
562 Features.push_back("+d16");
563 Features.push_back("-neon");
564 } else if (FPU == "vfp4" || FPU == "vfpv4") {
565 Features.push_back("+vfp4");
566 Features.push_back("-neon");
Oliver Stannard96601ca2014-02-21 10:39:15 +0000567 } else if (FPU == "fp4-sp-d16" || FPU == "fpv4-sp-d16") {
568 Features.push_back("+vfp4");
569 Features.push_back("+d16");
570 Features.push_back("+fp-only-sp");
571 Features.push_back("-neon");
Oliver Stannardbfd3ea32014-10-01 09:03:02 +0000572 } else if (FPU == "fp5-sp-d16" || FPU == "fpv5-sp-d16") {
573 Features.push_back("+fp-armv8");
574 Features.push_back("+fp-only-sp");
575 Features.push_back("+d16");
576 Features.push_back("-neon");
577 Features.push_back("-crypto");
578 } else if (FPU == "fp5-dp-d16" || FPU == "fpv5-dp-d16" ||
579 FPU == "fp5-d16" || FPU == "fpv5-d16") {
580 Features.push_back("+fp-armv8");
581 Features.push_back("+d16");
582 Features.push_back("-neon");
583 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000584 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000585 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000586 Features.push_back("-neon");
587 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000588 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000589 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000590 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000591 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000592 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000593 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000594 Features.push_back("+neon");
595 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000596 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000597 Features.push_back("+neon");
Richard Barton3b0dcc12014-11-28 20:39:59 +0000598 } else if (FPU == "neon-vfpv3") {
Richard Barton2c5a8972014-12-18 16:31:18 +0000599 Features.push_back("+vfp3");
Richard Barton3b0dcc12014-11-28 20:39:59 +0000600 Features.push_back("+neon");
Richard Barton09b60b22014-11-28 20:39:54 +0000601 } else if (FPU == "neon-vfpv4") {
602 Features.push_back("+neon");
Richard Barton2c5a8972014-12-18 16:31:18 +0000603 Features.push_back("+vfp4");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000604 } else if (FPU == "none") {
605 Features.push_back("-vfp2");
606 Features.push_back("-vfp3");
607 Features.push_back("-vfp4");
608 Features.push_back("-fp-armv8");
609 Features.push_back("-crypto");
610 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000611 } else
612 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
613}
614
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000615// Select the float ABI as determined by -msoft-float, -mhard-float, and
616// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000617StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000618 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000619 StringRef FloatABI;
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000620 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
621 options::OPT_mhard_float,
622 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000623 if (A->getOption().matches(options::OPT_msoft_float))
624 FloatABI = "soft";
625 else if (A->getOption().matches(options::OPT_mhard_float))
626 FloatABI = "hard";
627 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000628 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000629 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000630 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000631 << A->getAsString(Args);
632 FloatABI = "soft";
633 }
634 }
635 }
636
637 // If unspecified, choose the default based on the platform.
638 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000639 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000640 case llvm::Triple::Darwin:
641 case llvm::Triple::MacOSX:
642 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000643 // Darwin defaults to "softfp" for v6 and v7.
644 //
645 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000646 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000647 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000648 if (StringRef(ArchName).startswith("v6") ||
649 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000650 FloatABI = "softfp";
651 else
652 FloatABI = "soft";
653 break;
654 }
655
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000656 // FIXME: this is invalid for WindowsCE
657 case llvm::Triple::Win32:
658 FloatABI = "hard";
659 break;
660
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000661 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000662 switch(Triple.getEnvironment()) {
663 case llvm::Triple::GNUEABIHF:
664 FloatABI = "hard";
665 break;
666 default:
667 // FreeBSD defaults to soft float
668 FloatABI = "soft";
669 break;
670 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000671 break;
672
Daniel Dunbar78485922009-09-10 23:00:09 +0000673 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000674 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000675 case llvm::Triple::GNUEABIHF:
676 FloatABI = "hard";
677 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000678 case llvm::Triple::GNUEABI:
679 FloatABI = "softfp";
680 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000681 case llvm::Triple::EABIHF:
682 FloatABI = "hard";
683 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000684 case llvm::Triple::EABI:
685 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
686 FloatABI = "softfp";
687 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000688 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000689 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000690 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000691 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000692 FloatABI = "softfp";
693 else
694 FloatABI = "soft";
695 break;
696 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000697 default:
698 // Assume "soft", but warn the user we are guessing.
699 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000700 if (Triple.getOS() != llvm::Triple::UnknownOS ||
701 !Triple.isOSBinFormatMachO())
702 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000703 break;
704 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000705 }
706 }
707
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000708 return FloatABI;
709}
710
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000711static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
712 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000713 std::vector<const char *> &Features,
714 bool ForAS) {
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000715 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000716 if (!ForAS) {
717 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
718 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
719 // stripped out by the ARM target. We should probably pass this a new
720 // -target-option, which is handled by the -cc1/-cc1as invocation.
721 //
722 // FIXME2: For consistency, it would be ideal if we set up the target
723 // machine state the same when using the frontend or the assembler. We don't
724 // currently do that for the assembler, we pass the options directly to the
725 // backend and never even instantiate the frontend TargetInfo. If we did,
726 // and used its handleTargetFeatures hook, then we could ensure the
727 // assembler and the frontend behave the same.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000728
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000729 // Use software floating point operations?
730 if (FloatABI == "soft")
731 Features.push_back("+soft-float");
732
733 // Use software floating point argument passing?
734 if (FloatABI != "hard")
735 Features.push_back("+soft-float-abi");
736 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000737
738 // Honor -mfpu=.
739 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000740 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000741 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
742 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000743
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000744 // Setting -msoft-float effectively disables NEON because of the GCC
745 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000746 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000747 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000748 // Also need to explicitly disable features which imply NEON.
749 Features.push_back("-crypto");
750 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000751
752 // En/disable crc
753 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
754 options::OPT_mnocrc)) {
755 if (A->getOption().matches(options::OPT_mcrc))
756 Features.push_back("+crc");
757 else
758 Features.push_back("-crc");
759 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000760}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000761
762void Clang::AddARMTargetArgs(const ArgList &Args,
763 ArgStringList &CmdArgs,
764 bool KernelOrKext) const {
765 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000766 // Get the effective triple, which takes into account the deployment target.
767 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
768 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000769 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000770
771 // Select the ABI to use.
772 //
773 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000774 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000775 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000776 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000777 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000778 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000779 // The backend is hardwired to assume AAPCS for M-class processors, ensure
780 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000781 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Eric Christopher610952e2014-12-05 00:22:48 +0000782 Triple.getOS() == llvm::Triple::UnknownOS ||
Tim Northovere66c9462013-10-03 14:23:28 +0000783 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000784 ABIName = "aapcs";
785 } else {
786 ABIName = "apcs-gnu";
787 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000788 } else if (Triple.isOSWindows()) {
789 // FIXME: this is invalid for WindowsCE
790 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000791 } else {
792 // Select the default based on the platform.
793 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000794 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000795 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000796 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000797 ABIName = "aapcs-linux";
798 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000799 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000800 case llvm::Triple::EABI:
801 ABIName = "aapcs";
802 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000803 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000804 if (Triple.getOS() == llvm::Triple::NetBSD)
805 ABIName = "apcs-gnu";
806 else
807 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000808 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000809 }
810 }
811 CmdArgs.push_back("-target-abi");
812 CmdArgs.push_back(ABIName);
813
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000814 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000815 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000816 if (FloatABI == "soft") {
817 // Floating point operations and argument passing are soft.
818 //
819 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000820 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000821 CmdArgs.push_back("-mfloat-abi");
822 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000823 } else if (FloatABI == "softfp") {
824 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000825 CmdArgs.push_back("-mfloat-abi");
826 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000827 } else {
828 // Floating point operations and argument passing are hard.
829 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000830 CmdArgs.push_back("-mfloat-abi");
831 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000832 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000833
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000834 // Kernel code has more strict alignment requirements.
835 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000836 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000837 CmdArgs.push_back("-backend-option");
838 CmdArgs.push_back("-arm-long-calls");
839 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000840
Daniel Dunbar12100e22011-03-22 16:48:17 +0000841 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000842 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000843
844 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000845 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000846 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000847 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000848
Bob Wilson0874e532014-07-29 00:23:18 +0000849 // -mkernel implies -mstrict-align; don't add the redundant option.
850 if (!KernelOrKext) {
851 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
852 options::OPT_munaligned_access)) {
853 CmdArgs.push_back("-backend-option");
854 if (A->getOption().matches(options::OPT_mno_unaligned_access))
855 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000856 else {
Jonathan Roelofs2b00d542014-10-07 15:11:32 +0000857 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Oliver Stannard76244be2014-08-13 09:18:12 +0000858 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000859 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000860 }
Bob Wilson0874e532014-07-29 00:23:18 +0000861 }
862 }
863
Chad Rosierba3df1d2011-08-26 00:26:29 +0000864 // Setting -mno-global-merge disables the codegen global merge pass. Setting
865 // -mglobal-merge has no effect as the pass is enabled by default.
866 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
867 options::OPT_mno_global_merge)) {
868 if (A->getOption().matches(options::OPT_mno_global_merge))
869 CmdArgs.push_back("-mno-global-merge");
870 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000871
Bob Wilson9c8af452013-04-11 18:53:25 +0000872 if (!Args.hasFlag(options::OPT_mimplicit_float,
873 options::OPT_mno_implicit_float,
874 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000875 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000876
Logan Chien749763e2014-04-03 13:12:44 +0000877 // llvm does not support reserving registers in general. There is support
878 // for reserving r9 on ARM though (defined as a platform-specific register
879 // in ARM EABI).
880 if (Args.hasArg(options::OPT_ffixed_r9)) {
881 CmdArgs.push_back("-backend-option");
882 CmdArgs.push_back("-arm-reserve-r9");
883 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000884}
885
Tim Northover573cbee2014-05-24 12:52:07 +0000886/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
887/// targeting.
888static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000889 Arg *A;
890 std::string CPU;
891 // If we have -mtune or -mcpu, use that.
892 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
893 CPU = A->getValue();
894 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
895 StringRef Mcpu = A->getValue();
896 CPU = Mcpu.split("+").first;
Tim Northovera2ee4332014-03-29 15:09:45 +0000897 }
898
Kevin Qin110db6f2014-07-18 07:03:22 +0000899 // Handle CPU name is 'native'.
900 if (CPU == "native")
901 return llvm::sys::getHostCPUName();
902 else if (CPU.size())
903 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000904
James Molloy9b1586b2014-04-17 12:51:17 +0000905 // Make sure we pick "cyclone" if -arch is used.
906 // FIXME: Should this be picked by checking the target triple instead?
907 if (Args.getLastArg(options::OPT_arch))
908 return "cyclone";
909
910 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000911}
912
Tim Northover573cbee2014-05-24 12:52:07 +0000913void Clang::AddAArch64TargetArgs(const ArgList &Args,
914 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000915 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
916 llvm::Triple Triple(TripleStr);
917
918 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
919 Args.hasArg(options::OPT_mkernel) ||
920 Args.hasArg(options::OPT_fapple_kext))
921 CmdArgs.push_back("-disable-red-zone");
922
923 if (!Args.hasFlag(options::OPT_mimplicit_float,
924 options::OPT_mno_implicit_float, true))
925 CmdArgs.push_back("-no-implicit-float");
926
Craig Topper92fc2df2014-05-17 16:56:41 +0000927 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000928 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
929 ABIName = A->getValue();
930 else if (Triple.isOSDarwin())
931 ABIName = "darwinpcs";
932 else
933 ABIName = "aapcs";
934
935 CmdArgs.push_back("-target-abi");
936 CmdArgs.push_back(ABIName);
937
Bob Wilson0874e532014-07-29 00:23:18 +0000938 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
939 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000940 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000941 if (A->getOption().matches(options::OPT_mno_unaligned_access))
942 CmdArgs.push_back("-aarch64-strict-align");
943 else
944 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000945 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000946
Bradley Smith9ff64332014-10-13 10:16:06 +0000947 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
948 options::OPT_mno_fix_cortex_a53_835769)) {
949 CmdArgs.push_back("-backend-option");
950 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
951 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
952 else
953 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000954 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
955 // Enabled A53 errata (835769) workaround by default on android
956 CmdArgs.push_back("-backend-option");
957 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000958 }
959
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000960 // Setting -mno-global-merge disables the codegen global merge pass. Setting
961 // -mglobal-merge has no effect as the pass is enabled by default.
962 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
963 options::OPT_mno_global_merge)) {
964 if (A->getOption().matches(options::OPT_mno_global_merge))
965 CmdArgs.push_back("-mno-global-merge");
966 }
Renato Golinb625f482015-01-25 23:17:48 +0000967
968 if (Args.hasArg(options::OPT_ffixed_x18)) {
969 CmdArgs.push_back("-backend-option");
970 CmdArgs.push_back("-aarch64-reserve-x18");
971 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000972}
973
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000974// Get CPU and ABI names. They are not independent
975// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000976void mips::getMipsCPUAndABI(const ArgList &Args,
977 const llvm::Triple &Triple,
978 StringRef &CPUName,
979 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000980 const char *DefMips32CPU = "mips32r2";
981 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000982
Daniel Sanders2bf13662014-07-10 14:40:57 +0000983 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
984 // default for mips64(el)?-img-linux-gnu.
985 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
986 Triple.getEnvironment() == llvm::Triple::GNU) {
987 DefMips32CPU = "mips32r6";
988 DefMips64CPU = "mips64r6";
989 }
990
Brad Smithba26f582015-01-06 02:53:17 +0000991 // MIPS3 is the default for mips64*-unknown-openbsd.
992 if (Triple.getOS() == llvm::Triple::OpenBSD)
993 DefMips64CPU = "mips3";
994
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000995 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000996 options::OPT_mcpu_EQ))
997 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000998
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000999 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001000 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001001 // Convert a GNU style Mips ABI name to the name
1002 // accepted by LLVM Mips backend.
1003 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
1004 .Case("32", "o32")
1005 .Case("64", "n64")
1006 .Default(ABIName);
1007 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001008
1009 // Setup default CPU and ABI names.
1010 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001011 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001012 default:
1013 llvm_unreachable("Unexpected triple arch name");
1014 case llvm::Triple::mips:
1015 case llvm::Triple::mipsel:
1016 CPUName = DefMips32CPU;
1017 break;
1018 case llvm::Triple::mips64:
1019 case llvm::Triple::mips64el:
1020 CPUName = DefMips64CPU;
1021 break;
1022 }
1023 }
1024
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001025 if (ABIName.empty()) {
1026 // Deduce ABI name from the target triple.
1027 if (Triple.getArch() == llvm::Triple::mips ||
1028 Triple.getArch() == llvm::Triple::mipsel)
1029 ABIName = "o32";
1030 else
1031 ABIName = "n64";
1032 }
1033
1034 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001035 // Deduce CPU name from ABI name.
1036 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +00001037 .Cases("o32", "eabi", DefMips32CPU)
1038 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001039 .Default("");
1040 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001041
1042 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001043}
1044
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001045// Convert ABI name to the GNU tools acceptable variant.
1046static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1047 return llvm::StringSwitch<llvm::StringRef>(ABI)
1048 .Case("o32", "32")
1049 .Case("n64", "64")
1050 .Default(ABI);
1051}
1052
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001053// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1054// and -mfloat-abi=.
1055static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001056 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +00001057 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001058 options::OPT_mhard_float,
1059 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001060 if (A->getOption().matches(options::OPT_msoft_float))
1061 FloatABI = "soft";
1062 else if (A->getOption().matches(options::OPT_mhard_float))
1063 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001064 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001065 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001066 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001067 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001068 FloatABI = "hard";
1069 }
1070 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001071 }
1072
1073 // If unspecified, choose the default based on the platform.
1074 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001075 // Assume "hard", because it's a default value used by gcc.
1076 // When we start to recognize specific target MIPS processors,
1077 // we will be able to select the default more correctly.
1078 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001079 }
1080
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001081 return FloatABI;
1082}
1083
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001084static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001085 std::vector<const char *> &Features,
1086 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001087 StringRef FeatureName) {
1088 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001089 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001090 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001091 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001092 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001093 }
1094}
1095
Daniel Sanders379d44b2014-07-16 11:52:23 +00001096static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1097 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001098 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001099 StringRef CPUName;
1100 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001101 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001102 ABIName = getGnuCompatibleMipsABIName(ABIName);
1103
Daniel Sandersfeb61302014-08-08 15:47:17 +00001104 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1105 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001106
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001107 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001108 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001109 // FIXME: Note, this is a hack. We need to pass the selected float
1110 // mode to the MipsTargetInfoBase to define appropriate macros there.
1111 // Now it is the only method.
1112 Features.push_back("+soft-float");
1113 }
1114
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001115 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001116 StringRef Val = StringRef(A->getValue());
1117 if (Val == "2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001118 Features.push_back("+nan2008");
Matheus Almeida602bff32014-05-07 16:16:07 +00001119 else if (Val == "legacy")
1120 Features.push_back("-nan2008");
1121 else
1122 D.Diag(diag::err_drv_unsupported_option_argument)
1123 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001124 }
1125
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001126 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1127 options::OPT_mdouble_float, "single-float");
1128 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1129 "mips16");
1130 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1131 options::OPT_mno_micromips, "micromips");
1132 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1133 "dsp");
1134 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1135 "dspr2");
1136 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1137 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001138
1139 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1140 // pass -mfpxx
1141 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1142 options::OPT_mfp64)) {
1143 if (A->getOption().matches(options::OPT_mfp32))
1144 Features.push_back(Args.MakeArgString("-fp64"));
1145 else if (A->getOption().matches(options::OPT_mfpxx)) {
1146 Features.push_back(Args.MakeArgString("+fpxx"));
1147 Features.push_back(Args.MakeArgString("+nooddspreg"));
1148 } else
1149 Features.push_back(Args.MakeArgString("+fp64"));
1150 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001151 Features.push_back(Args.MakeArgString("+fpxx"));
1152 Features.push_back(Args.MakeArgString("+nooddspreg"));
1153 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001154
Daniel Sanders28e5d392014-07-10 10:39:51 +00001155 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1156 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001157}
1158
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001159void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001160 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001161 const Driver &D = getToolChain().getDriver();
1162 StringRef CPUName;
1163 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001164 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001165 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001166
1167 CmdArgs.push_back("-target-abi");
1168 CmdArgs.push_back(ABIName.data());
1169
1170 StringRef FloatABI = getMipsFloatABI(D, Args);
1171
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001172 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001173 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001174 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001175 CmdArgs.push_back("-mfloat-abi");
1176 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001177 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001178 else {
1179 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001180 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001181 CmdArgs.push_back("-mfloat-abi");
1182 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001183 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001184
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001185 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1186 if (A->getOption().matches(options::OPT_mxgot)) {
1187 CmdArgs.push_back("-mllvm");
1188 CmdArgs.push_back("-mxgot");
1189 }
1190 }
1191
Simon Atanasyanc580b322013-05-11 06:33:44 +00001192 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1193 options::OPT_mno_ldc1_sdc1)) {
1194 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1195 CmdArgs.push_back("-mllvm");
1196 CmdArgs.push_back("-mno-ldc1-sdc1");
1197 }
1198 }
1199
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001200 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1201 options::OPT_mno_check_zero_division)) {
1202 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1203 CmdArgs.push_back("-mllvm");
1204 CmdArgs.push_back("-mno-check-zero-division");
1205 }
1206 }
1207
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001208 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001209 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001210 CmdArgs.push_back("-mllvm");
1211 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1212 A->claim();
1213 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001214}
1215
Hal Finkel8eb59282012-06-11 22:35:19 +00001216/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1217static std::string getPPCTargetCPU(const ArgList &Args) {
1218 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001219 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001220
1221 if (CPUName == "native") {
1222 std::string CPU = llvm::sys::getHostCPUName();
1223 if (!CPU.empty() && CPU != "generic")
1224 return CPU;
1225 else
1226 return "";
1227 }
1228
1229 return llvm::StringSwitch<const char *>(CPUName)
1230 .Case("common", "generic")
1231 .Case("440", "440")
1232 .Case("440fp", "440")
1233 .Case("450", "450")
1234 .Case("601", "601")
1235 .Case("602", "602")
1236 .Case("603", "603")
1237 .Case("603e", "603e")
1238 .Case("603ev", "603ev")
1239 .Case("604", "604")
1240 .Case("604e", "604e")
1241 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001242 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001243 .Case("G3", "g3")
1244 .Case("7400", "7400")
1245 .Case("G4", "g4")
1246 .Case("7450", "7450")
1247 .Case("G4+", "g4+")
1248 .Case("750", "750")
1249 .Case("970", "970")
1250 .Case("G5", "g5")
1251 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001252 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001253 .Case("e500mc", "e500mc")
1254 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001255 .Case("power3", "pwr3")
1256 .Case("power4", "pwr4")
1257 .Case("power5", "pwr5")
1258 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001259 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001260 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001261 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001262 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001263 .Case("pwr3", "pwr3")
1264 .Case("pwr4", "pwr4")
1265 .Case("pwr5", "pwr5")
1266 .Case("pwr5x", "pwr5x")
1267 .Case("pwr6", "pwr6")
1268 .Case("pwr6x", "pwr6x")
1269 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001270 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001271 .Case("powerpc", "ppc")
1272 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001273 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001274 .Default("");
1275 }
1276
1277 return "";
1278}
1279
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001280static void getPPCTargetFeatures(const ArgList &Args,
1281 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001282 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1283 ie = Args.filtered_end();
1284 it != ie; ++it) {
1285 StringRef Name = (*it)->getOption().getName();
1286 (*it)->claim();
1287
1288 // Skip over "-m".
1289 assert(Name.startswith("m") && "Invalid feature name.");
1290 Name = Name.substr(1);
1291
1292 bool IsNegative = Name.startswith("no-");
1293 if (IsNegative)
1294 Name = Name.substr(3);
1295
1296 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1297 // pass the correct option to the backend while calling the frontend
1298 // option the same.
1299 // TODO: Change the LLVM backend option maybe?
1300 if (Name == "mfcrf")
1301 Name = "mfocrf";
1302
1303 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1304 }
1305
1306 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001307 AddTargetFeature(Args, Features, options::OPT_faltivec,
1308 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001309}
1310
Ulrich Weigand8afad612014-07-28 13:17:52 +00001311void Clang::AddPPCTargetArgs(const ArgList &Args,
1312 ArgStringList &CmdArgs) const {
1313 // Select the ABI to use.
1314 const char *ABIName = nullptr;
1315 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1316 ABIName = A->getValue();
1317 } else if (getToolChain().getTriple().isOSLinux())
1318 switch(getToolChain().getArch()) {
1319 case llvm::Triple::ppc64:
1320 ABIName = "elfv1";
1321 break;
1322 case llvm::Triple::ppc64le:
1323 ABIName = "elfv2";
1324 break;
1325 default:
1326 break;
1327 }
1328
1329 if (ABIName) {
1330 CmdArgs.push_back("-target-abi");
1331 CmdArgs.push_back(ABIName);
1332 }
1333}
1334
1335bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1336 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1337 return A && (A->getValue() == StringRef(Value));
1338}
1339
Tom Stellard6674c702013-04-01 20:56:53 +00001340/// Get the (LLVM) name of the R600 gpu we are targeting.
1341static std::string getR600TargetGPU(const ArgList &Args) {
1342 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001343 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001344 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001345 .Cases("rv630", "rv635", "r600")
1346 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001347 .Case("rv740", "rv770")
1348 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001349 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001350 .Case("hemlock", "cypress")
1351 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001352 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001353 }
1354 return "";
1355}
1356
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001357static void getSparcTargetFeatures(const ArgList &Args,
Brad Smithf436e9e2014-08-19 21:50:15 +00001358 std::vector<const char *> &Features) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001359 bool SoftFloatABI = true;
1360 if (Arg *A =
1361 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1362 if (A->getOption().matches(options::OPT_mhard_float))
1363 SoftFloatABI = false;
1364 }
1365 if (SoftFloatABI)
1366 Features.push_back("+soft-float");
1367}
1368
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001369void Clang::AddSparcTargetArgs(const ArgList &Args,
1370 ArgStringList &CmdArgs) const {
1371 const Driver &D = getToolChain().getDriver();
1372
Brad Smith10cd0f42014-07-11 20:12:08 +00001373 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001374 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001375 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1376 options::OPT_mhard_float)) {
1377 if (A->getOption().matches(options::OPT_msoft_float))
1378 FloatABI = "soft";
1379 else if (A->getOption().matches(options::OPT_mhard_float))
1380 FloatABI = "hard";
1381 }
1382
1383 // If unspecified, choose the default based on the platform.
1384 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001385 // Assume "soft", but warn the user we are guessing.
1386 FloatABI = "soft";
1387 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001388 }
1389
1390 if (FloatABI == "soft") {
1391 // Floating point operations and argument passing are soft.
1392 //
1393 // FIXME: This changes CPP defines, we need -target-soft-float.
1394 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001395 } else {
1396 assert(FloatABI == "hard" && "Invalid float abi!");
1397 CmdArgs.push_back("-mhard-float");
1398 }
1399}
1400
Richard Sandiford4652d892013-07-19 16:51:51 +00001401static const char *getSystemZTargetCPU(const ArgList &Args) {
1402 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1403 return A->getValue();
1404 return "z10";
1405}
1406
Chandler Carruth953fb082013-01-13 11:46:33 +00001407static const char *getX86TargetCPU(const ArgList &Args,
1408 const llvm::Triple &Triple) {
1409 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001410 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001411 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001412 return "core-avx2";
1413
Chandler Carruth953fb082013-01-13 11:46:33 +00001414 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001415 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001416
1417 // FIXME: Reject attempts to use -march=native unless the target matches
1418 // the host.
1419 //
1420 // FIXME: We should also incorporate the detected target features for use
1421 // with -native.
1422 std::string CPU = llvm::sys::getHostCPUName();
1423 if (!CPU.empty() && CPU != "generic")
1424 return Args.MakeArgString(CPU);
1425 }
1426
1427 // Select the default CPU if none was given (or detection failed).
1428
1429 if (Triple.getArch() != llvm::Triple::x86_64 &&
1430 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001431 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001432
1433 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1434
1435 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001436 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001437 if (Triple.getArchName() == "x86_64h")
1438 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001439 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001440 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001441
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001442 // Set up default CPU name for PS4 compilers.
1443 if (Triple.isPS4CPU())
1444 return "btver2";
1445
Alexey Bataev286d1b92014-01-31 04:07:13 +00001446 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001447 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001448 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001449
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001450 // Everything else goes to x86-64 in 64-bit mode.
1451 if (Is64Bit)
1452 return "x86-64";
1453
1454 switch (Triple.getOS()) {
1455 case llvm::Triple::FreeBSD:
1456 case llvm::Triple::NetBSD:
1457 case llvm::Triple::OpenBSD:
1458 return "i486";
1459 case llvm::Triple::Haiku:
1460 return "i586";
1461 case llvm::Triple::Bitrig:
1462 return "i686";
1463 default:
1464 // Fallback to p4.
1465 return "pentium4";
1466 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001467}
1468
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001469static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1470 switch(T.getArch()) {
1471 default:
1472 return "";
1473
Amara Emerson703da2e2013-10-31 09:32:33 +00001474 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001475 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001476 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001477
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001478 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001479 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001480 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001481 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001482 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001483
1484 case llvm::Triple::mips:
1485 case llvm::Triple::mipsel:
1486 case llvm::Triple::mips64:
1487 case llvm::Triple::mips64el: {
1488 StringRef CPUName;
1489 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001490 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001491 return CPUName;
1492 }
1493
1494 case llvm::Triple::ppc:
1495 case llvm::Triple::ppc64:
1496 case llvm::Triple::ppc64le: {
1497 std::string TargetCPUName = getPPCTargetCPU(Args);
1498 // LLVM may default to generating code for the native CPU,
1499 // but, like gcc, we default to a more generic option for
1500 // each architecture. (except on Darwin)
1501 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1502 if (T.getArch() == llvm::Triple::ppc64)
1503 TargetCPUName = "ppc64";
1504 else if (T.getArch() == llvm::Triple::ppc64le)
1505 TargetCPUName = "ppc64le";
1506 else
1507 TargetCPUName = "ppc";
1508 }
1509 return TargetCPUName;
1510 }
1511
1512 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001513 case llvm::Triple::sparcv9:
1514 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001515 return A->getValue();
1516 return "";
1517
1518 case llvm::Triple::x86:
1519 case llvm::Triple::x86_64:
1520 return getX86TargetCPU(Args, T);
1521
1522 case llvm::Triple::hexagon:
1523 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1524
1525 case llvm::Triple::systemz:
1526 return getSystemZTargetCPU(Args);
1527
1528 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001529 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001530 return getR600TargetGPU(Args);
1531 }
1532}
1533
Alp Tokerce365ca2013-12-02 12:43:03 +00001534static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1535 ArgStringList &CmdArgs) {
1536 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1537 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1538 // forward.
1539 CmdArgs.push_back("-plugin");
Rafael Espindola3e34e652015-02-03 16:33:53 +00001540 std::string Plugin = ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001541 CmdArgs.push_back(Args.MakeArgString(Plugin));
1542
1543 // Try to pass driver level flags relevant to LTO code generation down to
1544 // the plugin.
1545
1546 // Handle flags for selecting CPU variants.
1547 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1548 if (!CPU.empty())
1549 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1550}
1551
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001552static void getX86TargetFeatures(const Driver & D,
1553 const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001554 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001555 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001556 if (Triple.getArchName() == "x86_64h") {
1557 // x86_64h implies quite a few of the more modern subtarget features
1558 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1559 Features.push_back("-rdrnd");
1560 Features.push_back("-aes");
1561 Features.push_back("-pclmul");
1562 Features.push_back("-rtm");
1563 Features.push_back("-hle");
1564 Features.push_back("-fsgsbase");
1565 }
1566
Alexey Volkov54ff0802014-06-25 12:15:36 +00001567 // Add features to comply with gcc on Android
Alexey Bataev286d1b92014-01-31 04:07:13 +00001568 if (Triple.getEnvironment() == llvm::Triple::Android) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001569 if (Triple.getArch() == llvm::Triple::x86_64) {
1570 Features.push_back("+sse4.2");
1571 Features.push_back("+popcnt");
1572 } else
1573 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001574 }
1575
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001576 // Set features according to the -arch flag on MSVC
1577 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1578 StringRef Arch = A->getValue();
1579 bool ArchUsed = false;
1580 // First, look for flags that are shared in x86 and x86-64.
1581 if (Triple.getArch() == llvm::Triple::x86_64 ||
1582 Triple.getArch() == llvm::Triple::x86) {
1583 if (Arch == "AVX" || Arch == "AVX2") {
1584 ArchUsed = true;
1585 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1586 }
1587 }
1588 // Then, look for x86-specific flags.
1589 if (Triple.getArch() == llvm::Triple::x86) {
1590 if (Arch == "IA32") {
1591 ArchUsed = true;
1592 } else if (Arch == "SSE" || Arch == "SSE2") {
1593 ArchUsed = true;
1594 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1595 }
1596 }
1597 if (!ArchUsed)
1598 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1599 }
1600
Jim Grosbach82eee262013-11-16 00:53:35 +00001601 // Now add any that the user explicitly requested on the command line,
1602 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001603 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1604 ie = Args.filtered_end();
1605 it != ie; ++it) {
1606 StringRef Name = (*it)->getOption().getName();
1607 (*it)->claim();
1608
1609 // Skip over "-m".
1610 assert(Name.startswith("m") && "Invalid feature name.");
1611 Name = Name.substr(1);
1612
1613 bool IsNegative = Name.startswith("no-");
1614 if (IsNegative)
1615 Name = Name.substr(3);
1616
1617 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1618 }
1619}
1620
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001621void Clang::AddX86TargetArgs(const ArgList &Args,
1622 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001623 if (!Args.hasFlag(options::OPT_mred_zone,
1624 options::OPT_mno_red_zone,
1625 true) ||
1626 Args.hasArg(options::OPT_mkernel) ||
1627 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001628 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001629
Bob Wilson2616e2e2013-02-10 16:01:41 +00001630 // Default to avoid implicit floating-point for kernel/kext code, but allow
1631 // that to be overridden with -mno-soft-float.
1632 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1633 Args.hasArg(options::OPT_fapple_kext));
1634 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1635 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001636 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001637 options::OPT_mno_implicit_float)) {
1638 const Option &O = A->getOption();
1639 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1640 O.matches(options::OPT_msoft_float));
1641 }
1642 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001643 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001644
1645 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1646 StringRef Value = A->getValue();
1647 if (Value == "intel" || Value == "att") {
1648 CmdArgs.push_back("-mllvm");
1649 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1650 } else {
1651 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1652 << A->getOption().getName() << Value;
1653 }
1654 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001655}
1656
Matthew Curtise8f80a12012-12-06 17:49:03 +00001657static inline bool HasPICArg(const ArgList &Args) {
1658 return Args.hasArg(options::OPT_fPIC)
1659 || Args.hasArg(options::OPT_fpic);
1660}
1661
1662static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1663 return Args.getLastArg(options::OPT_G,
1664 options::OPT_G_EQ,
1665 options::OPT_msmall_data_threshold_EQ);
1666}
1667
1668static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1669 std::string value;
1670 if (HasPICArg(Args))
1671 value = "0";
1672 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1673 value = A->getValue();
1674 A->claim();
1675 }
1676 return value;
1677}
1678
Tony Linthicum76329bf2011-12-12 21:14:55 +00001679void Clang::AddHexagonTargetArgs(const ArgList &Args,
1680 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001681 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001682 CmdArgs.push_back("-mqdsp6-compat");
1683 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001684
Matthew Curtise8f80a12012-12-06 17:49:03 +00001685 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1686 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001687 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001688 CmdArgs.push_back(Args.MakeArgString(
1689 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001690 }
1691
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001692 if (!Args.hasArg(options::OPT_fno_short_enums))
1693 CmdArgs.push_back("-fshort-enums");
1694 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1695 CmdArgs.push_back ("-mllvm");
1696 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1697 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001698 CmdArgs.push_back ("-mllvm");
1699 CmdArgs.push_back ("-machine-sink-split=0");
1700}
1701
Kevin Qin110db6f2014-07-18 07:03:22 +00001702// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001703static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001704 std::vector<const char *> &Features) {
1705 SmallVector<StringRef, 8> Split;
1706 text.split(Split, StringRef("+"), -1, false);
1707
1708 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1709 const char *result = llvm::StringSwitch<const char *>(Split[I])
1710 .Case("fp", "+fp-armv8")
1711 .Case("simd", "+neon")
1712 .Case("crc", "+crc")
1713 .Case("crypto", "+crypto")
1714 .Case("nofp", "-fp-armv8")
1715 .Case("nosimd", "-neon")
1716 .Case("nocrc", "-crc")
1717 .Case("nocrypto", "-crypto")
1718 .Default(nullptr);
1719 if (result)
1720 Features.push_back(result);
1721 else if (Split[I] == "neon" || Split[I] == "noneon")
1722 D.Diag(diag::err_drv_no_neon_modifier);
1723 else
1724 return false;
1725 }
1726 return true;
1727}
1728
1729// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1730// decode CPU and feature.
1731static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1732 std::vector<const char *> &Features) {
1733 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1734 CPU = Split.first;
Renato Golin84545d72015-02-04 13:31:56 +00001735 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001736 Features.push_back("+neon");
1737 Features.push_back("+crc");
1738 Features.push_back("+crypto");
1739 } else if (CPU == "generic") {
1740 Features.push_back("+neon");
1741 } else {
1742 return false;
1743 }
1744
1745 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1746 return false;
1747
1748 return true;
1749}
1750
1751static bool
1752getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1753 const ArgList &Args,
1754 std::vector<const char *> &Features) {
1755 std::pair<StringRef, StringRef> Split = March.split("+");
1756 if (Split.first != "armv8-a")
1757 return false;
1758
1759 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1760 return false;
1761
1762 return true;
1763}
1764
1765static bool
1766getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1767 const ArgList &Args,
1768 std::vector<const char *> &Features) {
1769 StringRef CPU;
1770 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1771 return false;
1772
1773 return true;
1774}
1775
1776static bool
1777getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1778 const ArgList &Args,
1779 std::vector<const char *> &Features) {
1780 // Handle CPU name is 'native'.
1781 if (Mtune == "native")
1782 Mtune = llvm::sys::getHostCPUName();
1783 if (Mtune == "cyclone") {
1784 Features.push_back("+zcm");
1785 Features.push_back("+zcz");
1786 }
1787 return true;
1788}
1789
1790static bool
1791getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1792 const ArgList &Args,
1793 std::vector<const char *> &Features) {
1794 StringRef CPU;
1795 std::vector<const char *> DecodedFeature;
1796 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1797 return false;
1798
1799 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1800}
1801
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001802static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1803 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001804 Arg *A;
1805 bool success = true;
1806 // Enable NEON by default.
1807 Features.push_back("+neon");
1808 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1809 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1810 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1811 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001812 else if (Args.hasArg(options::OPT_arch))
1813 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1814 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001815
1816 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1817 success =
1818 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1819 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1820 success =
1821 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001822 else if (Args.hasArg(options::OPT_arch))
1823 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1824 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001825
1826 if (!success)
1827 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001828
1829 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1830 Features.push_back("-fp-armv8");
1831 Features.push_back("-crypto");
1832 Features.push_back("-neon");
1833 }
Bradley Smith418c5932014-05-02 15:17:51 +00001834
1835 // En/disable crc
1836 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1837 options::OPT_mnocrc)) {
1838 if (A->getOption().matches(options::OPT_mcrc))
1839 Features.push_back("+crc");
1840 else
1841 Features.push_back("-crc");
1842 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001843}
1844
1845static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001846 const ArgList &Args, ArgStringList &CmdArgs,
1847 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001848 std::vector<const char *> Features;
1849 switch (Triple.getArch()) {
1850 default:
1851 break;
1852 case llvm::Triple::mips:
1853 case llvm::Triple::mipsel:
1854 case llvm::Triple::mips64:
1855 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001856 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001857 break;
1858
1859 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001860 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001861 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001862 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001863 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001864 break;
1865
1866 case llvm::Triple::ppc:
1867 case llvm::Triple::ppc64:
1868 case llvm::Triple::ppc64le:
1869 getPPCTargetFeatures(Args, Features);
1870 break;
1871 case llvm::Triple::sparc:
Brad Smithf436e9e2014-08-19 21:50:15 +00001872 case llvm::Triple::sparcv9:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001873 getSparcTargetFeatures(Args, Features);
1874 break;
1875 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001876 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001877 getAArch64TargetFeatures(D, Args, Features);
1878 break;
1879 case llvm::Triple::x86:
1880 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001881 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001882 break;
1883 }
Rafael Espindola43964802013-08-21 17:34:32 +00001884
1885 // Find the last of each feature.
1886 llvm::StringMap<unsigned> LastOpt;
1887 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1888 const char *Name = Features[I];
1889 assert(Name[0] == '-' || Name[0] == '+');
1890 LastOpt[Name + 1] = I;
1891 }
1892
1893 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1894 // If this feature was overridden, ignore it.
1895 const char *Name = Features[I];
1896 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1897 assert(LastI != LastOpt.end());
1898 unsigned Last = LastI->second;
1899 if (Last != I)
1900 continue;
1901
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001902 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001903 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001904 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001905}
1906
David Majnemerae394812014-12-09 00:12:30 +00001907static bool
1908shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1909 const llvm::Triple &Triple) {
1910 // We use the zero-cost exception tables for Objective-C if the non-fragile
1911 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1912 // later.
1913 if (runtime.isNonFragile())
1914 return true;
1915
1916 if (!Triple.isMacOSX())
1917 return false;
1918
1919 return (!Triple.isMacOSXVersionLT(10,5) &&
1920 (Triple.getArch() == llvm::Triple::x86_64 ||
1921 Triple.getArch() == llvm::Triple::arm));
1922}
1923
Nico Webere8e53112014-05-11 01:04:02 +00001924// exceptionSettings() exists to share the logic between -cc1 and linker
1925// invocations.
David Majnemer8de68642014-12-05 08:11:58 +00001926static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001927 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00001928 options::OPT_fno_exceptions))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001929 if (A->getOption().matches(options::OPT_fexceptions))
David Majnemer8de68642014-12-05 08:11:58 +00001930 return true;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001931
David Majnemer8de68642014-12-05 08:11:58 +00001932 return false;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001933}
1934
Anders Carlssone96ab552011-02-28 02:27:16 +00001935/// addExceptionArgs - Adds exception related arguments to the driver command
1936/// arguments. There's a master flag, -fexceptions and also language specific
1937/// flags to enable/disable C++ and Objective-C exceptions.
1938/// This makes it possible to for example disable C++ exceptions but enable
1939/// Objective-C exceptions.
1940static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1941 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001942 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001943 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001944 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001945 if (KernelOrKext) {
1946 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1947 // arguments now to avoid warnings about unused arguments.
1948 Args.ClaimAllArgs(options::OPT_fexceptions);
1949 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1950 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1951 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1952 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1953 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001954 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001955 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001956
David Majnemer8de68642014-12-05 08:11:58 +00001957 // Gather the exception settings from the command line arguments.
1958 bool EH = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001959
David Majnemerae394812014-12-09 00:12:30 +00001960 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1961 // is not necessarily sensible, but follows GCC.
1962 if (types::isObjC(InputType) &&
1963 Args.hasFlag(options::OPT_fobjc_exceptions,
1964 options::OPT_fno_objc_exceptions,
1965 true)) {
1966 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001967
David Majnemerae394812014-12-09 00:12:30 +00001968 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001969 }
1970
1971 if (types::isCXX(InputType)) {
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001972 bool CXXExceptionsEnabled =
1973 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Eric Christopher84fbdb42011-08-19 00:30:14 +00001974 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1975 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001976 options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00001977 options::OPT_fno_exceptions))
1978 CXXExceptionsEnabled =
1979 A->getOption().matches(options::OPT_fcxx_exceptions) ||
1980 A->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001981
1982 if (CXXExceptionsEnabled) {
1983 CmdArgs.push_back("-fcxx-exceptions");
1984
David Majnemer8de68642014-12-05 08:11:58 +00001985 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00001986 }
1987 }
1988
David Majnemer8de68642014-12-05 08:11:58 +00001989 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00001990 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001991}
1992
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001993static bool ShouldDisableAutolink(const ArgList &Args,
1994 const ToolChain &TC) {
1995 bool Default = true;
1996 if (TC.getTriple().isOSDarwin()) {
1997 // The native darwin assembler doesn't support the linker_option directives,
1998 // so we disable them if we think the .s file will be passed to it.
1999 Default = TC.useIntegratedAs();
2000 }
2001 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2002 Default);
2003}
2004
Ted Kremenek62093662013-03-12 17:02:12 +00002005static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2006 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002007 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
2008 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002009 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002010 return !UseDwarfDirectory;
2011}
2012
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002013/// \brief Check whether the given input tree contains any compilation actions.
2014static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002015 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002016 return true;
2017
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002018 for (const auto &Act : *A)
2019 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002020 return true;
2021
2022 return false;
2023}
2024
2025/// \brief Check if -relax-all should be passed to the internal assembler.
2026/// This is done by default when compiling non-assembler source with -O0.
2027static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2028 bool RelaxDefault = true;
2029
2030 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2031 RelaxDefault = A->getOption().matches(options::OPT_O0);
2032
2033 if (RelaxDefault) {
2034 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002035 for (const auto &Act : C.getActions()) {
2036 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002037 RelaxDefault = true;
2038 break;
2039 }
2040 }
2041 }
2042
2043 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2044 RelaxDefault);
2045}
2046
David Blaikie9260ed62013-07-25 21:19:01 +00002047static void CollectArgsForIntegratedAssembler(Compilation &C,
2048 const ArgList &Args,
2049 ArgStringList &CmdArgs,
2050 const Driver &D) {
2051 if (UseRelaxAll(C, Args))
2052 CmdArgs.push_back("-mrelax-all");
2053
David Peixottodfb66142013-11-14 22:52:58 +00002054 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002055 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002056 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2057 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2058 // arg after parsing the '-I' arg.
2059 bool TakeNextArg = false;
2060
David Blaikie9260ed62013-07-25 21:19:01 +00002061 // When using an integrated assembler, translate -Wa, and -Xassembler
2062 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002063 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002064 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2065 options::OPT_Xassembler),
2066 ie = Args.filtered_end(); it != ie; ++it) {
2067 const Arg *A = *it;
2068 A->claim();
2069
2070 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2071 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002072 if (TakeNextArg) {
2073 CmdArgs.push_back(Value.data());
2074 TakeNextArg = false;
2075 continue;
2076 }
David Blaikie9260ed62013-07-25 21:19:01 +00002077
2078 if (Value == "-force_cpusubtype_ALL") {
2079 // Do nothing, this is the default and we don't support anything else.
2080 } else if (Value == "-L") {
2081 CmdArgs.push_back("-msave-temp-labels");
2082 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergera43604a2014-08-26 18:40:25 +00002083 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie9260ed62013-07-25 21:19:01 +00002084 } else if (Value == "--noexecstack") {
2085 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002086 } else if (Value == "-compress-debug-sections" ||
2087 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002088 CompressDebugSections = true;
2089 } else if (Value == "-nocompress-debug-sections" ||
2090 Value == "--nocompress-debug-sections") {
2091 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002092 } else if (Value.startswith("-I")) {
2093 CmdArgs.push_back(Value.data());
2094 // We need to consume the next argument if the current arg is a plain
2095 // -I. The next arg will be the include directory.
2096 if (Value == "-I")
2097 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002098 } else if (Value.startswith("-gdwarf-")) {
2099 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002100 } else {
2101 D.Diag(diag::err_drv_unsupported_option_argument)
2102 << A->getOption().getName() << Value;
2103 }
2104 }
2105 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002106 if (CompressDebugSections) {
2107 if (llvm::zlib::isAvailable())
2108 CmdArgs.push_back("-compress-debug-sections");
2109 else
2110 D.Diag(diag::warn_debug_compression_unavailable);
2111 }
David Blaikie9260ed62013-07-25 21:19:01 +00002112}
2113
Renato Goline807c122014-01-31 11:47:28 +00002114// Until ARM libraries are build separately, we have them all in one library
2115static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Saleem Abdulrasool61770ab2015-01-02 21:47:33 +00002116 // FIXME: handle 64-bit
2117 if (TC.getTriple().isOSWindows() &&
2118 !TC.getTriple().isWindowsItaniumEnvironment())
2119 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002120 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002121 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002122 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002123}
2124
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002125static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2126 // The runtimes are located in the OS-specific resource directory.
2127 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002128 const llvm::Triple &Triple = TC.getTriple();
2129 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002130 StringRef OSLibName =
2131 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002132 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002133 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002134}
2135
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002136static SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
Dan Albert6f2875d2015-01-28 23:23:36 +00002137 bool Shared = false) {
2138 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2139 ? "-android"
2140 : "";
2141
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002142 bool IsOSWindows = TC.getTriple().isOSWindows();
2143 StringRef Arch = getArchNameForCompilerRTLib(TC);
2144 const char *Prefix = IsOSWindows ? "" : "lib";
2145 const char *Suffix =
2146 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
2147
2148 SmallString<128> Path = getCompilerRTLibDir(TC);
2149 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2150 Arch + Env + Suffix);
2151
2152 return Path;
2153}
2154
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002155// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002156// FIXME: Make sure we can also emit shared objects if they're requested
2157// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002158static void addClangRT(const ToolChain &TC, const ArgList &Args,
2159 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002160 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002161
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002162 if (!TC.getTriple().isOSWindows()) {
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002163 // FIXME: why do we link against gcc when we are using compiler-rt?
2164 CmdArgs.push_back("-lgcc_s");
2165 if (TC.getDriver().CCCIsCXX())
2166 CmdArgs.push_back("-lgcc_eh");
2167 }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002168}
2169
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002170static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2171 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002172 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2173 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002174 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002175 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002176 Args.hasArg(options::OPT_fcreate_profile) ||
2177 Args.hasArg(options::OPT_coverage)))
2178 return;
2179
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002180 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002181}
2182
Alexey Samsonov52550342014-09-15 19:58:40 +00002183static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2184 ArgStringList &CmdArgs, StringRef Sanitizer,
2185 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002186 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002187 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002188 if (!IsShared)
2189 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002190 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002191 if (!IsShared)
2192 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002193}
2194
Alexey Samsonov52550342014-09-15 19:58:40 +00002195// Tries to use a file with the list of dynamic symbols that need to be exported
2196// from the runtime library. Returns true if the file was found.
2197static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2198 ArgStringList &CmdArgs,
2199 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002200 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2201 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2202 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002203 return true;
2204 }
2205 return false;
2206}
2207
2208static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2209 ArgStringList &CmdArgs) {
2210 // Force linking against the system libraries sanitizers depends on
2211 // (see PR15823 why this is necessary).
2212 CmdArgs.push_back("--no-as-needed");
2213 CmdArgs.push_back("-lpthread");
2214 CmdArgs.push_back("-lrt");
2215 CmdArgs.push_back("-lm");
2216 // There's no libdl on FreeBSD.
2217 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2218 CmdArgs.push_back("-ldl");
2219}
2220
2221static void
2222collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2223 SmallVectorImpl<StringRef> &SharedRuntimes,
2224 SmallVectorImpl<StringRef> &StaticRuntimes,
2225 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2226 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2227 // Collect shared runtimes.
2228 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2229 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002230 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002231
Alexey Samsonov52550342014-09-15 19:58:40 +00002232 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002233 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002234 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2235 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002236 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002237 }
2238 if (SanArgs.needsAsanRt()) {
2239 if (SanArgs.needsSharedAsanRt()) {
2240 HelperStaticRuntimes.push_back("asan-preinit");
2241 } else {
2242 StaticRuntimes.push_back("asan");
2243 if (SanArgs.linkCXXRuntimes())
2244 StaticRuntimes.push_back("asan_cxx");
2245 }
2246 }
2247 if (SanArgs.needsDfsanRt())
2248 StaticRuntimes.push_back("dfsan");
2249 if (SanArgs.needsLsanRt())
2250 StaticRuntimes.push_back("lsan");
2251 if (SanArgs.needsMsanRt())
2252 StaticRuntimes.push_back("msan");
2253 if (SanArgs.needsTsanRt())
2254 StaticRuntimes.push_back("tsan");
2255 // WARNING: UBSan should always go last.
2256 if (SanArgs.needsUbsanRt()) {
2257 // If UBSan is not combined with another sanitizer, we need to pull in
2258 // sanitizer_common explicitly.
2259 if (StaticRuntimes.empty())
2260 HelperStaticRuntimes.push_back("san");
2261 StaticRuntimes.push_back("ubsan");
2262 if (SanArgs.linkCXXRuntimes())
2263 StaticRuntimes.push_back("ubsan_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002264 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002265}
2266
Alexey Samsonov52550342014-09-15 19:58:40 +00002267// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2268// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2269static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002270 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002271 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2272 HelperStaticRuntimes;
2273 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2274 HelperStaticRuntimes);
2275 for (auto RT : SharedRuntimes)
2276 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2277 for (auto RT : HelperStaticRuntimes)
2278 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2279 bool AddExportDynamic = false;
2280 for (auto RT : StaticRuntimes) {
2281 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2282 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2283 }
2284 // If there is a static runtime with no dynamic list, force all the symbols
2285 // to be dynamic to be sure we export sanitizer interface functions.
2286 if (AddExportDynamic)
2287 CmdArgs.push_back("-export-dynamic");
2288 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002289}
2290
Reid Kleckner86ea7702015-02-04 23:45:07 +00002291static bool areOptimizationsEnabled(const ArgList &Args) {
2292 // Find the last -O arg and see if it is non-zero.
2293 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2294 return !A->getOption().matches(options::OPT_O0);
2295 // Defaults to -O0.
2296 return false;
2297}
2298
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002299static bool shouldUseFramePointerForTarget(const ArgList &Args,
2300 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002301 // XCore never wants frame pointers, regardless of OS.
2302 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002303 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002304 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002305
2306 if (Triple.isOSLinux()) {
2307 switch (Triple.getArch()) {
2308 // Don't use a frame pointer on linux if optimizing for certain targets.
2309 case llvm::Triple::mips64:
2310 case llvm::Triple::mips64el:
2311 case llvm::Triple::mips:
2312 case llvm::Triple::mipsel:
2313 case llvm::Triple::systemz:
2314 case llvm::Triple::x86:
2315 case llvm::Triple::x86_64:
2316 return !areOptimizationsEnabled(Args);
2317 default:
2318 return true;
2319 }
2320 }
2321
2322 if (Triple.isOSWindows()) {
2323 switch (Triple.getArch()) {
2324 case llvm::Triple::x86:
2325 return !areOptimizationsEnabled(Args);
2326 default:
2327 // All other supported Windows ISAs use xdata unwind information, so frame
2328 // pointers are not generally useful.
2329 return false;
2330 }
2331 }
2332
2333 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002334}
2335
Rafael Espindola224dd632011-12-14 21:02:23 +00002336static bool shouldUseFramePointer(const ArgList &Args,
2337 const llvm::Triple &Triple) {
2338 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2339 options::OPT_fomit_frame_pointer))
2340 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2341
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002342 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002343}
2344
Eric Christopherb7d97e92013-04-03 01:58:53 +00002345static bool shouldUseLeafFramePointer(const ArgList &Args,
2346 const llvm::Triple &Triple) {
2347 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2348 options::OPT_momit_leaf_frame_pointer))
2349 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2350
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002351 if (Triple.isPS4CPU())
2352 return false;
2353
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002354 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002355}
2356
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002357/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002358static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002359 SmallString<128> cwd;
2360 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002361 CmdArgs.push_back("-fdebug-compilation-dir");
2362 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002363 }
2364}
2365
Eric Christopherd3804002013-02-22 20:12:52 +00002366static const char *SplitDebugName(const ArgList &Args,
2367 const InputInfoList &Inputs) {
2368 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2369 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2370 SmallString<128> T(FinalOutput->getValue());
2371 llvm::sys::path::replace_extension(T, "dwo");
2372 return Args.MakeArgString(T);
2373 } else {
2374 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002375 SmallString<128> T(
2376 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Eric Christopherd3804002013-02-22 20:12:52 +00002377 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2378 llvm::sys::path::replace_extension(F, "dwo");
2379 T += F;
2380 return Args.MakeArgString(F);
2381 }
2382}
2383
2384static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2385 const Tool &T, const JobAction &JA,
2386 const ArgList &Args, const InputInfo &Output,
2387 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002388 ArgStringList ExtractArgs;
2389 ExtractArgs.push_back("--extract-dwo");
2390
2391 ArgStringList StripArgs;
2392 StripArgs.push_back("--strip-dwo");
2393
2394 // Grabbing the output of the earlier compile step.
2395 StripArgs.push_back(Output.getFilename());
2396 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002397 ExtractArgs.push_back(OutFile);
2398
2399 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002400 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002401
2402 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002403 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002404
2405 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002406 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002407}
2408
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002409/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002410/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2411static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002412 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002413 if (A->getOption().matches(options::OPT_O4) ||
2414 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002415 return true;
2416
2417 if (A->getOption().matches(options::OPT_O0))
2418 return false;
2419
2420 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2421
Rafael Espindola91780de2013-08-26 14:05:41 +00002422 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002423 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002424 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002425 return true;
2426
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002427 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002428 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002429 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002430
2431 unsigned OptLevel = 0;
2432 if (S.getAsInteger(10, OptLevel))
2433 return false;
2434
2435 return OptLevel > 1;
2436 }
2437
2438 return false;
2439}
2440
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002441/// Add -x lang to \p CmdArgs for \p Input.
2442static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2443 ArgStringList &CmdArgs) {
2444 // When using -verify-pch, we don't want to provide the type
2445 // 'precompiled-header' if it was inferred from the file extension
2446 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2447 return;
2448
2449 CmdArgs.push_back("-x");
2450 if (Args.hasArg(options::OPT_rewrite_objc))
2451 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2452 else
2453 CmdArgs.push_back(types::getTypeName(Input.getType()));
2454}
2455
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002456static std::string getMSCompatibilityVersion(const char *VersionStr) {
2457 unsigned Version;
2458 if (StringRef(VersionStr).getAsInteger(10, Version))
2459 return "0";
2460
2461 if (Version < 100)
2462 return llvm::utostr_32(Version) + ".0";
2463
2464 if (Version < 10000)
2465 return llvm::utostr_32(Version / 100) + "." +
2466 llvm::utostr_32(Version % 100);
2467
2468 unsigned Build = 0, Factor = 1;
2469 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2470 Build = Build + (Version % 10) * Factor;
2471 return llvm::utostr_32(Version / 100) + "." +
2472 llvm::utostr_32(Version % 100) + "." +
2473 llvm::utostr_32(Build);
2474}
2475
Rafael Espindola577637a2015-01-03 00:06:04 +00002476// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002477// options that build systems might add but are unused when assembling or only
2478// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002479static void claimNoWarnArgs(const ArgList &Args) {
2480 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002481 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002482 Args.ClaimAllArgs(options::OPT_flto);
2483 Args.ClaimAllArgs(options::OPT_fno_lto);
2484}
2485
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002486static void appendUserToPath(SmallVectorImpl<char> &Result) {
2487#ifdef LLVM_ON_UNIX
2488 const char *Username = getenv("LOGNAME");
2489#else
2490 const char *Username = getenv("USERNAME");
2491#endif
2492 if (Username) {
2493 // Validate that LoginName can be used in a path, and get its length.
2494 size_t Len = 0;
2495 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002496 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002497 Username = nullptr;
2498 break;
2499 }
2500 }
2501
2502 if (Username && Len > 0) {
2503 Result.append(Username, Username + Len);
2504 return;
2505 }
2506 }
2507
2508 // Fallback to user id.
2509#ifdef LLVM_ON_UNIX
2510 std::string UID = llvm::utostr(getuid());
2511#else
2512 // FIXME: Windows seems to have an 'SID' that might work.
2513 std::string UID = "9999";
2514#endif
2515 Result.append(UID.begin(), UID.end());
2516}
2517
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002518void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002519 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002520 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002521 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002522 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002523 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2524 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002525 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002526 ArgStringList CmdArgs;
2527
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002528 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002529 bool IsWindowsCygnus =
2530 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002531 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2532
Daniel Dunbare521a892009-03-31 20:53:55 +00002533 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2534
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002535 // Invoke ourselves in -cc1 mode.
2536 //
2537 // FIXME: Implement custom jobs for internal actions.
2538 CmdArgs.push_back("-cc1");
2539
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002540 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002541 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002542 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002543 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002544
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002545 const llvm::Triple TT(TripleStr);
2546 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2547 TT.getArch() == llvm::Triple::thumb)) {
2548 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2549 unsigned Version;
2550 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2551 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002552 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2553 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002554 }
2555
Tim Northover336f1892014-03-29 13:16:12 +00002556 // Push all default warning arguments that are specific to
2557 // the given target. These come before user provided warning options
2558 // are provided.
2559 getToolChain().addClangWarningOptions(CmdArgs);
2560
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002561 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002562 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002563
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002564 if (isa<AnalyzeJobAction>(JA)) {
2565 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2566 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002567 } else if (isa<MigrateJobAction>(JA)) {
2568 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002569 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002570 if (Output.getType() == types::TY_Dependencies)
2571 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002572 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002573 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002574 if (Args.hasArg(options::OPT_rewrite_objc) &&
2575 !Args.hasArg(options::OPT_g_Group))
2576 CmdArgs.push_back("-P");
2577 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002578 } else if (isa<AssembleJobAction>(JA)) {
2579 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002580
David Blaikie9260ed62013-07-25 21:19:01 +00002581 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002582
2583 // Also ignore explicit -force_cpusubtype_ALL option.
2584 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002585 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002586 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002587 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002588
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002589 if (JA.getType() == types::TY_Nothing)
2590 CmdArgs.push_back("-fsyntax-only");
2591 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002592 CmdArgs.push_back("-emit-pch");
2593 else
2594 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002595 } else if (isa<VerifyPCHJobAction>(JA)) {
2596 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002597 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002598 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2599 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002600
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002601 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002602 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002603 } else if (JA.getType() == types::TY_LLVM_IR ||
2604 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002605 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002606 } else if (JA.getType() == types::TY_LLVM_BC ||
2607 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002608 CmdArgs.push_back("-emit-llvm-bc");
2609 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002610 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002611 } else if (JA.getType() == types::TY_AST) {
2612 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002613 } else if (JA.getType() == types::TY_ModuleFile) {
2614 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002615 } else if (JA.getType() == types::TY_RewrittenObjC) {
2616 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002617 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002618 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2619 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002620 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002621 } else {
2622 assert(JA.getType() == types::TY_PP_Asm &&
2623 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002624 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002625 }
2626
Justin Bognera88f0122014-06-20 22:59:50 +00002627 // We normally speed up the clang process a bit by skipping destructors at
2628 // exit, but when we're generating diagnostics we can rely on some of the
2629 // cleanup.
2630 if (!C.isForDiagnostics())
2631 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002632
John McCallbb79b5f2010-02-13 03:50:24 +00002633 // Disable the verification pass in -asserts builds.
2634#ifdef NDEBUG
2635 CmdArgs.push_back("-disable-llvm-verifier");
2636#endif
2637
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002638 // Set the main file name, so that debug info works even with
2639 // -save-temps.
2640 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002641 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002642
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002643 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002644 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002645 if (Args.hasArg(options::OPT_static))
2646 CmdArgs.push_back("-static-define");
2647
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002648 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002649 // Enable region store model by default.
2650 CmdArgs.push_back("-analyzer-store=region");
2651
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002652 // Treat blocks as analysis entry points.
2653 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2654
Ted Kremenek49c79792011-03-24 00:28:47 +00002655 CmdArgs.push_back("-analyzer-eagerly-assume");
2656
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002657 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002658 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002659 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002660
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002661 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002662 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002663
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002664 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002665 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002666
2667 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002668
Jordan Rose10ad0812013-04-05 17:55:07 +00002669 if (types::isCXX(Inputs[0].getType()))
2670 CmdArgs.push_back("-analyzer-checker=cplusplus");
2671
Nico Webere8e53112014-05-11 01:04:02 +00002672 // Enable the following experimental checkers for testing.
2673 CmdArgs.push_back(
2674 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002675 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2676 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2677 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2678 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2679 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002680 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002681
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002682 // Set the output format. The default is plist, for (lame) historical
2683 // reasons.
2684 CmdArgs.push_back("-analyzer-output");
2685 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002686 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002687 else
2688 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002689
Ted Kremenekfe449a22010-03-22 22:32:05 +00002690 // Disable the presentation of standard compiler warnings when
2691 // using --analyze. We only want to show static analyzer diagnostics
2692 // or frontend errors.
2693 CmdArgs.push_back("-w");
2694
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002695 // Add -Xanalyzer arguments when running as analyzer.
2696 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002697 }
2698
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002699 CheckCodeGenerationOptions(D, Args);
2700
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002701 bool PIE = getToolChain().isPIEDefault();
2702 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002703 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002704
Alexey Bataev40e75222014-01-28 06:30:35 +00002705 // Android-specific defaults for PIC/PIE
2706 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2707 switch (getToolChain().getTriple().getArch()) {
2708 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002709 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002710 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002711 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002712 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002713 case llvm::Triple::mips:
2714 case llvm::Triple::mipsel:
2715 case llvm::Triple::mips64:
2716 case llvm::Triple::mips64el:
2717 PIC = true; // "-fpic"
2718 break;
2719
2720 case llvm::Triple::x86:
2721 case llvm::Triple::x86_64:
2722 PIC = true; // "-fPIC"
2723 IsPICLevelTwo = true;
2724 break;
2725
2726 default:
2727 break;
2728 }
2729 }
2730
Brad Smith5b05db82014-06-24 19:51:29 +00002731 // OpenBSD-specific defaults for PIE
2732 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2733 switch (getToolChain().getTriple().getArch()) {
2734 case llvm::Triple::mips64:
2735 case llvm::Triple::mips64el:
2736 case llvm::Triple::sparc:
2737 case llvm::Triple::x86:
2738 case llvm::Triple::x86_64:
2739 IsPICLevelTwo = false; // "-fpie"
2740 break;
2741
2742 case llvm::Triple::ppc:
2743 case llvm::Triple::sparcv9:
2744 IsPICLevelTwo = true; // "-fPIE"
2745 break;
2746
2747 default:
2748 break;
2749 }
2750 }
2751
Alexey Samsonov090301e2013-04-09 12:28:19 +00002752 // For the PIC and PIE flag options, this logic is different from the
2753 // legacy logic in very old versions of GCC, as that logic was just
2754 // a bug no one had ever fixed. This logic is both more rational and
2755 // consistent with GCC's new logic now that the bugs are fixed. The last
2756 // argument relating to either PIC or PIE wins, and no other argument is
2757 // used. If the last argument is any flavor of the '-fno-...' arguments,
2758 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2759 // at the same level.
2760 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2761 options::OPT_fpic, options::OPT_fno_pic,
2762 options::OPT_fPIE, options::OPT_fno_PIE,
2763 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002764 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2765 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002766 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002767 if (LastPICArg) {
2768 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002769 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2770 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2771 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2772 PIC = PIE || O.matches(options::OPT_fPIC) ||
2773 O.matches(options::OPT_fpic);
2774 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2775 O.matches(options::OPT_fPIC);
2776 } else {
2777 PIE = PIC = false;
2778 }
2779 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002780 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002781
Nick Lewycky609dd662013-10-11 03:33:53 +00002782 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002783 // specified while enabling PIC enabled level 1 PIC, just force it back to
2784 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2785 // informal testing).
2786 if (PIC && getToolChain().getTriple().isOSDarwin())
2787 IsPICLevelTwo |= getToolChain().isPICDefault();
2788
Chandler Carruthc0c04552012-04-08 16:40:35 +00002789 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2790 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002791 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00002792 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002793 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002794 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002795 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002796
Chandler Carruth76a943b2012-11-19 03:52:03 +00002797 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2798 // This is a very special mode. It trumps the other modes, almost no one
2799 // uses it, and it isn't even valid on any OS but Darwin.
2800 if (!getToolChain().getTriple().isOSDarwin())
2801 D.Diag(diag::err_drv_unsupported_opt_for_target)
2802 << A->getSpelling() << getToolChain().getTriple().str();
2803
2804 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2805
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002806 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002807 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002808
Chandler Carruth76a943b2012-11-19 03:52:03 +00002809 // Only a forced PIC mode can cause the actual compile to have PIC defines
2810 // etc., no flags are sufficient. This behavior was selected to closely
2811 // match that of llvm-gcc and Apple GCC before that.
2812 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2813 CmdArgs.push_back("-pic-level");
2814 CmdArgs.push_back("2");
2815 }
2816 } else {
2817 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2818 // handled in Clang's IRGen by the -pie-level flag.
2819 CmdArgs.push_back("-mrelocation-model");
2820 CmdArgs.push_back(PIC ? "pic" : "static");
2821
2822 if (PIC) {
2823 CmdArgs.push_back("-pic-level");
2824 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2825 if (PIE) {
2826 CmdArgs.push_back("-pie-level");
2827 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2828 }
2829 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002830 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002831
Jonathan Roelofsb140a102014-10-03 21:57:44 +00002832 CmdArgs.push_back("-mthread-model");
2833 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
2834 CmdArgs.push_back(A->getValue());
2835 else
2836 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
2837
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002838 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2839 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002840 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002841
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002842 // LLVM Code Generator Options.
2843
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00002844 if (Args.hasArg(options::OPT_frewrite_map_file) ||
2845 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
2846 for (arg_iterator
2847 MFI = Args.filtered_begin(options::OPT_frewrite_map_file,
2848 options::OPT_frewrite_map_file_EQ),
2849 MFE = Args.filtered_end();
2850 MFI != MFE; ++MFI) {
2851 CmdArgs.push_back("-frewrite-map-file");
2852 CmdArgs.push_back((*MFI)->getValue());
2853 (*MFI)->claim();
2854 }
2855 }
2856
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002857 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2858 StringRef v = A->getValue();
2859 CmdArgs.push_back("-mllvm");
2860 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2861 A->claim();
2862 }
2863
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002864 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2865 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002866 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002867 }
2868
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002869 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2870 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002871 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002872 D.Diag(diag::err_drv_unsupported_opt_for_target)
2873 << A->getSpelling() << getToolChain().getTriple().str();
2874 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2875 CmdArgs.push_back("-fpcc-struct-return");
2876 } else {
2877 assert(A->getOption().matches(options::OPT_freg_struct_return));
2878 CmdArgs.push_back("-freg-struct-return");
2879 }
2880 }
2881
Roman Divacky65b88cd2011-03-01 17:40:53 +00002882 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2883 CmdArgs.push_back("-mrtd");
2884
Rafael Espindola224dd632011-12-14 21:02:23 +00002885 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002886 CmdArgs.push_back("-mdisable-fp-elim");
2887 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2888 options::OPT_fno_zero_initialized_in_bss))
2889 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002890
2891 bool OFastEnabled = isOptimizationLevelFast(Args);
2892 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2893 // enabled. This alias option is being used to simplify the hasFlag logic.
2894 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2895 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002896 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2897 // doesn't do any TBAA.
2898 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002899 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002900 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002901 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002902 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2903 options::OPT_fno_struct_path_tbaa))
2904 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002905 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2906 false))
2907 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002908 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2909 options::OPT_fno_optimize_sibling_calls))
2910 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002911
Eric Christopher006208c2013-04-04 06:29:47 +00002912 // Handle segmented stacks.
2913 if (Args.hasArg(options::OPT_fsplit_stack))
2914 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002915
2916 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2917 // This alias option is being used to simplify the getLastArg logic.
2918 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2919 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002920
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002921 // Handle various floating point optimization flags, mapping them to the
2922 // appropriate LLVM code generation flags. The pattern for all of these is to
2923 // default off the codegen optimizations, and if any flag enables them and no
2924 // flag disables them after the flag enabling them, enable the codegen
2925 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002926 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002927 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002928 options::OPT_ffinite_math_only,
2929 options::OPT_fno_finite_math_only,
2930 options::OPT_fhonor_infinities,
2931 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002932 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2933 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002934 A->getOption().getID() != options::OPT_fhonor_infinities)
2935 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002936 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002937 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002938 options::OPT_ffinite_math_only,
2939 options::OPT_fno_finite_math_only,
2940 options::OPT_fhonor_nans,
2941 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002942 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2943 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002944 A->getOption().getID() != options::OPT_fhonor_nans)
2945 CmdArgs.push_back("-menable-no-nans");
2946
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002947 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2948 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002949 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002950 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002951 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002952 options::OPT_fno_math_errno)) {
2953 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2954 // However, turning *off* -ffast_math merely restores the toolchain default
2955 // (which may be false).
2956 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2957 A->getOption().getID() == options::OPT_ffast_math ||
2958 A->getOption().getID() == options::OPT_Ofast)
2959 MathErrno = false;
2960 else if (A->getOption().getID() == options::OPT_fmath_errno)
2961 MathErrno = true;
2962 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002963 if (MathErrno)
2964 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002965
2966 // There are several flags which require disabling very specific
2967 // optimizations. Any of these being disabled forces us to turn off the
2968 // entire set of LLVM optimizations, so collect them through all the flag
2969 // madness.
2970 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002971 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002972 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002973 options::OPT_funsafe_math_optimizations,
2974 options::OPT_fno_unsafe_math_optimizations,
2975 options::OPT_fassociative_math,
2976 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002977 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2978 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002979 A->getOption().getID() != options::OPT_fno_associative_math)
2980 AssociativeMath = true;
2981 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002982 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002983 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002984 options::OPT_funsafe_math_optimizations,
2985 options::OPT_fno_unsafe_math_optimizations,
2986 options::OPT_freciprocal_math,
2987 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002988 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2989 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002990 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2991 ReciprocalMath = true;
2992 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002993 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002994 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002995 options::OPT_funsafe_math_optimizations,
2996 options::OPT_fno_unsafe_math_optimizations,
2997 options::OPT_fsigned_zeros,
2998 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002999 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3000 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003001 A->getOption().getID() != options::OPT_fsigned_zeros)
3002 SignedZeros = false;
3003 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003004 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003005 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003006 options::OPT_funsafe_math_optimizations,
3007 options::OPT_fno_unsafe_math_optimizations,
3008 options::OPT_ftrapping_math,
3009 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003010 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3011 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003012 A->getOption().getID() != options::OPT_ftrapping_math)
3013 TrappingMath = false;
3014 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3015 !TrappingMath)
3016 CmdArgs.push_back("-menable-unsafe-fp-math");
3017
Sanjay Patel76c9e092015-01-23 16:40:50 +00003018 if (!SignedZeros)
3019 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003020
3021 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003022 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003023 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003024 options::OPT_ffp_contract)) {
3025 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003026 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003027 if (Val == "fast" || Val == "on" || Val == "off") {
3028 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3029 } else {
3030 D.Diag(diag::err_drv_unsupported_option_argument)
3031 << A->getOption().getName() << Val;
3032 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003033 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3034 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003035 // If fast-math is set then set the fp-contract mode to fast.
3036 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3037 }
3038 }
3039
Bob Wilson6a039162012-07-19 03:52:53 +00003040 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3041 // and if we find them, tell the frontend to provide the appropriate
3042 // preprocessor macros. This is distinct from enabling any optimizations as
3043 // these options induce language changes which must survive serialization
3044 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003045 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3046 options::OPT_fno_fast_math))
3047 if (!A->getOption().matches(options::OPT_fno_fast_math))
3048 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003049 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3050 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003051 if (A->getOption().matches(options::OPT_ffinite_math_only))
3052 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003053
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003054 // Decide whether to use verbose asm. Verbose assembly is the default on
3055 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003056 bool IsIntegratedAssemblerDefault =
3057 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003058 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003059 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003060 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003061 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003062
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00003063 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003064 IsIntegratedAssemblerDefault))
3065 CmdArgs.push_back("-no-integrated-as");
3066
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003067 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3068 CmdArgs.push_back("-mdebug-pass");
3069 CmdArgs.push_back("Structure");
3070 }
3071 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3072 CmdArgs.push_back("-mdebug-pass");
3073 CmdArgs.push_back("Arguments");
3074 }
3075
John McCall8517abc2010-02-19 02:45:38 +00003076 // Enable -mconstructor-aliases except on darwin, where we have to
3077 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003078 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003079 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003080
John McCall7ef5cb32011-03-18 02:56:14 +00003081 // Darwin's kernel doesn't support guard variables; just die if we
3082 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003083 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003084 CmdArgs.push_back("-fforbid-guard-variables");
3085
Douglas Gregordbe39272011-02-01 15:15:22 +00003086 if (Args.hasArg(options::OPT_mms_bitfields)) {
3087 CmdArgs.push_back("-mms-bitfields");
3088 }
John McCall8517abc2010-02-19 02:45:38 +00003089
Daniel Dunbar306945d2009-09-16 06:17:29 +00003090 // This is a coarse approximation of what llvm-gcc actually does, both
3091 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3092 // complicated ways.
3093 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003094 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3095 options::OPT_fno_asynchronous_unwind_tables,
3096 (getToolChain().IsUnwindTablesDefault() ||
3097 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3098 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003099 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3100 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003101 CmdArgs.push_back("-munwind-tables");
3102
Chandler Carruth05fb5852012-11-21 23:40:23 +00003103 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003104
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003105 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3106 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003107 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003108 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003109
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003110 // FIXME: Handle -mtune=.
3111 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003112
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003113 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003114 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003115 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003116 }
3117
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003118 // Add the target cpu
3119 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3120 llvm::Triple ETriple(ETripleStr);
3121 std::string CPU = getCPUName(Args, ETriple);
3122 if (!CPU.empty()) {
3123 CmdArgs.push_back("-target-cpu");
3124 CmdArgs.push_back(Args.MakeArgString(CPU));
3125 }
3126
Rafael Espindolaeb265472013-08-21 21:59:03 +00003127 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3128 CmdArgs.push_back("-mfpmath");
3129 CmdArgs.push_back(A->getValue());
3130 }
3131
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003132 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003133 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003134
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003135 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003136 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003137 default:
3138 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003139
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003140 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003141 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003142 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003143 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003144 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003145 break;
3146
Tim Northover573cbee2014-05-24 12:52:07 +00003147 case llvm::Triple::aarch64:
3148 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003149 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003150 break;
3151
Eric Christopher0b26a612010-03-02 02:41:08 +00003152 case llvm::Triple::mips:
3153 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003154 case llvm::Triple::mips64:
3155 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003156 AddMIPSTargetArgs(Args, CmdArgs);
3157 break;
3158
Ulrich Weigand8afad612014-07-28 13:17:52 +00003159 case llvm::Triple::ppc:
3160 case llvm::Triple::ppc64:
3161 case llvm::Triple::ppc64le:
3162 AddPPCTargetArgs(Args, CmdArgs);
3163 break;
3164
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003165 case llvm::Triple::sparc:
Brad Smith10cd0f42014-07-11 20:12:08 +00003166 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003167 AddSparcTargetArgs(Args, CmdArgs);
3168 break;
3169
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003170 case llvm::Triple::x86:
3171 case llvm::Triple::x86_64:
3172 AddX86TargetArgs(Args, CmdArgs);
3173 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003174
3175 case llvm::Triple::hexagon:
3176 AddHexagonTargetArgs(Args, CmdArgs);
3177 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003178 }
3179
Hans Wennborg75958c42013-08-08 00:17:41 +00003180 // Add clang-cl arguments.
3181 if (getToolChain().getDriver().IsCLMode())
3182 AddClangCLArgs(Args, CmdArgs);
3183
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003184 // Pass the linker version in use.
3185 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3186 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003187 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003188 }
3189
Eric Christopherb7d97e92013-04-03 01:58:53 +00003190 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003191 CmdArgs.push_back("-momit-leaf-frame-pointer");
3192
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003193 // Explicitly error on some things we know we don't support and can't just
3194 // ignore.
3195 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003196 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3197 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003198 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003199 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003200 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003201 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3202 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003203 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003204 << Unsupported->getOption().getName();
3205 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003206 }
3207
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003208 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003209 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003210 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003211 CmdArgs.push_back("-header-include-file");
3212 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3213 D.CCPrintHeadersFilename : "-");
3214 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003215 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003216 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003217
Chad Rosierbe10f982011-08-02 17:58:04 +00003218 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003219 CmdArgs.push_back("-diagnostic-log-file");
3220 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3221 D.CCLogDiagnosticsFilename : "-");
3222 }
3223
Manman Ren17bdb0f2013-11-20 20:22:14 +00003224 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3225 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003226 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003227 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003228 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3229 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003230 // FIXME: we should support specifying dwarf version with
3231 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003232 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003233 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003234 const llvm::Triple &Triple = getToolChain().getTriple();
3235 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003236 Triple.getOS() == llvm::Triple::FreeBSD ||
3237 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003238 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003239 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003240 CmdArgs.push_back("-gdwarf-2");
3241 else if (A->getOption().matches(options::OPT_gdwarf_3))
3242 CmdArgs.push_back("-gdwarf-3");
3243 else if (A->getOption().matches(options::OPT_gdwarf_4))
3244 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003245 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003246 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003247 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003248 const llvm::Triple &Triple = getToolChain().getTriple();
3249 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003250 Triple.getOS() == llvm::Triple::FreeBSD ||
3251 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003252 CmdArgs.push_back("-gdwarf-2");
3253 else
3254 CmdArgs.push_back("-g");
3255 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003256 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003257
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003258 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3259 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003260 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3261 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003262 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003263
Eric Christopher138c32b2013-09-13 22:37:55 +00003264 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003265 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3266 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003267 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003268 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003269 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003270 CmdArgs.push_back("-g");
3271 CmdArgs.push_back("-backend-option");
3272 CmdArgs.push_back("-split-dwarf=Enable");
3273 }
3274
Eric Christopher138c32b2013-09-13 22:37:55 +00003275 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3276 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3277 CmdArgs.push_back("-backend-option");
3278 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3279 }
Eric Christophereec89c22013-06-18 00:03:50 +00003280
Eric Christopher0d403d22014-02-14 01:27:03 +00003281 // -gdwarf-aranges turns on the emission of the aranges section in the
3282 // backend.
3283 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3284 CmdArgs.push_back("-backend-option");
3285 CmdArgs.push_back("-generate-arange-section");
3286 }
3287
David Blaikief36d9ba2014-01-27 18:52:43 +00003288 if (Args.hasFlag(options::OPT_fdebug_types_section,
3289 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003290 CmdArgs.push_back("-backend-option");
3291 CmdArgs.push_back("-generate-type-units");
3292 }
Eric Christophereec89c22013-06-18 00:03:50 +00003293
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003294 if (Args.hasFlag(options::OPT_ffunction_sections,
3295 options::OPT_fno_function_sections, false)) {
3296 CmdArgs.push_back("-ffunction-sections");
3297 }
3298
3299 if (Args.hasFlag(options::OPT_fdata_sections,
3300 options::OPT_fno_data_sections, false)) {
3301 CmdArgs.push_back("-fdata-sections");
3302 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003303
Chris Lattner3c77a352010-06-22 00:03:40 +00003304 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3305
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003306 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
3307 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3308 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3309 D.Diag(diag::err_drv_argument_not_allowed_with)
3310 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3311
3312 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3313
3314 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3315 A->render(Args, CmdArgs);
3316 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3317 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3318
Nick Lewycky207bce32011-04-21 23:44:07 +00003319 if (Args.hasArg(options::OPT_ftest_coverage) ||
3320 Args.hasArg(options::OPT_coverage))
3321 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003322 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3323 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003324 Args.hasArg(options::OPT_coverage))
3325 CmdArgs.push_back("-femit-coverage-data");
3326
Alex Lorenzee024992014-08-04 18:41:51 +00003327 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
3328 !Args.hasArg(options::OPT_fprofile_instr_generate))
3329 D.Diag(diag::err_drv_argument_only_allowed_with)
3330 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3331
3332 if (Args.hasArg(options::OPT_fcoverage_mapping))
3333 CmdArgs.push_back("-fcoverage-mapping");
3334
Nick Lewycky480cb992011-05-04 20:46:58 +00003335 if (C.getArgs().hasArg(options::OPT_c) ||
3336 C.getArgs().hasArg(options::OPT_S)) {
3337 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003338 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003339 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003340 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003341 CoverageFilename = FinalOutput->getValue();
3342 } else {
3343 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3344 }
Nick Lewycky737a4522013-03-07 08:28:53 +00003345 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003346 SmallString<128> Pwd;
3347 if (!llvm::sys::fs::current_path(Pwd)) {
3348 llvm::sys::path::append(Pwd, CoverageFilename.str());
3349 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003350 }
3351 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003352 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003353 }
3354 }
3355
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003356 // Pass options for controlling the default header search paths.
3357 if (Args.hasArg(options::OPT_nostdinc)) {
3358 CmdArgs.push_back("-nostdsysteminc");
3359 CmdArgs.push_back("-nobuiltininc");
3360 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003361 if (Args.hasArg(options::OPT_nostdlibinc))
3362 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003363 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3364 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3365 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003366
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003367 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003368 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003369 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003370
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003371 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3372
Ted Kremenekf7639e12012-03-06 20:06:33 +00003373 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003374 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003375 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003376 options::OPT_ccc_arcmt_modify,
3377 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003378 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003379 switch (A->getOption().getID()) {
3380 default:
3381 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003382 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003383 CmdArgs.push_back("-arcmt-check");
3384 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003385 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003386 CmdArgs.push_back("-arcmt-modify");
3387 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003388 case options::OPT_ccc_arcmt_migrate:
3389 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003390 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003391 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003392
3393 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3394 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003395 break;
John McCalld70fb982011-06-15 23:25:17 +00003396 }
3397 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003398 } else {
3399 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3400 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3401 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003402 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003403
Ted Kremenekf7639e12012-03-06 20:06:33 +00003404 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3405 if (ARCMTEnabled) {
3406 D.Diag(diag::err_drv_argument_not_allowed_with)
3407 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3408 }
3409 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003410 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003411
3412 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003413 options::OPT_objcmt_migrate_subscripting,
3414 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003415 // None specified, means enable them all.
3416 CmdArgs.push_back("-objcmt-migrate-literals");
3417 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003418 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003419 } else {
3420 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3421 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003422 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003423 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003424 } else {
3425 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3426 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3427 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3428 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3429 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3430 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
3431 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3432 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3433 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3434 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3435 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3436 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3437 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003438 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003439 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003440 }
3441
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003442 // Add preprocessing options like -I, -D, etc. if we are using the
3443 // preprocessor.
3444 //
3445 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003446 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003447 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003448
Rafael Espindolaa7431922011-07-21 23:40:37 +00003449 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3450 // that "The compiler can only warn and ignore the option if not recognized".
3451 // When building with ccache, it will pass -D options to clang even on
3452 // preprocessed inputs and configure concludes that -fPIC is not supported.
3453 Args.ClaimAllArgs(options::OPT_D);
3454
Alp Toker7874bdc2013-11-15 20:40:58 +00003455 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003456 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3457 if (A->getOption().matches(options::OPT_O4)) {
3458 CmdArgs.push_back("-O3");
3459 D.Diag(diag::warn_O4_is_O3);
3460 } else {
3461 A->render(Args, CmdArgs);
3462 }
3463 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003464
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003465 // Warn about ignored options to clang.
3466 for (arg_iterator it = Args.filtered_begin(
3467 options::OPT_clang_ignored_gcc_optimization_f_Group),
3468 ie = Args.filtered_end(); it != ie; ++it) {
3469 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3470 }
3471
Rafael Espindola577637a2015-01-03 00:06:04 +00003472 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003473
Richard Smith3be1cb22014-08-07 00:24:21 +00003474 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003475 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003476 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3477 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003478 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003479 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003480
3481 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003482 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003483 //
3484 // If a std is supplied, only add -trigraphs if it follows the
3485 // option.
3486 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3487 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003488 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003489 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003490 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003491 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003492 else
3493 Std->render(Args, CmdArgs);
3494
Nico Weber00721502014-12-23 22:32:37 +00003495 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003496 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003497 options::OPT_ftrigraphs,
3498 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003499 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003500 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003501 } else {
3502 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003503 //
3504 // FIXME: Clang doesn't correctly handle -std= when the input language
3505 // doesn't match. For the time being just ignore this for C++ inputs;
3506 // eventually we want to do all the standard defaulting here instead of
3507 // splitting it between the driver and clang -cc1.
3508 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003509 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3510 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003511 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003512 CmdArgs.push_back("-std=c++11");
3513
Nico Weber00721502014-12-23 22:32:37 +00003514 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3515 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003516 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003517
Richard Smith282b4492013-09-04 22:50:31 +00003518 // GCC's behavior for -Wwrite-strings is a bit strange:
3519 // * In C, this "warning flag" changes the types of string literals from
3520 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3521 // for the discarded qualifier.
3522 // * In C++, this is just a normal warning flag.
3523 //
3524 // Implementing this warning correctly in C is hard, so we follow GCC's
3525 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3526 // a non-const char* in C, rather than using this crude hack.
3527 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003528 // FIXME: This should behave just like a warning flag, and thus should also
3529 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3530 Arg *WriteStrings =
3531 Args.getLastArg(options::OPT_Wwrite_strings,
3532 options::OPT_Wno_write_strings, options::OPT_w);
3533 if (WriteStrings &&
3534 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003535 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003536 }
3537
Chandler Carruth61fbf622011-04-23 09:27:53 +00003538 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003539 // during C++ compilation, which it is by default. GCC keeps this define even
3540 // in the presence of '-w', match this behavior bug-for-bug.
3541 if (types::isCXX(InputType) &&
3542 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3543 true)) {
3544 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003545 }
3546
Chandler Carruthe0391482010-05-22 02:21:53 +00003547 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3548 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3549 if (Asm->getOption().matches(options::OPT_fasm))
3550 CmdArgs.push_back("-fgnu-keywords");
3551 else
3552 CmdArgs.push_back("-fno-gnu-keywords");
3553 }
3554
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003555 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3556 CmdArgs.push_back("-fno-dwarf-directory-asm");
3557
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003558 if (ShouldDisableAutolink(Args, getToolChain()))
3559 CmdArgs.push_back("-fno-autolink");
3560
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003561 // Add in -fdebug-compilation-dir if necessary.
3562 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003563
Richard Smith9a568822011-11-21 19:36:32 +00003564 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3565 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003566 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003567 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003568 }
3569
Richard Smith79c927b2013-11-06 19:31:51 +00003570 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3571 CmdArgs.push_back("-foperator-arrow-depth");
3572 CmdArgs.push_back(A->getValue());
3573 }
3574
Richard Smith9a568822011-11-21 19:36:32 +00003575 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3576 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003577 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003578 }
3579
Richard Smitha3d3bd22013-05-08 02:12:03 +00003580 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3581 CmdArgs.push_back("-fconstexpr-steps");
3582 CmdArgs.push_back(A->getValue());
3583 }
3584
Richard Smithb3a14522013-02-22 01:59:51 +00003585 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3586 CmdArgs.push_back("-fbracket-depth");
3587 CmdArgs.push_back(A->getValue());
3588 }
3589
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003590 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3591 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003592 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003593 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003594 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3595 } else
3596 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003597 }
3598
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003599
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003600 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003601 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003602
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003603 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3604 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003605 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003606 }
David Chisnall5778fce2009-08-31 16:41:57 +00003607
Chris Lattnere23003d2010-01-09 21:54:33 +00003608 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3609 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003610 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003611 }
3612
Chris Lattnerb35583d2010-04-07 20:49:23 +00003613 CmdArgs.push_back("-ferror-limit");
3614 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003615 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003616 else
3617 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003618
Chandler Carrutha77a7272010-05-06 04:55:18 +00003619 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3620 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003621 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003622 }
3623
3624 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3625 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003626 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003627 }
3628
Richard Smithf6f003a2011-12-16 19:06:07 +00003629 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3630 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003631 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003632 }
3633
Nick Lewycky24653262014-12-16 21:39:02 +00003634 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3635 CmdArgs.push_back("-fspell-checking-limit");
3636 CmdArgs.push_back(A->getValue());
3637 }
3638
Daniel Dunbar2c978472009-11-04 06:24:47 +00003639 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003640 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003641 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003642 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003643 } else {
3644 // If -fmessage-length=N was not specified, determine whether this is a
3645 // terminal and, if so, implicitly define -fmessage-length appropriately.
3646 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003647 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003648 }
3649
John McCallb4a99d32013-02-19 01:57:35 +00003650 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3651 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3652 options::OPT_fvisibility_ms_compat)) {
3653 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3654 CmdArgs.push_back("-fvisibility");
3655 CmdArgs.push_back(A->getValue());
3656 } else {
3657 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3658 CmdArgs.push_back("-fvisibility");
3659 CmdArgs.push_back("hidden");
3660 CmdArgs.push_back("-ftype-visibility");
3661 CmdArgs.push_back("default");
3662 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003663 }
3664
Douglas Gregor08329632010-06-15 17:05:35 +00003665 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003666
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003667 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3668
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003669 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003670 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3671 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003672 CmdArgs.push_back("-ffreestanding");
3673
Daniel Dunbare357d562009-12-03 18:42:11 +00003674 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003675 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003676 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003677 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3678 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003679 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003680 // AltiVec language extensions aren't relevant for assembling.
3681 if (!isa<PreprocessJobAction>(JA) ||
3682 Output.getType() != types::TY_PP_Asm)
3683 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003684 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3685 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003686
Peter Collingbourne32701642013-11-01 18:16:25 +00003687 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3688 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003689
Eric Christopher459d2712013-02-19 06:16:53 +00003690 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003691 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003692 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003693 getToolChain().getArch() == llvm::Triple::ppc64 ||
3694 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003695 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003696 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003697
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003698 if (getToolChain().SupportsProfiling())
3699 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003700
3701 // -flax-vector-conversions is default.
3702 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3703 options::OPT_fno_lax_vector_conversions))
3704 CmdArgs.push_back("-fno-lax-vector-conversions");
3705
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003706 if (Args.getLastArg(options::OPT_fapple_kext))
3707 CmdArgs.push_back("-fapple-kext");
3708
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003709 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003710 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003711 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003712 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3713 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003714
3715 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3716 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003717 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003718 }
3719
Bob Wilson14adb362012-02-03 06:27:22 +00003720 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003721
Chandler Carruth6e501032011-03-27 00:04:55 +00003722 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3723 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3724 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3725 options::OPT_fno_wrapv)) {
3726 if (A->getOption().matches(options::OPT_fwrapv))
3727 CmdArgs.push_back("-fwrapv");
3728 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3729 options::OPT_fno_strict_overflow)) {
3730 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3731 CmdArgs.push_back("-fwrapv");
3732 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003733
3734 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3735 options::OPT_fno_reroll_loops))
3736 if (A->getOption().matches(options::OPT_freroll_loops))
3737 CmdArgs.push_back("-freroll-loops");
3738
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003739 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003740 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3741 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003742
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003743 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3744
Mahesha S6a682be42012-10-27 07:47:56 +00003745
Daniel Dunbar4930e332009-11-17 08:07:36 +00003746 // -stack-protector=0 is default.
3747 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003748 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3749 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003750 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003751 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003752 if (A->getOption().matches(options::OPT_fstack_protector)) {
3753 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3754 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3755 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003756 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003757 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003758 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003759 } else {
3760 StackProtectorLevel =
3761 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3762 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003763 if (StackProtectorLevel) {
3764 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003765 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003766 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003767
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003768 // --param ssp-buffer-size=
3769 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3770 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003771 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003772 if (Str.startswith("ssp-buffer-size=")) {
3773 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003774 CmdArgs.push_back("-stack-protector-buffer-size");
3775 // FIXME: Verify the argument is a valid integer.
3776 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003777 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003778 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003779 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003780 }
3781
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003782 // Translate -mstackrealign
3783 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3784 false)) {
3785 CmdArgs.push_back("-backend-option");
3786 CmdArgs.push_back("-force-align-stack");
3787 }
3788 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3789 false)) {
3790 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3791 }
3792
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003793 if (Args.hasArg(options::OPT_mstack_alignment)) {
3794 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3795 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003796 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003797
Hans Wennborg77dc2362015-01-20 19:45:50 +00003798 if (Args.hasArg(options::OPT_mstack_probe_size)) {
3799 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
3800
3801 if (!Size.empty())
3802 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
3803 else
3804 CmdArgs.push_back("-mstack-probe-size=0");
3805 }
3806
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003807 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3808 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
3809 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3810
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003811 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3812 options::OPT_mno_restrict_it)) {
3813 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3814 CmdArgs.push_back("-backend-option");
3815 CmdArgs.push_back("-arm-restrict-it");
3816 } else {
3817 CmdArgs.push_back("-backend-option");
3818 CmdArgs.push_back("-arm-no-restrict-it");
3819 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003820 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3821 TT.getArch() == llvm::Triple::thumb)) {
3822 // Windows on ARM expects restricted IT blocks
3823 CmdArgs.push_back("-backend-option");
3824 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003825 }
3826
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003827 if (TT.getArch() == llvm::Triple::arm ||
3828 TT.getArch() == llvm::Triple::thumb) {
3829 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3830 options::OPT_mno_long_calls)) {
3831 if (A->getOption().matches(options::OPT_mlong_calls)) {
3832 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003833 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003834 }
3835 }
3836 }
3837
Daniel Dunbard18049a2009-04-07 21:16:11 +00003838 // Forward -f options with positive and negative forms; we translate
3839 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003840 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3841 StringRef fname = A->getValue();
3842 if (!llvm::sys::fs::exists(fname))
3843 D.Diag(diag::err_drv_no_such_file) << fname;
3844 else
3845 A->render(Args, CmdArgs);
3846 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003847
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003848 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003849 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003850 CmdArgs.push_back("-fapple-kext");
3851 if (!Args.hasArg(options::OPT_fbuiltin))
3852 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003853 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003854 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003855 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003856 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003857 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003858
Nuno Lopes13c88c72009-12-16 16:59:22 +00003859 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3860 options::OPT_fno_assume_sane_operator_new))
3861 CmdArgs.push_back("-fno-assume-sane-operator-new");
3862
Daniel Dunbar4930e332009-11-17 08:07:36 +00003863 // -fblocks=0 is default.
3864 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003865 getToolChain().IsBlocksDefault()) ||
3866 (Args.hasArg(options::OPT_fgnu_runtime) &&
3867 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3868 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003869 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003870
3871 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3872 !getToolChain().hasBlocksRuntime())
3873 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003874 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003875
Richard Smithffb65082014-09-30 23:10:19 +00003876 // -fmodules enables modules (off by default).
3877 // Users can pass -fno-cxx-modules to turn off modules support for
3878 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003879 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003880 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3881 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3882 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00003883 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003884 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003885 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003886 HaveModules = true;
3887 }
3888 }
3889
Daniel Jasper07e6c402013-08-05 20:26:17 +00003890 // -fmodule-maps enables module map processing (off by default) for header
3891 // checking. It is implied by -fmodules.
3892 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3893 false)) {
3894 CmdArgs.push_back("-fmodule-maps");
3895 }
3896
Daniel Jasperac42b752013-10-21 06:34:34 +00003897 // -fmodules-decluse checks that modules used are declared so (off by
3898 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003899 if (Args.hasFlag(options::OPT_fmodules_decluse,
3900 options::OPT_fno_modules_decluse,
3901 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003902 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003903 }
3904
Daniel Jasper962b38e2014-04-11 11:47:45 +00003905 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3906 // all #included headers are part of modules.
3907 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3908 options::OPT_fno_modules_strict_decluse,
3909 false)) {
3910 CmdArgs.push_back("-fmodules-strict-decluse");
3911 }
3912
Daniel Jasperac42b752013-10-21 06:34:34 +00003913 // -fmodule-name specifies the module that is currently being built (or
3914 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00003915 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00003916
Richard Smith9887d792014-10-17 01:42:53 +00003917 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00003918 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00003919 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00003920
Richard Smithe842a472014-10-22 02:05:46 +00003921 // -fmodule-file can be used to specify files containing precompiled modules.
3922 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
3923
3924 // -fmodule-cache-path specifies where our implicitly-built module files
3925 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00003926 SmallString<128> ModuleCachePath;
3927 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
3928 ModuleCachePath = A->getValue();
3929 if (HaveModules) {
3930 if (C.isForDiagnostics()) {
3931 // When generating crash reports, we want to emit the modules along with
3932 // the reproduction sources, so we ignore any provided module path.
3933 ModuleCachePath = Output.getFilename();
3934 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
3935 llvm::sys::path::append(ModuleCachePath, "modules");
3936 } else if (ModuleCachePath.empty()) {
3937 // No module path was provided: use the default.
3938 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3939 ModuleCachePath);
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003940 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
3941 appendUserToPath(ModuleCachePath);
Justin Bognera88f0122014-06-20 22:59:50 +00003942 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
3943 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00003944 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00003945 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
3946 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
3947 }
3948
3949 // When building modules and generating crashdumps, we need to dump a module
3950 // dependency VFS alongside the output.
3951 if (HaveModules && C.isForDiagnostics()) {
3952 SmallString<128> VFSDir(Output.getFilename());
3953 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00003954 // Add the cache directory as a temp so the crash diagnostics pick it up.
3955 C.addTempFile(Args.MakeArgString(VFSDir));
3956
Justin Bognera88f0122014-06-20 22:59:50 +00003957 llvm::sys::path::append(VFSDir, "vfs");
3958 CmdArgs.push_back("-module-dependency-dir");
3959 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003960 }
3961
Richard Smith9887d792014-10-17 01:42:53 +00003962 if (HaveModules)
3963 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003964
Douglas Gregor35b04d62013-02-07 19:01:24 +00003965 // Pass through all -fmodules-ignore-macro arguments.
3966 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003967 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3968 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003969
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003970 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3971
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003972 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
3973 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
3974 D.Diag(diag::err_drv_argument_not_allowed_with)
3975 << A->getAsString(Args) << "-fbuild-session-timestamp";
3976
3977 llvm::sys::fs::file_status Status;
3978 if (llvm::sys::fs::status(A->getValue(), Status))
3979 D.Diag(diag::err_drv_no_such_file) << A->getValue();
NAKAMURA Takumi0f9447d2014-08-03 01:11:44 +00003980 char TimeStamp[48];
3981 snprintf(TimeStamp, sizeof(TimeStamp), "-fbuild-session-timestamp=%" PRIu64,
3982 (uint64_t)Status.getLastModificationTime().toEpochTime());
3983 CmdArgs.push_back(Args.MakeArgString(TimeStamp));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003984 }
3985
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003986 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003987 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
3988 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003989 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
3990
3991 Args.AddLastArg(CmdArgs,
3992 options::OPT_fmodules_validate_once_per_build_session);
3993 }
3994
Ben Langmuirdcf73862014-03-12 00:06:17 +00003995 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
3996
John McCalldfea9982010-04-09 19:12:06 +00003997 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003998 if (Args.hasFlag(options::OPT_fno_access_control,
3999 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00004000 false))
John McCall3155f572010-04-09 19:03:51 +00004001 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004002
Anders Carlssond470fef2010-11-21 00:09:52 +00004003 // -felide-constructors is the default.
4004 if (Args.hasFlag(options::OPT_fno_elide_constructors,
4005 options::OPT_felide_constructors,
4006 false))
4007 CmdArgs.push_back("-fno-elide-constructors");
4008
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004009 // -frtti is default, except for the PS4 CPU.
4010 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti,
4011 !Triple.isPS4CPU()) ||
Richard Smith52be6192012-11-05 22:04:41 +00004012 KernelOrKext) {
Filipe Cabecinhasf2a3aec2015-01-31 23:05:51 +00004013 bool IsCXX = types::isCXX(InputType);
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004014 bool RTTIEnabled = false;
4015 Arg *NoRTTIArg = Args.getLastArg(
4016 options::OPT_mkernel, options::OPT_fapple_kext, options::OPT_fno_rtti);
4017
4018 // PS4 requires rtti when exceptions are enabled. If -fno-rtti was
4019 // explicitly passed, error out. Otherwise enable rtti and emit a
4020 // warning.
Filipe Cabecinhasf2a3aec2015-01-31 23:05:51 +00004021 Arg *Exceptions = Args.getLastArg(
4022 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
4023 options::OPT_fexceptions, options::OPT_fno_exceptions);
4024 if (Triple.isPS4CPU() && Exceptions) {
4025 bool CXXExceptions =
4026 (IsCXX &&
4027 Exceptions->getOption().matches(options::OPT_fexceptions)) ||
4028 Exceptions->getOption().matches(options::OPT_fcxx_exceptions);
4029 if (CXXExceptions) {
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004030 if (NoRTTIArg)
4031 D.Diag(diag::err_drv_argument_not_allowed_with)
Filipe Cabecinhasf2a3aec2015-01-31 23:05:51 +00004032 << NoRTTIArg->getAsString(Args) << Exceptions->getAsString(Args);
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004033 else {
4034 RTTIEnabled = true;
4035 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
4036 }
4037 }
4038 }
Mike Stump183c3d22009-07-31 23:15:31 +00004039
Richard Smith52be6192012-11-05 22:04:41 +00004040 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00004041 if (Sanitize.sanitizesVptr()) {
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004042 // If rtti was explicitly disabled and the vptr sanitizer is on, error
4043 // out. Otherwise, warn that vptr will be disabled unless -frtti is
4044 // passed.
4045 if (NoRTTIArg) {
4046 D.Diag(diag::err_drv_argument_not_allowed_with)
4047 << "-fsanitize=vptr" << NoRTTIArg->getAsString(Args);
4048 } else {
4049 D.Diag(diag::warn_drv_disabling_vptr_no_rtti_default);
4050 // All sanitizer switches have been pushed. This -fno-sanitize
4051 // will override any -fsanitize={vptr,undefined} passed before it.
4052 CmdArgs.push_back("-fno-sanitize=vptr");
4053 }
Richard Smith52be6192012-11-05 22:04:41 +00004054 }
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004055
4056 if (!RTTIEnabled)
4057 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004058 }
4059
Tony Linthicum76329bf2011-12-12 21:14:55 +00004060 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004061 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00004062 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004063 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00004064 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004065 CmdArgs.push_back("-fshort-enums");
4066
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004067 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004068 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004069 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004070 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00004071
Anders Carlssonfcd764a2010-02-06 23:23:06 +00004072 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004073 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00004074 options::OPT_fno_threadsafe_statics))
4075 CmdArgs.push_back("-fno-threadsafe-statics");
4076
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004077 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004078 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4079 options::OPT_fno_use_cxa_atexit,
4080 !IsWindowsCygnus && !IsWindowsGNU &&
4081 getToolChain().getArch() != llvm::Triple::hexagon &&
4082 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004083 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004084 CmdArgs.push_back("-fno-use-cxa-atexit");
4085
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004086 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004087 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004088 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004089 CmdArgs.push_back("-fms-extensions");
4090
Francois Pichet1b4f1632011-09-17 04:32:15 +00004091 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004092 if (Args.hasFlag(options::OPT_fms_compatibility,
4093 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004094 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4095 options::OPT_fno_ms_extensions,
4096 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004097 CmdArgs.push_back("-fms-compatibility");
4098
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004099 // -fms-compatibility-version=17.00 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004100 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004101 IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version) ||
4102 Args.hasArg(options::OPT_fms_compatibility_version)) {
4103 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4104 const Arg *MSCompatibilityVersion =
4105 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004106
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004107 if (MSCVersion && MSCompatibilityVersion)
4108 D.Diag(diag::err_drv_argument_not_allowed_with)
4109 << MSCVersion->getAsString(Args)
4110 << MSCompatibilityVersion->getAsString(Args);
4111
4112 std::string Ver;
4113 if (MSCompatibilityVersion)
4114 Ver = Args.getLastArgValue(options::OPT_fms_compatibility_version);
4115 else if (MSCVersion)
4116 Ver = getMSCompatibilityVersion(MSCVersion->getValue());
4117
4118 if (Ver.empty())
4119 CmdArgs.push_back("-fms-compatibility-version=17.00");
4120 else
4121 CmdArgs.push_back(Args.MakeArgString("-fms-compatibility-version=" + Ver));
4122 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004123
Eric Christopher5ecce122013-02-18 00:38:31 +00004124 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004125 if (Args.hasFlag(options::OPT_fborland_extensions,
4126 options::OPT_fno_borland_extensions, false))
4127 CmdArgs.push_back("-fborland-extensions");
4128
Francois Pichet02744872011-09-01 16:38:08 +00004129 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4130 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004131 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004132 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004133 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004134
Chandler Carruthe03aa552010-04-17 20:17:31 +00004135 // -fgnu-keywords default varies depending on language; only pass if
4136 // specified.
4137 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004138 options::OPT_fno_gnu_keywords))
4139 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004140
Rafael Espindola922a6242011-06-02 17:30:53 +00004141 if (Args.hasFlag(options::OPT_fgnu89_inline,
4142 options::OPT_fno_gnu89_inline,
4143 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004144 CmdArgs.push_back("-fgnu89-inline");
4145
Chad Rosier9c76d242012-03-15 22:31:42 +00004146 if (Args.hasArg(options::OPT_fno_inline))
4147 CmdArgs.push_back("-fno-inline");
4148
Chad Rosier64d6be92012-03-06 21:17:19 +00004149 if (Args.hasArg(options::OPT_fno_inline_functions))
4150 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004151
John McCall5fb5df92012-06-20 06:18:46 +00004152 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004153
John McCall5fb5df92012-06-20 06:18:46 +00004154 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004155 // legacy is the default. Except for deployment taget of 10.5,
4156 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4157 // gets ignored silently.
4158 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004159 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4160 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004161 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004162 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004163 if (getToolChain().UseObjCMixedDispatch())
4164 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4165 else
4166 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4167 }
4168 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004169
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004170 // When ObjectiveC legacy runtime is in effect on MacOSX,
4171 // turn on the option to do Array/Dictionary subscripting
4172 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004173 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4174 getToolChain().getTriple().isMacOSX() &&
4175 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4176 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004177 objcRuntime.isNeXTFamily())
4178 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4179
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004180 // -fencode-extended-block-signature=1 is default.
4181 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4182 CmdArgs.push_back("-fencode-extended-block-signature");
4183 }
4184
John McCall24fc0de2011-07-06 00:26:06 +00004185 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4186 // NOTE: This logic is duplicated in ToolChains.cpp.
4187 bool ARC = isObjCAutoRefCount(Args);
4188 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004189 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004190
John McCall24fc0de2011-07-06 00:26:06 +00004191 CmdArgs.push_back("-fobjc-arc");
4192
Chandler Carruth491db322011-11-04 07:34:47 +00004193 // FIXME: It seems like this entire block, and several around it should be
4194 // wrapped in isObjC, but for now we just use it here as this is where it
4195 // was being used previously.
4196 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4197 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4198 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4199 else
4200 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4201 }
4202
John McCall24fc0de2011-07-06 00:26:06 +00004203 // Allow the user to enable full exceptions code emission.
4204 // We define off for Objective-CC, on for Objective-C++.
4205 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4206 options::OPT_fno_objc_arc_exceptions,
4207 /*default*/ types::isCXX(InputType)))
4208 CmdArgs.push_back("-fobjc-arc-exceptions");
4209 }
4210
4211 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4212 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004213 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004214 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004215
John McCall24fc0de2011-07-06 00:26:06 +00004216 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4217 // takes precedence.
4218 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4219 if (!GCArg)
4220 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4221 if (GCArg) {
4222 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004223 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004224 << GCArg->getAsString(Args);
4225 } else if (getToolChain().SupportsObjCGC()) {
4226 GCArg->render(Args, CmdArgs);
4227 } else {
4228 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004229 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004230 << GCArg->getAsString(Args);
4231 }
4232 }
4233
Reid Klecknerc542d372014-06-27 17:02:02 +00004234 // Handle GCC-style exception args.
4235 if (!C.getDriver().IsCLMode())
4236 addExceptionArgs(Args, InputType, getToolChain().getTriple(), KernelOrKext,
4237 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004238
4239 if (getToolChain().UseSjLjExceptions())
4240 CmdArgs.push_back("-fsjlj-exceptions");
4241
4242 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004243 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4244 options::OPT_fno_assume_sane_operator_new))
4245 CmdArgs.push_back("-fno-assume-sane-operator-new");
4246
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004247 // -fconstant-cfstrings is default, and may be subject to argument translation
4248 // on Darwin.
4249 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4250 options::OPT_fno_constant_cfstrings) ||
4251 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4252 options::OPT_mno_constant_cfstrings))
4253 CmdArgs.push_back("-fno-constant-cfstrings");
4254
John Thompsoned4e2952009-11-05 20:14:16 +00004255 // -fshort-wchar default varies depending on platform; only
4256 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004257 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4258 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004259 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004260
Hans Wennborg28c96312013-07-31 23:39:13 +00004261 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004262 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004263 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004264 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004265 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004266
Daniel Dunbar096ed292011-10-05 21:04:55 +00004267 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4268 // -fno-pack-struct doesn't apply to -fpack-struct=.
4269 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004270 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004271 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004272 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004273 } else if (Args.hasFlag(options::OPT_fpack_struct,
4274 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004275 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004276 }
4277
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004278 // Handle -fmax-type-align=N and -fno-type-align
4279 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4280 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4281 if (!SkipMaxTypeAlign) {
4282 std::string MaxTypeAlignStr = "-fmax-type-align=";
4283 MaxTypeAlignStr += A->getValue();
4284 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4285 }
4286 } else if (getToolChain().getTriple().isOSDarwin()) {
4287 if (!SkipMaxTypeAlign) {
4288 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4289 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4290 }
4291 }
4292
Robert Lytton0e076492013-08-13 09:43:10 +00004293 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004294 if (!Args.hasArg(options::OPT_fcommon))
4295 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004296 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004297 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004298
Daniel Dunbard18049a2009-04-07 21:16:11 +00004299 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004300 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004301 CmdArgs.push_back("-fno-common");
4302
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004303 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004304 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004305 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004306 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004307 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004308 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4309
Daniel Dunbar6358d682010-10-15 22:30:42 +00004310 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4311 if (!Args.hasFlag(options::OPT_ffor_scope,
4312 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004313 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004314 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4315
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004316 // -finput_charset=UTF-8 is default. Reject others
4317 if (Arg *inputCharset = Args.getLastArg(
4318 options::OPT_finput_charset_EQ)) {
4319 StringRef value = inputCharset->getValue();
4320 if (value != "UTF-8")
4321 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4322 }
4323
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004324 // -fexec_charset=UTF-8 is default. Reject others
4325 if (Arg *execCharset = Args.getLastArg(
4326 options::OPT_fexec_charset_EQ)) {
4327 StringRef value = execCharset->getValue();
4328 if (value != "UTF-8")
4329 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4330 }
4331
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004332 // -fcaret-diagnostics is default.
4333 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4334 options::OPT_fno_caret_diagnostics, true))
4335 CmdArgs.push_back("-fno-caret-diagnostics");
4336
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004337 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004338 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004339 options::OPT_fno_diagnostics_fixit_info))
4340 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004341
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004342 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004343 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004344 options::OPT_fno_diagnostics_show_option))
4345 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004346
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004347 if (const Arg *A =
4348 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4349 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004350 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004351 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004352
Douglas Gregor643c9222011-05-21 17:07:29 +00004353 if (const Arg *A =
4354 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4355 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004356 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004357 }
4358
Chandler Carruthb6766f02011-03-27 01:50:55 +00004359 if (Arg *A = Args.getLastArg(
4360 options::OPT_fdiagnostics_show_note_include_stack,
4361 options::OPT_fno_diagnostics_show_note_include_stack)) {
4362 if (A->getOption().matches(
4363 options::OPT_fdiagnostics_show_note_include_stack))
4364 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4365 else
4366 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4367 }
4368
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004369 // Color diagnostics are the default, unless the terminal doesn't support
4370 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004371 // Support both clang's -f[no-]color-diagnostics and gcc's
4372 // -f[no-]diagnostics-colors[=never|always|auto].
4373 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004374 for (const auto &Arg : Args) {
4375 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004376 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4377 !O.matches(options::OPT_fdiagnostics_color) &&
4378 !O.matches(options::OPT_fno_color_diagnostics) &&
4379 !O.matches(options::OPT_fno_diagnostics_color) &&
4380 !O.matches(options::OPT_fdiagnostics_color_EQ))
4381 continue;
4382
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004383 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004384 if (O.matches(options::OPT_fcolor_diagnostics) ||
4385 O.matches(options::OPT_fdiagnostics_color)) {
4386 ShowColors = Colors_On;
4387 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4388 O.matches(options::OPT_fno_diagnostics_color)) {
4389 ShowColors = Colors_Off;
4390 } else {
4391 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004392 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004393 if (value == "always")
4394 ShowColors = Colors_On;
4395 else if (value == "never")
4396 ShowColors = Colors_Off;
4397 else if (value == "auto")
4398 ShowColors = Colors_Auto;
4399 else
4400 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4401 << ("-fdiagnostics-color=" + value).str();
4402 }
4403 }
4404 if (ShowColors == Colors_On ||
4405 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004406 CmdArgs.push_back("-fcolor-diagnostics");
4407
Nico Rieck7857d462013-09-11 00:38:02 +00004408 if (Args.hasArg(options::OPT_fansi_escape_codes))
4409 CmdArgs.push_back("-fansi-escape-codes");
4410
Daniel Dunbardb097022009-06-08 21:13:54 +00004411 if (!Args.hasFlag(options::OPT_fshow_source_location,
4412 options::OPT_fno_show_source_location))
4413 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004414
Douglas Gregor643c9222011-05-21 17:07:29 +00004415 if (!Args.hasFlag(options::OPT_fshow_column,
4416 options::OPT_fno_show_column,
4417 true))
4418 CmdArgs.push_back("-fno-show-column");
4419
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004420 if (!Args.hasFlag(options::OPT_fspell_checking,
4421 options::OPT_fno_spell_checking))
4422 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004423
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004424
Chad Rosierc8e56e82012-12-05 21:08:21 +00004425 // -fno-asm-blocks is default.
4426 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4427 false))
4428 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004429
Steven Wucb0d13f2015-01-16 23:05:28 +00004430 // -fgnu-inline-asm is default.
4431 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4432 options::OPT_fno_gnu_inline_asm, true))
4433 CmdArgs.push_back("-fno-gnu-inline-asm");
4434
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004435 // Enable vectorization per default according to the optimization level
4436 // selected. For optimization levels that want vectorization we use the alias
4437 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004438 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004439 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004440 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004441 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004442 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004443 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004444
Chad Rosier136d67d2014-04-28 19:30:57 +00004445 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004446 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4447 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004448 options::OPT_fslp_vectorize;
4449 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004450 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004451 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004452
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004453 // -fno-slp-vectorize-aggressive is default.
4454 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004455 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004456 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004457
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004458 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4459 A->render(Args, CmdArgs);
4460
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004461 // -fdollars-in-identifiers default varies depending on platform and
4462 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004463 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004464 options::OPT_fno_dollars_in_identifiers)) {
4465 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004466 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004467 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004468 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004469 }
4470
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004471 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4472 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004473 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004474 options::OPT_fno_unit_at_a_time)) {
4475 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004476 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004477 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004478
Eli Friedman055c9702011-11-02 01:53:16 +00004479 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4480 options::OPT_fno_apple_pragma_pack, false))
4481 CmdArgs.push_back("-fapple-pragma-pack");
4482
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004483 // le32-specific flags:
4484 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4485 // by default.
4486 if (getToolChain().getArch() == llvm::Triple::le32) {
4487 CmdArgs.push_back("-fno-math-builtin");
4488 }
4489
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004490 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004491 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004492 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004493#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004494 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004495 (getToolChain().getArch() == llvm::Triple::arm ||
4496 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004497 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4498 CmdArgs.push_back("-fno-builtin-strcat");
4499 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4500 CmdArgs.push_back("-fno-builtin-strcpy");
4501 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004502#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004503
Justin Bognera88f0122014-06-20 22:59:50 +00004504 // Enable rewrite includes if the user's asked for it or if we're generating
4505 // diagnostics.
4506 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4507 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004508 if (Args.hasFlag(options::OPT_frewrite_includes,
4509 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004510 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004511 CmdArgs.push_back("-frewrite-includes");
4512
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004513 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004514 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004515 options::OPT_traditional_cpp)) {
4516 if (isa<PreprocessJobAction>(JA))
4517 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004518 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004519 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004520 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004521
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004522 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004523 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004524
4525 // Handle serialized diagnostics.
4526 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4527 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004528 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004529 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004530
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004531 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4532 CmdArgs.push_back("-fretain-comments-from-system-headers");
4533
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004534 // Forward -fcomment-block-commands to -cc1.
4535 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004536 // Forward -fparse-all-comments to -cc1.
4537 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004538
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004539 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4540 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004541 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004542 bool OptDisabled = false;
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004543 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4544 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004545 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004546
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004547 // We translate this by hand to the -cc1 argument, since nightly test uses
4548 // it and developers have been trained to spell it with -mllvm.
Bob Wilson23a55f12014-12-21 07:00:00 +00004549 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004550 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004551 OptDisabled = true;
4552 } else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004553 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004554 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004555
Bob Wilson23a55f12014-12-21 07:00:00 +00004556 // With -save-temps, we want to save the unoptimized bitcode output from the
4557 // CompileJobAction, so disable optimizations if they are not already
4558 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004559 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004560 isa<CompileJobAction>(JA))
4561 CmdArgs.push_back("-disable-llvm-optzns");
4562
Daniel Dunbard67a3222009-03-30 06:36:42 +00004563 if (Output.getType() == types::TY_Dependencies) {
4564 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004565 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004566 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004567 CmdArgs.push_back(Output.getFilename());
4568 } else {
4569 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004570 }
4571
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004572 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004573 addDashXForInput(Args, II, CmdArgs);
4574
Daniel Dunbarb440f562010-08-02 02:38:21 +00004575 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004576 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004577 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004578 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004579 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004580
Chris Lattnere9d7d782009-11-03 19:50:27 +00004581 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4582
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004583 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004584
4585 // Optionally embed the -cc1 level arguments into the debug info, for build
4586 // analysis.
4587 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004588 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004589 for (const auto &Arg : Args)
4590 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004591
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004592 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004593 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004594 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004595 SmallString<128> EscapedArg;
4596 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004597 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004598 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004599 }
4600 CmdArgs.push_back("-dwarf-debug-flags");
4601 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4602 }
4603
Eric Christopherd3804002013-02-22 20:12:52 +00004604 // Add the split debug info name to the command lines here so we
4605 // can propagate it to the backend.
4606 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004607 getToolChain().getTriple().isOSLinux() &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004608 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4609 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004610 const char *SplitDwarfOut;
4611 if (SplitDwarf) {
4612 CmdArgs.push_back("-split-dwarf-file");
4613 SplitDwarfOut = SplitDebugName(Args, Inputs);
4614 CmdArgs.push_back(SplitDwarfOut);
4615 }
4616
4617 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004618 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004619 Output.getType() == types::TY_Object &&
4620 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004621 auto CLCommand =
4622 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4623 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4624 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004625 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004626 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004627 }
4628
Daniel Dunbar17731772009-03-23 19:03:36 +00004629
Eric Christopherf1545832013-02-22 23:50:16 +00004630 // Handle the debug info splitting at object creation time if we're
4631 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004632 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004633 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004634 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004635
Roman Divacky178e01602011-02-10 16:52:03 +00004636 if (Arg *A = Args.getLastArg(options::OPT_pg))
4637 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004638 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004639 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004640
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004641 // Claim some arguments which clang supports automatically.
4642
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004643 // -fpch-preprocess is used with gcc to add a special marker in the output to
4644 // include the PCH file. Clang's PTH solution is completely transparent, so we
4645 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004646 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004647
Daniel Dunbar17731772009-03-23 19:03:36 +00004648 // Claim some arguments which clang doesn't support, but we don't
4649 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004650 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4651 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004652
Rafael Espindolab0092d72013-09-04 19:37:35 +00004653 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004654 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004655}
4656
John McCall5fb5df92012-06-20 06:18:46 +00004657/// Add options related to the Objective-C runtime/ABI.
4658///
4659/// Returns true if the runtime is non-fragile.
4660ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4661 ArgStringList &cmdArgs,
4662 RewriteKind rewriteKind) const {
4663 // Look for the controlling runtime option.
4664 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4665 options::OPT_fgnu_runtime,
4666 options::OPT_fobjc_runtime_EQ);
4667
4668 // Just forward -fobjc-runtime= to the frontend. This supercedes
4669 // options about fragility.
4670 if (runtimeArg &&
4671 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4672 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004673 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004674 if (runtime.tryParse(value)) {
4675 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4676 << value;
4677 }
4678
4679 runtimeArg->render(args, cmdArgs);
4680 return runtime;
4681 }
4682
4683 // Otherwise, we'll need the ABI "version". Version numbers are
4684 // slightly confusing for historical reasons:
4685 // 1 - Traditional "fragile" ABI
4686 // 2 - Non-fragile ABI, version 1
4687 // 3 - Non-fragile ABI, version 2
4688 unsigned objcABIVersion = 1;
4689 // If -fobjc-abi-version= is present, use that to set the version.
4690 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004691 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004692 if (value == "1")
4693 objcABIVersion = 1;
4694 else if (value == "2")
4695 objcABIVersion = 2;
4696 else if (value == "3")
4697 objcABIVersion = 3;
4698 else
4699 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4700 << value;
4701 } else {
4702 // Otherwise, determine if we are using the non-fragile ABI.
4703 bool nonFragileABIIsDefault =
4704 (rewriteKind == RK_NonFragile ||
4705 (rewriteKind == RK_None &&
4706 getToolChain().IsObjCNonFragileABIDefault()));
4707 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4708 options::OPT_fno_objc_nonfragile_abi,
4709 nonFragileABIIsDefault)) {
4710 // Determine the non-fragile ABI version to use.
4711#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4712 unsigned nonFragileABIVersion = 1;
4713#else
4714 unsigned nonFragileABIVersion = 2;
4715#endif
4716
4717 if (Arg *abiArg = args.getLastArg(
4718 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004719 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004720 if (value == "1")
4721 nonFragileABIVersion = 1;
4722 else if (value == "2")
4723 nonFragileABIVersion = 2;
4724 else
4725 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4726 << value;
4727 }
4728
4729 objcABIVersion = 1 + nonFragileABIVersion;
4730 } else {
4731 objcABIVersion = 1;
4732 }
4733 }
4734
4735 // We don't actually care about the ABI version other than whether
4736 // it's non-fragile.
4737 bool isNonFragile = objcABIVersion != 1;
4738
4739 // If we have no runtime argument, ask the toolchain for its default runtime.
4740 // However, the rewriter only really supports the Mac runtime, so assume that.
4741 ObjCRuntime runtime;
4742 if (!runtimeArg) {
4743 switch (rewriteKind) {
4744 case RK_None:
4745 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4746 break;
4747 case RK_Fragile:
4748 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4749 break;
4750 case RK_NonFragile:
4751 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4752 break;
4753 }
4754
4755 // -fnext-runtime
4756 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4757 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004758 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004759 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4760
4761 // Otherwise, build for a generic macosx port.
4762 } else {
4763 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4764 }
4765
4766 // -fgnu-runtime
4767 } else {
4768 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004769 // Legacy behaviour is to target the gnustep runtime if we are i
4770 // non-fragile mode or the GCC runtime in fragile mode.
4771 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004772 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004773 else
4774 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004775 }
4776
4777 cmdArgs.push_back(args.MakeArgString(
4778 "-fobjc-runtime=" + runtime.getAsString()));
4779 return runtime;
4780}
4781
Reid Klecknerc542d372014-06-27 17:02:02 +00004782static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4783 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4784 I += HaveDash;
4785 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004786}
Reid Klecknerc542d372014-06-27 17:02:02 +00004787
4788struct EHFlags {
4789 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4790 bool Synch;
4791 bool Asynch;
4792 bool NoExceptC;
4793};
4794
4795/// /EH controls whether to run destructor cleanups when exceptions are
4796/// thrown. There are three modifiers:
4797/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4798/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4799/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4800/// - c: Assume that extern "C" functions are implicitly noexcept. This
4801/// modifier is an optimization, so we ignore it for now.
4802/// The default is /EHs-c-, meaning cleanups are disabled.
4803static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4804 EHFlags EH;
4805 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4806 for (auto EHVal : EHArgs) {
4807 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4808 switch (EHVal[I]) {
4809 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4810 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4811 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4812 default: break;
4813 }
4814 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4815 break;
4816 }
4817 }
4818 return EH;
4819}
4820
Hans Wennborg75958c42013-08-08 00:17:41 +00004821void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4822 unsigned RTOptionID = options::OPT__SLASH_MT;
4823
Hans Wennborgf1a74252013-09-10 20:18:04 +00004824 if (Args.hasArg(options::OPT__SLASH_LDd))
4825 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4826 // but defining _DEBUG is sticky.
4827 RTOptionID = options::OPT__SLASH_MTd;
4828
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004829 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004830 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004831
Hans Wennborg75958c42013-08-08 00:17:41 +00004832 switch(RTOptionID) {
4833 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004834 if (Args.hasArg(options::OPT__SLASH_LDd))
4835 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004836 CmdArgs.push_back("-D_MT");
4837 CmdArgs.push_back("-D_DLL");
4838 CmdArgs.push_back("--dependent-lib=msvcrt");
4839 break;
4840 case options::OPT__SLASH_MDd:
4841 CmdArgs.push_back("-D_DEBUG");
4842 CmdArgs.push_back("-D_MT");
4843 CmdArgs.push_back("-D_DLL");
4844 CmdArgs.push_back("--dependent-lib=msvcrtd");
4845 break;
4846 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004847 if (Args.hasArg(options::OPT__SLASH_LDd))
4848 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004849 CmdArgs.push_back("-D_MT");
4850 CmdArgs.push_back("--dependent-lib=libcmt");
4851 break;
4852 case options::OPT__SLASH_MTd:
4853 CmdArgs.push_back("-D_DEBUG");
4854 CmdArgs.push_back("-D_MT");
4855 CmdArgs.push_back("--dependent-lib=libcmtd");
4856 break;
4857 default:
4858 llvm_unreachable("Unexpected option ID.");
4859 }
4860
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004861 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4862 // users want. The /Za flag to cl.exe turns this off, but it's not
4863 // implemented in clang.
4864 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004865
Hans Wennborg8858a032014-07-21 23:42:07 +00004866 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4867 // would produce interleaved output, so ignore /showIncludes in such cases.
4868 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4869 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4870 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004871
David Majnemerf6072342014-07-01 22:24:56 +00004872 // This controls whether or not we emit RTTI data for polymorphic types.
4873 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4874 /*default=*/false))
4875 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004876
Reid Klecknerc542d372014-06-27 17:02:02 +00004877 const Driver &D = getToolChain().getDriver();
4878 EHFlags EH = parseClangCLEHFlags(D, Args);
4879 // FIXME: Do something with NoExceptC.
Reid Klecknerab80f182015-01-30 01:04:16 +00004880 if (EH.Synch || EH.Asynch)
Reid Klecknerc542d372014-06-27 17:02:02 +00004881 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerab80f182015-01-30 01:04:16 +00004882 // Always add -fexceptions to allow SEH __try.
4883 CmdArgs.push_back("-fexceptions");
Reid Klecknerc542d372014-06-27 17:02:02 +00004884
Hans Wennborge50cec32014-06-13 20:59:54 +00004885 // /EP should expand to -E -P.
4886 if (Args.hasArg(options::OPT__SLASH_EP)) {
4887 CmdArgs.push_back("-E");
4888 CmdArgs.push_back("-P");
4889 }
4890
David Majnemer86c318f2014-02-11 21:05:00 +00004891 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4892 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4893 if (MostGeneralArg && BestCaseArg)
4894 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4895 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4896
4897 if (MostGeneralArg) {
4898 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4899 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4900 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4901
4902 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4903 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4904 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4905 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4906 << FirstConflict->getAsString(Args)
4907 << SecondConflict->getAsString(Args);
4908
4909 if (SingleArg)
4910 CmdArgs.push_back("-fms-memptr-rep=single");
4911 else if (MultipleArg)
4912 CmdArgs.push_back("-fms-memptr-rep=multiple");
4913 else
4914 CmdArgs.push_back("-fms-memptr-rep=virtual");
4915 }
4916
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00004917 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4918 A->render(Args, CmdArgs);
4919
Hans Wennborg81f74482013-09-10 01:07:07 +00004920 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4921 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004922 if (Args.hasArg(options::OPT__SLASH_fallback))
4923 CmdArgs.push_back("msvc-fallback");
4924 else
4925 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004926 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004927}
4928
Hans Wennborg1da044a2014-06-26 19:59:02 +00004929visualstudio::Compile *Clang::getCLFallback() const {
4930 if (!CLFallback)
4931 CLFallback.reset(new visualstudio::Compile(getToolChain()));
4932 return CLFallback.get();
4933}
4934
Daniel Sanders7f933f42015-01-30 17:35:23 +00004935void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
4936 ArgStringList &CmdArgs) const {
4937 StringRef CPUName;
4938 StringRef ABIName;
4939 const llvm::Triple &Triple = getToolChain().getTriple();
4940 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
4941
4942 CmdArgs.push_back("-target-abi");
4943 CmdArgs.push_back(ABIName.data());
4944}
4945
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004946void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004947 const InputInfo &Output,
4948 const InputInfoList &Inputs,
4949 const ArgList &Args,
4950 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004951 ArgStringList CmdArgs;
4952
4953 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4954 const InputInfo &Input = Inputs[0];
4955
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004956 // Don't warn about "clang -w -c foo.s"
4957 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004958 // and "clang -emit-llvm -c foo.s"
4959 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004960
Rafael Espindola577637a2015-01-03 00:06:04 +00004961 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00004962
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004963 // Invoke ourselves in -cc1as mode.
4964 //
4965 // FIXME: Implement custom jobs for internal actions.
4966 CmdArgs.push_back("-cc1as");
4967
4968 // Add the "effective" target triple.
4969 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004970 std::string TripleStr =
4971 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004972 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4973
4974 // Set the output mode, we currently only expect to be used as a real
4975 // assembler.
4976 CmdArgs.push_back("-filetype");
4977 CmdArgs.push_back("obj");
4978
Eric Christopher45f2e712012-12-18 00:31:10 +00004979 // Set the main file name, so that debug info works even with
4980 // -save-temps or preprocessed assembly.
4981 CmdArgs.push_back("-main-file-name");
4982 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4983
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004984 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004985 const llvm::Triple &Triple = getToolChain().getTriple();
4986 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004987 if (!CPU.empty()) {
4988 CmdArgs.push_back("-target-cpu");
4989 CmdArgs.push_back(Args.MakeArgString(CPU));
4990 }
4991
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004992 // Add the target features
4993 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004994 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004995
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004996 // Ignore explicit -force_cpusubtype_ALL option.
4997 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004998
Eric Christopherfc3ee562012-01-10 00:38:01 +00004999 // Determine the original source input.
5000 const Action *SourceAction = &JA;
5001 while (SourceAction->getKind() != Action::InputClass) {
5002 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5003 SourceAction = SourceAction->getInputs()[0];
5004 }
5005
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005006 // Forward -g and handle debug info related flags, assuming we are dealing
5007 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005008 if (SourceAction->getType() == types::TY_Asm ||
5009 SourceAction->getType() == types::TY_PP_Asm) {
5010 Args.ClaimAllArgs(options::OPT_g_Group);
5011 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5012 if (!A->getOption().matches(options::OPT_g0))
5013 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005014
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005015 if (Args.hasArg(options::OPT_gdwarf_2))
5016 CmdArgs.push_back("-gdwarf-2");
5017 if (Args.hasArg(options::OPT_gdwarf_3))
5018 CmdArgs.push_back("-gdwarf-3");
5019 if (Args.hasArg(options::OPT_gdwarf_4))
5020 CmdArgs.push_back("-gdwarf-4");
5021
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005022 // Add the -fdebug-compilation-dir flag if needed.
5023 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005024
5025 // Set the AT_producer to the clang version when using the integrated
5026 // assembler on assembly source files.
5027 CmdArgs.push_back("-dwarf-debug-producer");
5028 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00005029 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005030
5031 // Optionally embed the -cc1as level arguments into the debug info, for build
5032 // analysis.
5033 if (getToolChain().UseDwarfDebugFlags()) {
5034 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005035 for (const auto &Arg : Args)
5036 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005037
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005038 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005039 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5040 Flags += Exec;
5041 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005042 SmallString<128> EscapedArg;
5043 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005044 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005045 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005046 }
5047 CmdArgs.push_back("-dwarf-debug-flags");
5048 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
5049 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005050
5051 // FIXME: Add -static support, once we have it.
5052
Daniel Sanders7f933f42015-01-30 17:35:23 +00005053 // Add target specific flags.
5054 switch(getToolChain().getArch()) {
5055 default:
5056 break;
5057
5058 case llvm::Triple::mips:
5059 case llvm::Triple::mipsel:
5060 case llvm::Triple::mips64:
5061 case llvm::Triple::mips64el:
5062 AddMIPSTargetArgs(Args, CmdArgs);
5063 break;
5064 }
5065
David Blaikie372d9502014-01-17 03:17:40 +00005066 // Consume all the warning flags. Usually this would be handled more
5067 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5068 // doesn't handle that so rather than warning about unused flags that are
5069 // actually used, we'll lie by omission instead.
5070 // FIXME: Stop lying and consume only the appropriate driver flags
5071 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
5072 ie = Args.filtered_end();
5073 it != ie; ++it)
5074 (*it)->claim();
5075
David Blaikie9260ed62013-07-25 21:19:01 +00005076 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5077 getToolChain().getDriver());
5078
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005079 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005080
5081 assert(Output.isFilename() && "Unexpected lipo output.");
5082 CmdArgs.push_back("-o");
5083 CmdArgs.push_back(Output.getFilename());
5084
Daniel Dunbarb440f562010-08-02 02:38:21 +00005085 assert(Input.isFilename() && "Invalid input.");
5086 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005087
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005088 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005089 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005090
5091 // Handle the debug info splitting at object creation time if we're
5092 // creating an object.
5093 // TODO: Currently only works on linux with newer objcopy.
5094 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005095 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005096 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
5097 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005098}
5099
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005100void GnuTool::anchor() {}
5101
Daniel Dunbara3246a02009-03-18 08:07:30 +00005102void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005103 const InputInfo &Output,
5104 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005105 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005106 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005107 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005108 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005109
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005110 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005111 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005112 // Don't forward any -g arguments to assembly steps.
5113 if (isa<AssembleJobAction>(JA) &&
5114 A->getOption().matches(options::OPT_g_Group))
5115 continue;
5116
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005117 // Don't forward any -W arguments to assembly and link steps.
5118 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5119 A->getOption().matches(options::OPT_W_Group))
5120 continue;
5121
Daniel Dunbar2da02722009-03-19 07:55:12 +00005122 // It is unfortunate that we have to claim here, as this means
5123 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005124 // platforms using a generic gcc, even if we are just using gcc
5125 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005126 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005127 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005128 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005129 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005130
Daniel Dunbar4e295052010-01-25 22:35:08 +00005131 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005132
5133 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005134 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005135 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005136 CmdArgs.push_back(
5137 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005138 }
5139
Daniel Dunbar5716d872009-05-02 21:41:52 +00005140 // Try to force gcc to match the tool chain we want, if we recognize
5141 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005142 //
5143 // FIXME: The triple class should directly provide the information we want
5144 // here.
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005145 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005146 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005147 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005148 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5149 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005150 CmdArgs.push_back("-m64");
5151
Daniel Dunbarb440f562010-08-02 02:38:21 +00005152 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005153 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005154 CmdArgs.push_back(Output.getFilename());
5155 } else {
5156 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005157 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005158 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005159
Tony Linthicum76329bf2011-12-12 21:14:55 +00005160 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5161 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005162
5163 // Only pass -x if gcc will understand it; otherwise hope gcc
5164 // understands the suffix correctly. The main use case this would go
5165 // wrong in is for linker inputs if they happened to have an odd
5166 // suffix; really the only way to get this to happen is a command
5167 // like '-x foobar a.c' which will treat a.c like a linker input.
5168 //
5169 // FIXME: For the linker case specifically, can we safely convert
5170 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005171 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005172 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005173 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5174 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005175 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005176 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005177 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005178 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005179 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005180 else if (II.getType() == types::TY_ModuleFile)
5181 D.Diag(diag::err_drv_no_module_support)
5182 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005183
Daniel Dunbara3246a02009-03-18 08:07:30 +00005184 if (types::canTypeBeUserSpecified(II.getType())) {
5185 CmdArgs.push_back("-x");
5186 CmdArgs.push_back(types::getTypeName(II.getType()));
5187 }
5188
Daniel Dunbarb440f562010-08-02 02:38:21 +00005189 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005190 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005191 else {
5192 const Arg &A = II.getInputArg();
5193
5194 // Reverse translate some rewritten options.
5195 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5196 CmdArgs.push_back("-lstdc++");
5197 continue;
5198 }
5199
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005200 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005201 A.render(Args, CmdArgs);
5202 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005203 }
5204
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005205 const std::string customGCCName = D.getCCCGenericGCCName();
5206 const char *GCCName;
5207 if (!customGCCName.empty())
5208 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005209 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005210 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005211 } else
5212 GCCName = "gcc";
5213
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005214 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005215 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005216 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005217}
5218
Daniel Dunbar4e295052010-01-25 22:35:08 +00005219void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5220 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005221 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005222}
5223
Daniel Dunbar4e295052010-01-25 22:35:08 +00005224void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5225 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005226 const Driver &D = getToolChain().getDriver();
5227
Eric Christophercc7ff502015-01-29 00:56:17 +00005228 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005229 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005230 case types::TY_LLVM_IR:
5231 case types::TY_LTO_IR:
5232 case types::TY_LLVM_BC:
5233 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005234 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005235 break;
5236 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005237 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005238 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005239 case types::TY_Nothing:
5240 CmdArgs.push_back("-fsyntax-only");
5241 break;
5242 default:
5243 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005244 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005245}
5246
Daniel Dunbar4e295052010-01-25 22:35:08 +00005247void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5248 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005249 // The types are (hopefully) good enough.
5250}
5251
Tony Linthicum76329bf2011-12-12 21:14:55 +00005252// Hexagon tools start.
5253void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5254 ArgStringList &CmdArgs) const {
5255
5256}
5257void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5258 const InputInfo &Output,
5259 const InputInfoList &Inputs,
5260 const ArgList &Args,
5261 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005262 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005263
5264 const Driver &D = getToolChain().getDriver();
5265 ArgStringList CmdArgs;
5266
5267 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005268 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005269 CmdArgs.push_back(Args.MakeArgString(MarchString));
5270
5271 RenderExtraToolArgs(JA, CmdArgs);
5272
5273 if (Output.isFilename()) {
5274 CmdArgs.push_back("-o");
5275 CmdArgs.push_back(Output.getFilename());
5276 } else {
5277 assert(Output.isNothing() && "Unexpected output");
5278 CmdArgs.push_back("-fsyntax-only");
5279 }
5280
Matthew Curtise8f80a12012-12-06 17:49:03 +00005281 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5282 if (!SmallDataThreshold.empty())
5283 CmdArgs.push_back(
5284 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005285
Matthew Curtise5df3812012-12-07 17:23:04 +00005286 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5287 options::OPT_Xassembler);
5288
Tony Linthicum76329bf2011-12-12 21:14:55 +00005289 // Only pass -x if gcc will understand it; otherwise hope gcc
5290 // understands the suffix correctly. The main use case this would go
5291 // wrong in is for linker inputs if they happened to have an odd
5292 // suffix; really the only way to get this to happen is a command
5293 // like '-x foobar a.c' which will treat a.c like a linker input.
5294 //
5295 // FIXME: For the linker case specifically, can we safely convert
5296 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005297 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005298 // Don't try to pass LLVM or AST inputs to a generic gcc.
5299 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5300 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5301 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5302 << getToolChain().getTripleString();
5303 else if (II.getType() == types::TY_AST)
5304 D.Diag(clang::diag::err_drv_no_ast_support)
5305 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005306 else if (II.getType() == types::TY_ModuleFile)
5307 D.Diag(diag::err_drv_no_module_support)
5308 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005309
5310 if (II.isFilename())
5311 CmdArgs.push_back(II.getFilename());
5312 else
5313 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5314 II.getInputArg().render(Args, CmdArgs);
5315 }
5316
5317 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005318 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005319 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005320}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005321
Tony Linthicum76329bf2011-12-12 21:14:55 +00005322void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5323 ArgStringList &CmdArgs) const {
5324 // The types are (hopefully) good enough.
5325}
5326
5327void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5328 const InputInfo &Output,
5329 const InputInfoList &Inputs,
5330 const ArgList &Args,
5331 const char *LinkingOutput) const {
5332
Matthew Curtise689b052012-12-06 15:46:07 +00005333 const toolchains::Hexagon_TC& ToolChain =
5334 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5335 const Driver &D = ToolChain.getDriver();
5336
Tony Linthicum76329bf2011-12-12 21:14:55 +00005337 ArgStringList CmdArgs;
5338
Matthew Curtise689b052012-12-06 15:46:07 +00005339 //----------------------------------------------------------------------------
5340 //
5341 //----------------------------------------------------------------------------
5342 bool hasStaticArg = Args.hasArg(options::OPT_static);
5343 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005344 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005345 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5346 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5347 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5348 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005349
Matthew Curtise689b052012-12-06 15:46:07 +00005350 //----------------------------------------------------------------------------
5351 // Silence warnings for various options
5352 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005353
Matthew Curtise689b052012-12-06 15:46:07 +00005354 Args.ClaimAllArgs(options::OPT_g_Group);
5355 Args.ClaimAllArgs(options::OPT_emit_llvm);
5356 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5357 // handled somewhere else.
5358 Args.ClaimAllArgs(options::OPT_static_libgcc);
5359
5360 //----------------------------------------------------------------------------
5361 //
5362 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005363 for (const auto &Opt : ToolChain.ExtraOpts)
5364 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005365
Matthew Curtisf10a5952012-12-06 14:16:43 +00005366 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5367 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005368
Matthew Curtise689b052012-12-06 15:46:07 +00005369 if (buildingLib) {
5370 CmdArgs.push_back("-shared");
5371 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5372 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005373 }
5374
Matthew Curtise689b052012-12-06 15:46:07 +00005375 if (hasStaticArg)
5376 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005377
Matthew Curtise8f80a12012-12-06 17:49:03 +00005378 if (buildPIE && !buildingLib)
5379 CmdArgs.push_back("-pie");
5380
5381 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5382 if (!SmallDataThreshold.empty()) {
5383 CmdArgs.push_back(
5384 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5385 }
5386
Matthew Curtise689b052012-12-06 15:46:07 +00005387 //----------------------------------------------------------------------------
5388 //
5389 //----------------------------------------------------------------------------
5390 CmdArgs.push_back("-o");
5391 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005392
Matthew Curtise689b052012-12-06 15:46:07 +00005393 const std::string MarchSuffix = "/" + MarchString;
5394 const std::string G0Suffix = "/G0";
5395 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005396 const std::string RootDir =
5397 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005398 const std::string StartFilesDir = RootDir
5399 + "hexagon/lib"
5400 + (buildingLib
5401 ? MarchG0Suffix : MarchSuffix);
5402
5403 //----------------------------------------------------------------------------
5404 // moslib
5405 //----------------------------------------------------------------------------
5406 std::vector<std::string> oslibs;
5407 bool hasStandalone= false;
5408
5409 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5410 ie = Args.filtered_end(); it != ie; ++it) {
5411 (*it)->claim();
5412 oslibs.push_back((*it)->getValue());
5413 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005414 }
Matthew Curtise689b052012-12-06 15:46:07 +00005415 if (oslibs.empty()) {
5416 oslibs.push_back("standalone");
5417 hasStandalone = true;
5418 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005419
Matthew Curtise689b052012-12-06 15:46:07 +00005420 //----------------------------------------------------------------------------
5421 // Start Files
5422 //----------------------------------------------------------------------------
5423 if (incStdLib && incStartFiles) {
5424
5425 if (!buildingLib) {
5426 if (hasStandalone) {
5427 CmdArgs.push_back(
5428 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5429 }
5430 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5431 }
5432 std::string initObj = useShared ? "/initS.o" : "/init.o";
5433 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5434 }
5435
5436 //----------------------------------------------------------------------------
5437 // Library Search Paths
5438 //----------------------------------------------------------------------------
5439 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005440 for (const auto &LibPath : LibPaths)
5441 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005442
5443 //----------------------------------------------------------------------------
5444 //
5445 //----------------------------------------------------------------------------
5446 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5447 Args.AddAllArgs(CmdArgs, options::OPT_e);
5448 Args.AddAllArgs(CmdArgs, options::OPT_s);
5449 Args.AddAllArgs(CmdArgs, options::OPT_t);
5450 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5451
5452 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5453
5454 //----------------------------------------------------------------------------
5455 // Libraries
5456 //----------------------------------------------------------------------------
5457 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005458 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005459 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5460 CmdArgs.push_back("-lm");
5461 }
5462
5463 CmdArgs.push_back("--start-group");
5464
5465 if (!buildingLib) {
5466 for(std::vector<std::string>::iterator i = oslibs.begin(),
5467 e = oslibs.end(); i != e; ++i)
5468 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5469 CmdArgs.push_back("-lc");
5470 }
5471 CmdArgs.push_back("-lgcc");
5472
5473 CmdArgs.push_back("--end-group");
5474 }
5475
5476 //----------------------------------------------------------------------------
5477 // End files
5478 //----------------------------------------------------------------------------
5479 if (incStdLib && incStartFiles) {
5480 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5481 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5482 }
5483
5484 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005485 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5486 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005487}
5488// Hexagon tools end.
5489
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005490/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Bernard Ogden31561762013-12-12 13:27:11 +00005491const char *arm::getARMCPUForMArch(const ArgList &Args,
5492 const llvm::Triple &Triple) {
5493 StringRef MArch;
5494 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5495 // Otherwise, if we have -march= choose the base CPU for that arch.
5496 MArch = A->getValue();
5497 } else {
5498 // Otherwise, use the Arch from the triple.
5499 MArch = Triple.getArchName();
5500 }
5501
5502 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005503 if (MArch == "native") {
5504 std::string CPU = llvm::sys::getHostCPUName();
5505 if (CPU != "generic") {
5506 // Translate the native cpu into the architecture. The switch below will
5507 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00005508 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00005509 }
5510 }
5511
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005512 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00005513}
5514
5515/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005516StringRef arm::getARMTargetCPU(const ArgList &Args,
5517 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005518 // FIXME: Warn on inconsistent use of -mcpu and -march.
5519 // If we have -mcpu=, use that.
5520 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5521 StringRef MCPU = A->getValue();
5522 // Handle -mcpu=native.
5523 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005524 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005525 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005526 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005527 }
5528
5529 return getARMCPUForMArch(Args, Triple);
5530}
5531
5532/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5533/// CPU.
5534//
5535// FIXME: This is redundant with -mcpu, why does LLVM use this.
5536// FIXME: tblgen this, or kill it!
5537const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5538 return llvm::StringSwitch<const char *>(CPU)
5539 .Case("strongarm", "v4")
5540 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5541 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5542 .Cases("arm920", "arm920t", "arm922t", "v4t")
5543 .Cases("arm940t", "ep9312","v4t")
5544 .Cases("arm10tdmi", "arm1020t", "v5")
5545 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5546 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5547 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
5548 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
5549 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
5550 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Charlie Turner2919cbd2014-11-06 14:59:30 +00005551 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin5886bc32014-10-13 10:22:48 +00005552 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "v7")
Bernard Ogden31561762013-12-12 13:27:11 +00005553 .Cases("cortex-r4", "cortex-r5", "v7r")
5554 .Case("cortex-m0", "v6m")
5555 .Case("cortex-m3", "v7m")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00005556 .Cases("cortex-m4", "cortex-m7", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005557 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005558 .Case("cyclone", "v8")
Renato Golin84545d72015-02-04 13:31:56 +00005559 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005560 .Default("");
5561}
5562
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005563void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple) {
5564 if (Args.hasArg(options::OPT_r))
5565 return;
5566
5567 StringRef Suffix = getLLVMArchSuffixForARM(getARMCPUForMArch(Args, Triple));
5568 const char *LinkFlag = llvm::StringSwitch<const char *>(Suffix)
5569 .Cases("v4", "v4t", "v5", "v5e", nullptr)
5570 .Cases("v6", "v6t2", nullptr)
5571 .Default("--be8");
5572
5573 if (LinkFlag)
5574 CmdArgs.push_back(LinkFlag);
5575}
5576
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005577bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5578 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5579 return A && (A->getValue() == StringRef(Value));
5580}
5581
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005582bool mips::isUCLibc(const ArgList &Args) {
5583 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005584 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005585}
5586
Daniel Sanders2bf13662014-07-10 14:40:57 +00005587bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005588 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5589 return llvm::StringSwitch<bool>(NaNArg->getValue())
5590 .Case("2008", true)
5591 .Case("legacy", false)
5592 .Default(false);
5593
5594 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005595 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5596 .Cases("mips32r6", "mips64r6", true)
5597 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005598
5599 return false;
5600}
5601
Daniel Sanders379d44b2014-07-16 11:52:23 +00005602bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5603 StringRef ABIName) {
5604 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005605 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005606 return false;
5607
5608 if (ABIName != "32")
5609 return false;
5610
5611 return llvm::StringSwitch<bool>(CPUName)
5612 .Cases("mips2", "mips3", "mips4", "mips5", true)
5613 .Cases("mips32", "mips32r2", true)
5614 .Cases("mips64", "mips64r2", true)
5615 .Default(false);
5616}
5617
Tim Northover157d9112014-01-16 08:48:16 +00005618llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005619 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5620 // archs which Darwin doesn't use.
5621
5622 // The matching this routine does is fairly pointless, since it is neither the
5623 // complete architecture list, nor a reasonable subset. The problem is that
5624 // historically the driver driver accepts this and also ties its -march=
5625 // handling to the architecture name, so we need to be careful before removing
5626 // support for it.
5627
5628 // This code must be kept in sync with Clang's Darwin specific argument
5629 // translation.
5630
5631 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5632 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5633 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5634 .Case("ppc64", llvm::Triple::ppc64)
5635 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5636 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5637 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005638 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005639 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005640 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005641 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005642 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005643 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005644 .Case("r600", llvm::Triple::r600)
Tom Stellardd8e38a32015-01-06 20:34:47 +00005645 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005646 .Case("nvptx", llvm::Triple::nvptx)
5647 .Case("nvptx64", llvm::Triple::nvptx64)
5648 .Case("amdil", llvm::Triple::amdil)
5649 .Case("spir", llvm::Triple::spir)
5650 .Default(llvm::Triple::UnknownArch);
5651}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005652
Tim Northover157d9112014-01-16 08:48:16 +00005653void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5654 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5655 T.setArch(Arch);
5656
5657 if (Str == "x86_64h")
5658 T.setArchName(Str);
5659 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5660 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005661 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005662 }
5663}
5664
Bob Wilsondecc03e2012-11-23 06:14:39 +00005665const char *Clang::getBaseInputName(const ArgList &Args,
5666 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005667 return Args.MakeArgString(
5668 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005669}
5670
Bob Wilsondecc03e2012-11-23 06:14:39 +00005671const char *Clang::getBaseInputStem(const ArgList &Args,
5672 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005673 const char *Str = getBaseInputName(Args, Inputs);
5674
Chris Lattner906bb902011-01-16 08:14:11 +00005675 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005676 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005677
5678 return Str;
5679}
5680
Bob Wilsondecc03e2012-11-23 06:14:39 +00005681const char *Clang::getDependencyFileName(const ArgList &Args,
5682 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005683 // FIXME: Think about this more.
5684 std::string Res;
5685
5686 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005687 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005688 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005689 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005690 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005691 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005692 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005693}
5694
Daniel Dunbarbe220842009-03-20 16:06:39 +00005695void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005696 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005697 const InputInfoList &Inputs,
5698 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005699 const char *LinkingOutput) const {
5700 ArgStringList CmdArgs;
5701
5702 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5703 const InputInfo &Input = Inputs[0];
5704
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005705 // Determine the original source input.
5706 const Action *SourceAction = &JA;
5707 while (SourceAction->getKind() != Action::InputClass) {
5708 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5709 SourceAction = SourceAction->getInputs()[0];
5710 }
5711
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005712 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005713 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005714 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5715 // FIXME: at run-time detect assembler capabilities or rely on version
5716 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005717 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005718 const llvm::Triple &T(getToolChain().getTriple());
5719 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005720 CmdArgs.push_back("-Q");
5721 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005722
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005723 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005724 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005725 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005726 if (Args.hasArg(options::OPT_gstabs))
5727 CmdArgs.push_back("--gstabs");
5728 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005729 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005730 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005731
Daniel Dunbarbe220842009-03-20 16:06:39 +00005732 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005733 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005734
Daniel Dunbar6d484762010-07-22 01:47:22 +00005735 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005736 if (getToolChain().getArch() == llvm::Triple::x86 ||
5737 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005738 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5739 CmdArgs.push_back("-force_cpusubtype_ALL");
5740
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005741 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005742 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005743 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005744 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005745 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005746 CmdArgs.push_back("-static");
5747
Daniel Dunbarbe220842009-03-20 16:06:39 +00005748 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5749 options::OPT_Xassembler);
5750
5751 assert(Output.isFilename() && "Unexpected lipo output.");
5752 CmdArgs.push_back("-o");
5753 CmdArgs.push_back(Output.getFilename());
5754
Daniel Dunbarb440f562010-08-02 02:38:21 +00005755 assert(Input.isFilename() && "Invalid input.");
5756 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005757
5758 // asm_final spec is empty.
5759
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005760 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005761 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00005762 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005763}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005764
Tim Northover157d9112014-01-16 08:48:16 +00005765void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005766
Tim Northover157d9112014-01-16 08:48:16 +00005767void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5768 ArgStringList &CmdArgs) const {
5769 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005770
Daniel Dunbarc1964212009-03-26 16:23:12 +00005771 // Derived from darwin_arch spec.
5772 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005773 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005774
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005775 // FIXME: Is this needed anymore?
5776 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005777 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005778}
5779
Bill Wendling3b2000f2012-10-02 18:02:50 +00005780bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5781 // We only need to generate a temp path for LTO if we aren't compiling object
5782 // files. When compiling source files, we run 'dsymutil' after linking. We
5783 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005784 for (const auto &Input : Inputs)
5785 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00005786 return true;
5787
5788 return false;
5789}
5790
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005791void darwin::Link::AddLinkArgs(Compilation &C,
5792 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005793 ArgStringList &CmdArgs,
5794 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005795 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005796 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005797
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005798 unsigned Version[3] = { 0, 0, 0 };
5799 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5800 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005801 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005802 Version[1], Version[2], HadExtra) ||
5803 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005804 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005805 << A->getAsString(Args);
5806 }
5807
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005808 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005809 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005810 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5811 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005812
Bob Wilson3d27dad2013-08-02 22:25:34 +00005813 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5814 CmdArgs.push_back("-export_dynamic");
5815
Bill Wendling313b6bf2012-11-16 23:03:00 +00005816 // If we are using LTO, then automatically create a temporary file path for
5817 // the linker to use, so that it's lifetime will extend past a possible
5818 // dsymutil step.
5819 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5820 const char *TmpPath = C.getArgs().MakeArgString(
5821 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5822 C.addTempFile(TmpPath);
5823 CmdArgs.push_back("-object_path_lto");
5824 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00005825 }
5826
Daniel Dunbarc1964212009-03-26 16:23:12 +00005827 // Derived from the "link" spec.
5828 Args.AddAllArgs(CmdArgs, options::OPT_static);
5829 if (!Args.hasArg(options::OPT_static))
5830 CmdArgs.push_back("-dynamic");
5831 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5832 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5833 // here. How do we wish to handle such things?
5834 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005835
Daniel Dunbarc1964212009-03-26 16:23:12 +00005836 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00005837 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00005838 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00005839 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005840
5841 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5842 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5843 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5844
5845 Arg *A;
5846 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5847 (A = Args.getLastArg(options::OPT_current__version)) ||
5848 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005849 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005850 << A->getAsString(Args) << "-dynamiclib";
5851
5852 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5853 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5854 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5855 } else {
5856 CmdArgs.push_back("-dylib");
5857
5858 Arg *A;
5859 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5860 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5861 (A = Args.getLastArg(options::OPT_client__name)) ||
5862 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5863 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5864 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005865 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005866 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005867
Daniel Dunbarc1964212009-03-26 16:23:12 +00005868 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5869 "-dylib_compatibility_version");
5870 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5871 "-dylib_current_version");
5872
Tim Northover157d9112014-01-16 08:48:16 +00005873 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005874
5875 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5876 "-dylib_install_name");
5877 }
5878
5879 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5880 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5881 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00005882 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005883 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005884 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5885 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5886 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5887 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5888 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5889 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00005890 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005891 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5892 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5893 Args.AddAllArgs(CmdArgs, options::OPT_init);
5894
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005895 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00005896 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005897
Daniel Dunbarc1964212009-03-26 16:23:12 +00005898 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5899 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5900 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5901 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5902 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005903
Daniel Dunbaraf68a882010-07-13 23:31:40 +00005904 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5905 options::OPT_fno_pie,
5906 options::OPT_fno_PIE)) {
5907 if (A->getOption().matches(options::OPT_fpie) ||
5908 A->getOption().matches(options::OPT_fPIE))
5909 CmdArgs.push_back("-pie");
5910 else
5911 CmdArgs.push_back("-no_pie");
5912 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005913
5914 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5915 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5916 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5917 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5918 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5919 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5920 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5921 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5922 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5923 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5924 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5925 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5926 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5927 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5928 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5929 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005930
Daniel Dunbar84384642011-05-02 21:03:47 +00005931 // Give --sysroot= preference, over the Apple specific behavior to also use
5932 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00005933 StringRef sysroot = C.getSysRoot();
5934 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00005935 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00005936 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00005937 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5938 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00005939 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005940 }
5941
Daniel Dunbarc1964212009-03-26 16:23:12 +00005942 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5943 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5944 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5945 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5946 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005947 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005948 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5949 Args.AddAllArgs(CmdArgs, options::OPT_y);
5950 Args.AddLastArg(CmdArgs, options::OPT_w);
5951 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5952 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5953 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5954 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5955 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5956 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5957 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5958 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5959 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5960 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5961 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5962 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5963}
5964
Alexey Bataev186b28a2014-03-06 05:43:53 +00005965enum LibOpenMP {
5966 LibUnknown,
5967 LibGOMP,
5968 LibIOMP5
5969};
5970
Daniel Dunbarc1964212009-03-26 16:23:12 +00005971void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005972 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005973 const InputInfoList &Inputs,
5974 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00005975 const char *LinkingOutput) const {
5976 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00005977
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005978 // If the number of arguments surpasses the system limits, we will encode the
5979 // input files in a separate file, shortening the command line. To this end,
5980 // build a list of input file names that can be passed via a file with the
5981 // -filelist linker option.
5982 llvm::opt::ArgStringList InputFileList;
5983
Daniel Dunbarc1964212009-03-26 16:23:12 +00005984 // The logic here is derived from gcc's behavior; most of which
5985 // comes from specs (starting with link_command). Consult gcc for
5986 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00005987 ArgStringList CmdArgs;
5988
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005989 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5990 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5991 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005992 for (const auto &Arg : Args)
5993 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005994 const char *Exec =
5995 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5996 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00005997 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005998 return;
5999 }
6000
Daniel Dunbarc1964212009-03-26 16:23:12 +00006001 // I'm not sure why this particular decomposition exists in gcc, but
6002 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006003 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006004
Daniel Dunbarc1964212009-03-26 16:23:12 +00006005 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6006 Args.AddAllArgs(CmdArgs, options::OPT_s);
6007 Args.AddAllArgs(CmdArgs, options::OPT_t);
6008 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6009 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006010 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006011 Args.AddAllArgs(CmdArgs, options::OPT_r);
6012
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006013 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6014 // members of static archive libraries which implement Objective-C classes or
6015 // categories.
6016 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6017 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006018
Daniel Dunbarc1964212009-03-26 16:23:12 +00006019 CmdArgs.push_back("-o");
6020 CmdArgs.push_back(Output.getFilename());
6021
Chad Rosier06fd3c62012-05-16 23:45:12 +00006022 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006023 !Args.hasArg(options::OPT_nostartfiles))
6024 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006025
6026 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006027
Alexey Bataev186b28a2014-03-06 05:43:53 +00006028 LibOpenMP UsedOpenMPLib = LibUnknown;
6029 if (Args.hasArg(options::OPT_fopenmp)) {
6030 UsedOpenMPLib = LibGOMP;
6031 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
6032 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
6033 .Case("libgomp", LibGOMP)
6034 .Case("libiomp5", LibIOMP5)
6035 .Default(LibUnknown);
6036 if (UsedOpenMPLib == LibUnknown)
6037 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
6038 << A->getOption().getName() << A->getValue();
6039 }
6040 switch (UsedOpenMPLib) {
6041 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00006042 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00006043 break;
6044 case LibIOMP5:
6045 CmdArgs.push_back("-liomp5");
6046 break;
6047 case LibUnknown:
6048 break;
6049 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006050
Douglas Gregor9295df02012-05-15 21:00:27 +00006051 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006052 // Build the input file for -filelist (list of linker input files) in case we
6053 // need it later
6054 for (const auto &II : Inputs) {
6055 if (!II.isFilename()) {
6056 // This is a linker input argument.
6057 // We cannot mix input arguments and file names in a -filelist input, thus
6058 // we prematurely stop our list (remaining files shall be passed as
6059 // arguments).
6060 if (InputFileList.size() > 0)
6061 break;
6062
6063 continue;
6064 }
6065
6066 InputFileList.push_back(II.getFilename());
6067 }
6068
Bob Wilson16d93952012-05-15 18:57:39 +00006069 if (isObjCRuntimeLinked(Args) &&
6070 !Args.hasArg(options::OPT_nostdlib) &&
6071 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006072 // We use arclite library for both ARC and subscripting support.
6073 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6074
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006075 CmdArgs.push_back("-framework");
6076 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006077 // Link libobj.
6078 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006079 }
John McCall31168b02011-06-15 23:02:42 +00006080
Daniel Dunbarc1964212009-03-26 16:23:12 +00006081 if (LinkingOutput) {
6082 CmdArgs.push_back("-arch_multiple");
6083 CmdArgs.push_back("-final_output");
6084 CmdArgs.push_back(LinkingOutput);
6085 }
6086
Daniel Dunbarc1964212009-03-26 16:23:12 +00006087 if (Args.hasArg(options::OPT_fnested_functions))
6088 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006089
Daniel Dunbarc1964212009-03-26 16:23:12 +00006090 if (!Args.hasArg(options::OPT_nostdlib) &&
6091 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006092 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006093 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006094
Daniel Dunbarc1964212009-03-26 16:23:12 +00006095 // link_ssp spec is empty.
6096
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006097 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006098 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006099 }
6100
Chad Rosier06fd3c62012-05-16 23:45:12 +00006101 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006102 !Args.hasArg(options::OPT_nostartfiles)) {
6103 // endfile_spec is empty.
6104 }
6105
6106 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6107 Args.AddAllArgs(CmdArgs, options::OPT_F);
6108
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006109 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006110 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006111 std::unique_ptr<Command> Cmd =
6112 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6113 Cmd->setInputFileList(std::move(InputFileList));
6114 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006115}
6116
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006117void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006118 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006119 const InputInfoList &Inputs,
6120 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006121 const char *LinkingOutput) const {
6122 ArgStringList CmdArgs;
6123
6124 CmdArgs.push_back("-create");
6125 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006126
6127 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006128 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006129
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006130 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006131 assert(II.isFilename() && "Unexpected lipo input.");
6132 CmdArgs.push_back(II.getFilename());
6133 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006134
6135 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006136 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006137}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006138
Daniel Dunbar88299622010-06-04 18:28:36 +00006139void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006140 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006141 const InputInfoList &Inputs,
6142 const ArgList &Args,
6143 const char *LinkingOutput) const {
6144 ArgStringList CmdArgs;
6145
Daniel Dunbareb86b042011-05-09 17:23:16 +00006146 CmdArgs.push_back("-o");
6147 CmdArgs.push_back(Output.getFilename());
6148
Daniel Dunbar88299622010-06-04 18:28:36 +00006149 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6150 const InputInfo &Input = Inputs[0];
6151 assert(Input.isFilename() && "Unexpected dsymutil input.");
6152 CmdArgs.push_back(Input.getFilename());
6153
Daniel Dunbar88299622010-06-04 18:28:36 +00006154 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006155 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006156 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006157}
6158
Eric Christopher551ef452011-08-23 17:56:55 +00006159void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006160 const InputInfo &Output,
6161 const InputInfoList &Inputs,
6162 const ArgList &Args,
6163 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006164 ArgStringList CmdArgs;
6165 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006166 CmdArgs.push_back("--debug-info");
6167 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006168 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006169
6170 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6171 const InputInfo &Input = Inputs[0];
6172 assert(Input.isFilename() && "Unexpected verify input");
6173
6174 // Grabbing the output of the earlier dsymutil run.
6175 CmdArgs.push_back(Input.getFilename());
6176
6177 const char *Exec =
6178 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006179 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006180}
6181
David Chisnallf571cde2012-02-15 13:39:01 +00006182void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6183 const InputInfo &Output,
6184 const InputInfoList &Inputs,
6185 const ArgList &Args,
6186 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006187 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006188 ArgStringList CmdArgs;
6189
6190 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6191 options::OPT_Xassembler);
6192
6193 CmdArgs.push_back("-o");
6194 CmdArgs.push_back(Output.getFilename());
6195
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006196 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006197 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006198
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006199 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006200 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006201}
6202
David Chisnallf571cde2012-02-15 13:39:01 +00006203void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6204 const InputInfo &Output,
6205 const InputInfoList &Inputs,
6206 const ArgList &Args,
6207 const char *LinkingOutput) const {
6208 // FIXME: Find a real GCC, don't hard-code versions here
6209 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6210 const llvm::Triple &T = getToolChain().getTriple();
6211 std::string LibPath = "/usr/lib/";
6212 llvm::Triple::ArchType Arch = T.getArch();
6213 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006214 case llvm::Triple::x86:
6215 GCCLibPath +=
6216 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6217 break;
6218 case llvm::Triple::x86_64:
6219 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6220 GCCLibPath += "/4.5.2/amd64/";
6221 LibPath += "amd64/";
6222 break;
6223 default:
6224 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006225 }
6226
6227 ArgStringList CmdArgs;
6228
David Chisnall272a0712012-02-29 15:06:12 +00006229 // Demangle C++ names in errors
6230 CmdArgs.push_back("-C");
6231
David Chisnallf571cde2012-02-15 13:39:01 +00006232 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6233 (!Args.hasArg(options::OPT_shared))) {
6234 CmdArgs.push_back("-e");
6235 CmdArgs.push_back("_start");
6236 }
6237
6238 if (Args.hasArg(options::OPT_static)) {
6239 CmdArgs.push_back("-Bstatic");
6240 CmdArgs.push_back("-dn");
6241 } else {
6242 CmdArgs.push_back("-Bdynamic");
6243 if (Args.hasArg(options::OPT_shared)) {
6244 CmdArgs.push_back("-shared");
6245 } else {
6246 CmdArgs.push_back("--dynamic-linker");
6247 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6248 }
6249 }
6250
6251 if (Output.isFilename()) {
6252 CmdArgs.push_back("-o");
6253 CmdArgs.push_back(Output.getFilename());
6254 } else {
6255 assert(Output.isNothing() && "Invalid output.");
6256 }
6257
6258 if (!Args.hasArg(options::OPT_nostdlib) &&
6259 !Args.hasArg(options::OPT_nostartfiles)) {
6260 if (!Args.hasArg(options::OPT_shared)) {
6261 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6262 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006263 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006264 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6265 } else {
6266 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006267 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6268 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006269 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006270 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006271 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006272 }
6273
6274 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6275
6276 Args.AddAllArgs(CmdArgs, options::OPT_L);
6277 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6278 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006279 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006280
6281 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6282
6283 if (!Args.hasArg(options::OPT_nostdlib) &&
6284 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006285 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006286 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006287 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006288 if (!Args.hasArg(options::OPT_shared)) {
6289 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006290 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006291 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006292 }
David Chisnallf571cde2012-02-15 13:39:01 +00006293 }
6294
6295 if (!Args.hasArg(options::OPT_nostdlib) &&
6296 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006297 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006298 }
David Chisnall96de9932012-02-16 16:00:47 +00006299 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006300
Alexey Samsonov7811d192014-02-20 13:57:37 +00006301 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006302
6303 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006304 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006305 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006306}
6307
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006308void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006309 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006310 const InputInfoList &Inputs,
6311 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006312 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006313 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006314 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006315 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006316
Rafael Espindolacc126272014-02-28 01:55:21 +00006317 switch (getToolChain().getArch()) {
6318 case llvm::Triple::x86:
6319 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6320 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006321 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006322 break;
6323
6324 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006325 CmdArgs.push_back("-mppc");
6326 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006327 break;
6328
6329 case llvm::Triple::sparc:
6330 CmdArgs.push_back("-32");
6331 NeedsKPIC = true;
6332 break;
6333
6334 case llvm::Triple::sparcv9:
6335 CmdArgs.push_back("-64");
6336 CmdArgs.push_back("-Av9a");
6337 NeedsKPIC = true;
6338 break;
6339
6340 case llvm::Triple::mips64:
6341 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006342 StringRef CPUName;
6343 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006344 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006345
6346 CmdArgs.push_back("-mabi");
6347 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6348
6349 if (getToolChain().getArch() == llvm::Triple::mips64)
6350 CmdArgs.push_back("-EB");
6351 else
6352 CmdArgs.push_back("-EL");
6353
Rafael Espindolacc126272014-02-28 01:55:21 +00006354 NeedsKPIC = true;
6355 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006356 }
6357
Rafael Espindolacc126272014-02-28 01:55:21 +00006358 default:
6359 break;
6360 }
6361
6362 if (NeedsKPIC)
6363 addAssemblerKPIC(Args, CmdArgs);
6364
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006365 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6366 options::OPT_Xassembler);
6367
6368 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006369 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006370
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006371 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006372 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006373
6374 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006375 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006376 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006377}
6378
6379void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006380 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006381 const InputInfoList &Inputs,
6382 const ArgList &Args,
6383 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006384 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006385 ArgStringList CmdArgs;
6386
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006387 // Silence warning for "clang -g foo.o -o foo"
6388 Args.ClaimAllArgs(options::OPT_g_Group);
6389 // and "clang -emit-llvm foo.o -o foo"
6390 Args.ClaimAllArgs(options::OPT_emit_llvm);
6391 // and for "clang -w foo.o -o foo". Other warning options are already
6392 // handled somewhere else.
6393 Args.ClaimAllArgs(options::OPT_w);
6394
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006395 if (getToolChain().getArch() == llvm::Triple::mips64)
6396 CmdArgs.push_back("-EB");
6397 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6398 CmdArgs.push_back("-EL");
6399
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006400 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006401 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006402 CmdArgs.push_back("-e");
6403 CmdArgs.push_back("__start");
6404 }
6405
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006406 if (Args.hasArg(options::OPT_static)) {
6407 CmdArgs.push_back("-Bstatic");
6408 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006409 if (Args.hasArg(options::OPT_rdynamic))
6410 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006411 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006412 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006413 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006414 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006415 } else {
6416 CmdArgs.push_back("-dynamic-linker");
6417 CmdArgs.push_back("/usr/libexec/ld.so");
6418 }
6419 }
6420
Rafael Espindola044f7832013-06-05 04:28:55 +00006421 if (Args.hasArg(options::OPT_nopie))
6422 CmdArgs.push_back("-nopie");
6423
Daniel Dunbarb440f562010-08-02 02:38:21 +00006424 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006425 CmdArgs.push_back("-o");
6426 CmdArgs.push_back(Output.getFilename());
6427 } else {
6428 assert(Output.isNothing() && "Invalid output.");
6429 }
6430
6431 if (!Args.hasArg(options::OPT_nostdlib) &&
6432 !Args.hasArg(options::OPT_nostartfiles)) {
6433 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006434 if (Args.hasArg(options::OPT_pg))
6435 CmdArgs.push_back(Args.MakeArgString(
6436 getToolChain().GetFilePath("gcrt0.o")));
6437 else
6438 CmdArgs.push_back(Args.MakeArgString(
6439 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006440 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006441 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006442 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006443 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006444 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006445 }
6446 }
6447
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006448 std::string Triple = getToolChain().getTripleString();
6449 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006450 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006451 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006452 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006453
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006454 Args.AddAllArgs(CmdArgs, options::OPT_L);
6455 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6456 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006457 Args.AddAllArgs(CmdArgs, options::OPT_s);
6458 Args.AddAllArgs(CmdArgs, options::OPT_t);
6459 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6460 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006461
Daniel Dunbar54423b22010-09-17 00:24:54 +00006462 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006463
6464 if (!Args.hasArg(options::OPT_nostdlib) &&
6465 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006466 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006467 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006468 if (Args.hasArg(options::OPT_pg))
6469 CmdArgs.push_back("-lm_p");
6470 else
6471 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006472 }
6473
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006474 // FIXME: For some reason GCC passes -lgcc before adding
6475 // the default system libraries. Just mimic this for now.
6476 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006477
Eric Christopher17674ec2012-09-13 06:32:34 +00006478 if (Args.hasArg(options::OPT_pthread)) {
6479 if (!Args.hasArg(options::OPT_shared) &&
6480 Args.hasArg(options::OPT_pg))
6481 CmdArgs.push_back("-lpthread_p");
6482 else
6483 CmdArgs.push_back("-lpthread");
6484 }
6485
Chandler Carruth45661652011-12-17 22:32:42 +00006486 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006487 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006488 CmdArgs.push_back("-lc_p");
6489 else
6490 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006491 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006492
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006493 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006494 }
6495
6496 if (!Args.hasArg(options::OPT_nostdlib) &&
6497 !Args.hasArg(options::OPT_nostartfiles)) {
6498 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006499 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006500 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006501 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006502 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006503 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006504 }
6505
6506 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006507 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006508 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006509}
Ed Schoutene33194b2009-04-02 19:13:12 +00006510
Eli Friedman9fa28852012-08-08 23:57:20 +00006511void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6512 const InputInfo &Output,
6513 const InputInfoList &Inputs,
6514 const ArgList &Args,
6515 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006516 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006517 ArgStringList CmdArgs;
6518
6519 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6520 options::OPT_Xassembler);
6521
6522 CmdArgs.push_back("-o");
6523 CmdArgs.push_back(Output.getFilename());
6524
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006525 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006526 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006527
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006528 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006529 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006530}
6531
6532void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6533 const InputInfo &Output,
6534 const InputInfoList &Inputs,
6535 const ArgList &Args,
6536 const char *LinkingOutput) const {
6537 const Driver &D = getToolChain().getDriver();
6538 ArgStringList CmdArgs;
6539
6540 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6541 (!Args.hasArg(options::OPT_shared))) {
6542 CmdArgs.push_back("-e");
6543 CmdArgs.push_back("__start");
6544 }
6545
6546 if (Args.hasArg(options::OPT_static)) {
6547 CmdArgs.push_back("-Bstatic");
6548 } else {
6549 if (Args.hasArg(options::OPT_rdynamic))
6550 CmdArgs.push_back("-export-dynamic");
6551 CmdArgs.push_back("--eh-frame-hdr");
6552 CmdArgs.push_back("-Bdynamic");
6553 if (Args.hasArg(options::OPT_shared)) {
6554 CmdArgs.push_back("-shared");
6555 } else {
6556 CmdArgs.push_back("-dynamic-linker");
6557 CmdArgs.push_back("/usr/libexec/ld.so");
6558 }
6559 }
6560
6561 if (Output.isFilename()) {
6562 CmdArgs.push_back("-o");
6563 CmdArgs.push_back(Output.getFilename());
6564 } else {
6565 assert(Output.isNothing() && "Invalid output.");
6566 }
6567
6568 if (!Args.hasArg(options::OPT_nostdlib) &&
6569 !Args.hasArg(options::OPT_nostartfiles)) {
6570 if (!Args.hasArg(options::OPT_shared)) {
6571 if (Args.hasArg(options::OPT_pg))
6572 CmdArgs.push_back(Args.MakeArgString(
6573 getToolChain().GetFilePath("gcrt0.o")));
6574 else
6575 CmdArgs.push_back(Args.MakeArgString(
6576 getToolChain().GetFilePath("crt0.o")));
6577 CmdArgs.push_back(Args.MakeArgString(
6578 getToolChain().GetFilePath("crtbegin.o")));
6579 } else {
6580 CmdArgs.push_back(Args.MakeArgString(
6581 getToolChain().GetFilePath("crtbeginS.o")));
6582 }
6583 }
6584
6585 Args.AddAllArgs(CmdArgs, options::OPT_L);
6586 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6587 Args.AddAllArgs(CmdArgs, options::OPT_e);
6588
6589 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6590
6591 if (!Args.hasArg(options::OPT_nostdlib) &&
6592 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006593 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006594 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6595 if (Args.hasArg(options::OPT_pg))
6596 CmdArgs.push_back("-lm_p");
6597 else
6598 CmdArgs.push_back("-lm");
6599 }
6600
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006601 if (Args.hasArg(options::OPT_pthread)) {
6602 if (!Args.hasArg(options::OPT_shared) &&
6603 Args.hasArg(options::OPT_pg))
6604 CmdArgs.push_back("-lpthread_p");
6605 else
6606 CmdArgs.push_back("-lpthread");
6607 }
6608
Eli Friedman9fa28852012-08-08 23:57:20 +00006609 if (!Args.hasArg(options::OPT_shared)) {
6610 if (Args.hasArg(options::OPT_pg))
6611 CmdArgs.push_back("-lc_p");
6612 else
6613 CmdArgs.push_back("-lc");
6614 }
6615
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006616 StringRef MyArch;
6617 switch (getToolChain().getTriple().getArch()) {
6618 case llvm::Triple::arm:
6619 MyArch = "arm";
6620 break;
6621 case llvm::Triple::x86:
6622 MyArch = "i386";
6623 break;
6624 case llvm::Triple::x86_64:
6625 MyArch = "amd64";
6626 break;
6627 default:
6628 llvm_unreachable("Unsupported architecture");
6629 }
6630 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006631 }
6632
6633 if (!Args.hasArg(options::OPT_nostdlib) &&
6634 !Args.hasArg(options::OPT_nostartfiles)) {
6635 if (!Args.hasArg(options::OPT_shared))
6636 CmdArgs.push_back(Args.MakeArgString(
6637 getToolChain().GetFilePath("crtend.o")));
6638 else
6639 CmdArgs.push_back(Args.MakeArgString(
6640 getToolChain().GetFilePath("crtendS.o")));
6641 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006642
6643 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006644 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006645 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006646}
6647
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006648void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006649 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006650 const InputInfoList &Inputs,
6651 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006652 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006653 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006654 ArgStringList CmdArgs;
6655
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006656 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6657 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006658 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006659 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006660 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006661 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006662 else if (getToolChain().getArch() == llvm::Triple::mips ||
6663 getToolChain().getArch() == llvm::Triple::mipsel ||
6664 getToolChain().getArch() == llvm::Triple::mips64 ||
6665 getToolChain().getArch() == llvm::Triple::mips64el) {
6666 StringRef CPUName;
6667 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006668 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006669
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006670 CmdArgs.push_back("-march");
6671 CmdArgs.push_back(CPUName.data());
6672
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006673 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006674 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006675
6676 if (getToolChain().getArch() == llvm::Triple::mips ||
6677 getToolChain().getArch() == llvm::Triple::mips64)
6678 CmdArgs.push_back("-EB");
6679 else
6680 CmdArgs.push_back("-EL");
6681
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006682 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006683 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006684 getToolChain().getArch() == llvm::Triple::armeb ||
6685 getToolChain().getArch() == llvm::Triple::thumb ||
6686 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006687 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006688 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006689 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6690
6691 if (FloatABI == "hard") {
6692 CmdArgs.push_back("-mfpu=vfp");
6693 } else {
6694 CmdArgs.push_back("-mfpu=softvfp");
6695 }
6696
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006697 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006698 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006699 case llvm::Triple::GNUEABI:
6700 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006701 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006702 break;
6703
6704 default:
6705 CmdArgs.push_back("-matpcs");
6706 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006707 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006708 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006709 if (getToolChain().getArch() == llvm::Triple::sparc)
6710 CmdArgs.push_back("-Av8plusa");
6711 else
6712 CmdArgs.push_back("-Av9a");
6713
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006714 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006715 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006716
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006717 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6718 options::OPT_Xassembler);
6719
6720 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006721 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006722
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006723 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006724 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006725
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006726 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006727 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006728}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006729
6730void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006731 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006732 const InputInfoList &Inputs,
6733 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006734 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006735 const toolchains::FreeBSD& ToolChain =
6736 static_cast<const toolchains::FreeBSD&>(getToolChain());
6737 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006738 const bool IsPIE =
6739 !Args.hasArg(options::OPT_shared) &&
6740 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006741 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006742
6743 // Silence warning for "clang -g foo.o -o foo"
6744 Args.ClaimAllArgs(options::OPT_g_Group);
6745 // and "clang -emit-llvm foo.o -o foo"
6746 Args.ClaimAllArgs(options::OPT_emit_llvm);
6747 // and for "clang -w foo.o -o foo". Other warning options are already
6748 // handled somewhere else.
6749 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006750
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006751 if (!D.SysRoot.empty())
6752 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6753
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006754 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006755 CmdArgs.push_back("-pie");
6756
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006757 if (Args.hasArg(options::OPT_static)) {
6758 CmdArgs.push_back("-Bstatic");
6759 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006760 if (Args.hasArg(options::OPT_rdynamic))
6761 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006762 CmdArgs.push_back("--eh-frame-hdr");
6763 if (Args.hasArg(options::OPT_shared)) {
6764 CmdArgs.push_back("-Bshareable");
6765 } else {
6766 CmdArgs.push_back("-dynamic-linker");
6767 CmdArgs.push_back("/libexec/ld-elf.so.1");
6768 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006769 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6770 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006771 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6772 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6773 CmdArgs.push_back("--hash-style=both");
6774 }
6775 }
6776 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006777 }
6778
6779 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6780 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006781 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006782 CmdArgs.push_back("-m");
6783 CmdArgs.push_back("elf_i386_fbsd");
6784 }
6785
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006786 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006787 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006788 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006789 }
6790
Daniel Dunbarb440f562010-08-02 02:38:21 +00006791 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006792 CmdArgs.push_back("-o");
6793 CmdArgs.push_back(Output.getFilename());
6794 } else {
6795 assert(Output.isNothing() && "Invalid output.");
6796 }
6797
6798 if (!Args.hasArg(options::OPT_nostdlib) &&
6799 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00006800 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006801 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006802 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00006803 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006804 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006805 crt1 = "Scrt1.o";
6806 else
6807 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006808 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006809 if (crt1)
6810 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6811
6812 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6813
Craig Topper92fc2df2014-05-17 16:56:41 +00006814 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00006815 if (Args.hasArg(options::OPT_static))
6816 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006817 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006818 crtbegin = "crtbeginS.o";
6819 else
6820 crtbegin = "crtbegin.o";
6821
6822 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006823 }
6824
6825 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00006826 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006827 for (const auto &Path : Paths)
6828 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006829 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6830 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00006831 Args.AddAllArgs(CmdArgs, options::OPT_s);
6832 Args.AddAllArgs(CmdArgs, options::OPT_t);
6833 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6834 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006835
Alp Tokerce365ca2013-12-02 12:43:03 +00006836 if (D.IsUsingLTO(Args))
6837 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00006838
Alexey Samsonov52550342014-09-15 19:58:40 +00006839 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00006840 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006841
6842 if (!Args.hasArg(options::OPT_nostdlib) &&
6843 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006844 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006845 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00006846 if (Args.hasArg(options::OPT_pg))
6847 CmdArgs.push_back("-lm_p");
6848 else
6849 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00006850 }
Alexey Samsonov52550342014-09-15 19:58:40 +00006851 if (NeedsSanitizerDeps)
6852 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006853 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6854 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00006855 if (Args.hasArg(options::OPT_pg))
6856 CmdArgs.push_back("-lgcc_p");
6857 else
6858 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006859 if (Args.hasArg(options::OPT_static)) {
6860 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006861 } else if (Args.hasArg(options::OPT_pg)) {
6862 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006863 } else {
6864 CmdArgs.push_back("--as-needed");
6865 CmdArgs.push_back("-lgcc_s");
6866 CmdArgs.push_back("--no-as-needed");
6867 }
6868
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006869 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006870 if (Args.hasArg(options::OPT_pg))
6871 CmdArgs.push_back("-lpthread_p");
6872 else
6873 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006874 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006875
Roman Divacky66f22762011-02-10 16:59:40 +00006876 if (Args.hasArg(options::OPT_pg)) {
6877 if (Args.hasArg(options::OPT_shared))
6878 CmdArgs.push_back("-lc");
6879 else
6880 CmdArgs.push_back("-lc_p");
6881 CmdArgs.push_back("-lgcc_p");
6882 } else {
6883 CmdArgs.push_back("-lc");
6884 CmdArgs.push_back("-lgcc");
6885 }
6886
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006887 if (Args.hasArg(options::OPT_static)) {
6888 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006889 } else if (Args.hasArg(options::OPT_pg)) {
6890 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006891 } else {
6892 CmdArgs.push_back("--as-needed");
6893 CmdArgs.push_back("-lgcc_s");
6894 CmdArgs.push_back("--no-as-needed");
6895 }
6896 }
6897
6898 if (!Args.hasArg(options::OPT_nostdlib) &&
6899 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006900 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006901 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006902 else
6903 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006904 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006905 }
6906
Alexey Samsonov7811d192014-02-20 13:57:37 +00006907 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006908
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006909 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006910 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006911 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006912}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006913
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006914void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6915 const InputInfo &Output,
6916 const InputInfoList &Inputs,
6917 const ArgList &Args,
6918 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006919 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006920 ArgStringList CmdArgs;
6921
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006922 // GNU as needs different flags for creating the correct output format
6923 // on architectures with different ABIs or optional feature sets.
6924 switch (getToolChain().getArch()) {
6925 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006926 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006927 break;
6928 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006929 case llvm::Triple::armeb:
6930 case llvm::Triple::thumb:
6931 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00006932 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006933 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006934 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006935 }
6936
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006937 case llvm::Triple::mips:
6938 case llvm::Triple::mipsel:
6939 case llvm::Triple::mips64:
6940 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006941 StringRef CPUName;
6942 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006943 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006944
6945 CmdArgs.push_back("-march");
6946 CmdArgs.push_back(CPUName.data());
6947
6948 CmdArgs.push_back("-mabi");
6949 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6950
6951 if (getToolChain().getArch() == llvm::Triple::mips ||
6952 getToolChain().getArch() == llvm::Triple::mips64)
6953 CmdArgs.push_back("-EB");
6954 else
6955 CmdArgs.push_back("-EL");
6956
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006957 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006958 break;
6959 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006960
6961 case llvm::Triple::sparc:
6962 CmdArgs.push_back("-32");
6963 addAssemblerKPIC(Args, CmdArgs);
6964 break;
6965
6966 case llvm::Triple::sparcv9:
6967 CmdArgs.push_back("-64");
6968 CmdArgs.push_back("-Av9");
6969 addAssemblerKPIC(Args, CmdArgs);
6970 break;
6971
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006972 default:
6973 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006974 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006975
6976 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6977 options::OPT_Xassembler);
6978
6979 CmdArgs.push_back("-o");
6980 CmdArgs.push_back(Output.getFilename());
6981
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006982 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006983 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006984
David Chisnallddbd68f2011-09-27 22:03:18 +00006985 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00006986 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006987}
6988
6989void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6990 const InputInfo &Output,
6991 const InputInfoList &Inputs,
6992 const ArgList &Args,
6993 const char *LinkingOutput) const {
6994 const Driver &D = getToolChain().getDriver();
6995 ArgStringList CmdArgs;
6996
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006997 if (!D.SysRoot.empty())
6998 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6999
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007000 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007001 if (Args.hasArg(options::OPT_static)) {
7002 CmdArgs.push_back("-Bstatic");
7003 } else {
7004 if (Args.hasArg(options::OPT_rdynamic))
7005 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007006 if (Args.hasArg(options::OPT_shared)) {
7007 CmdArgs.push_back("-Bshareable");
7008 } else {
7009 CmdArgs.push_back("-dynamic-linker");
7010 CmdArgs.push_back("/libexec/ld.elf_so");
7011 }
7012 }
7013
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007014 // Many NetBSD architectures support more than one ABI.
7015 // Determine the correct emulation for ld.
7016 switch (getToolChain().getArch()) {
7017 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007018 CmdArgs.push_back("-m");
7019 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007020 break;
7021 case llvm::Triple::arm:
7022 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007023 CmdArgs.push_back("-m");
7024 switch (getToolChain().getTriple().getEnvironment()) {
7025 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007026 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007027 CmdArgs.push_back("armelf_nbsd_eabi");
7028 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007029 case llvm::Triple::EABIHF:
7030 case llvm::Triple::GNUEABIHF:
7031 CmdArgs.push_back("armelf_nbsd_eabihf");
7032 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007033 default:
7034 CmdArgs.push_back("armelf_nbsd");
7035 break;
7036 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007037 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007038 case llvm::Triple::armeb:
7039 case llvm::Triple::thumbeb:
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007040 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007041 CmdArgs.push_back("-m");
7042 switch (getToolChain().getTriple().getEnvironment()) {
7043 case llvm::Triple::EABI:
7044 case llvm::Triple::GNUEABI:
7045 CmdArgs.push_back("armelfb_nbsd_eabi");
7046 break;
7047 case llvm::Triple::EABIHF:
7048 case llvm::Triple::GNUEABIHF:
7049 CmdArgs.push_back("armelfb_nbsd_eabihf");
7050 break;
7051 default:
7052 CmdArgs.push_back("armelfb_nbsd");
7053 break;
7054 }
7055 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007056 case llvm::Triple::mips64:
7057 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007058 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007059 CmdArgs.push_back("-m");
7060 if (getToolChain().getArch() == llvm::Triple::mips64)
7061 CmdArgs.push_back("elf32btsmip");
7062 else
7063 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007064 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007065 CmdArgs.push_back("-m");
7066 if (getToolChain().getArch() == llvm::Triple::mips64)
7067 CmdArgs.push_back("elf64btsmip");
7068 else
7069 CmdArgs.push_back("elf64ltsmip");
7070 }
7071 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007072 case llvm::Triple::ppc:
7073 CmdArgs.push_back("-m");
7074 CmdArgs.push_back("elf32ppc_nbsd");
7075 break;
7076
7077 case llvm::Triple::ppc64:
7078 case llvm::Triple::ppc64le:
7079 CmdArgs.push_back("-m");
7080 CmdArgs.push_back("elf64ppc");
7081 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007082
7083 case llvm::Triple::sparc:
7084 CmdArgs.push_back("-m");
7085 CmdArgs.push_back("elf32_sparc");
7086 break;
7087
7088 case llvm::Triple::sparcv9:
7089 CmdArgs.push_back("-m");
7090 CmdArgs.push_back("elf64_sparc");
7091 break;
7092
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007093 default:
7094 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007095 }
7096
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007097 if (Output.isFilename()) {
7098 CmdArgs.push_back("-o");
7099 CmdArgs.push_back(Output.getFilename());
7100 } else {
7101 assert(Output.isNothing() && "Invalid output.");
7102 }
7103
7104 if (!Args.hasArg(options::OPT_nostdlib) &&
7105 !Args.hasArg(options::OPT_nostartfiles)) {
7106 if (!Args.hasArg(options::OPT_shared)) {
7107 CmdArgs.push_back(Args.MakeArgString(
7108 getToolChain().GetFilePath("crt0.o")));
7109 CmdArgs.push_back(Args.MakeArgString(
7110 getToolChain().GetFilePath("crti.o")));
7111 CmdArgs.push_back(Args.MakeArgString(
7112 getToolChain().GetFilePath("crtbegin.o")));
7113 } else {
7114 CmdArgs.push_back(Args.MakeArgString(
7115 getToolChain().GetFilePath("crti.o")));
7116 CmdArgs.push_back(Args.MakeArgString(
7117 getToolChain().GetFilePath("crtbeginS.o")));
7118 }
7119 }
7120
7121 Args.AddAllArgs(CmdArgs, options::OPT_L);
7122 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7123 Args.AddAllArgs(CmdArgs, options::OPT_e);
7124 Args.AddAllArgs(CmdArgs, options::OPT_s);
7125 Args.AddAllArgs(CmdArgs, options::OPT_t);
7126 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7127 Args.AddAllArgs(CmdArgs, options::OPT_r);
7128
7129 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7130
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007131 unsigned Major, Minor, Micro;
7132 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7133 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007134 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007135 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007136 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007137 case llvm::Triple::arm:
7138 case llvm::Triple::armeb:
7139 case llvm::Triple::thumb:
7140 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007141 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007142 case llvm::Triple::ppc64:
7143 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007144 case llvm::Triple::x86:
7145 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007146 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007147 break;
7148 default:
7149 break;
7150 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007151 }
7152
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007153 if (!Args.hasArg(options::OPT_nostdlib) &&
7154 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007155 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007156 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7157 CmdArgs.push_back("-lm");
7158 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007159 if (Args.hasArg(options::OPT_pthread))
7160 CmdArgs.push_back("-lpthread");
7161 CmdArgs.push_back("-lc");
7162
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007163 if (useLibgcc) {
7164 if (Args.hasArg(options::OPT_static)) {
7165 // libgcc_eh depends on libc, so resolve as much as possible,
7166 // pull in any new requirements from libc and then get the rest
7167 // of libgcc.
7168 CmdArgs.push_back("-lgcc_eh");
7169 CmdArgs.push_back("-lc");
7170 CmdArgs.push_back("-lgcc");
7171 } else {
7172 CmdArgs.push_back("-lgcc");
7173 CmdArgs.push_back("--as-needed");
7174 CmdArgs.push_back("-lgcc_s");
7175 CmdArgs.push_back("--no-as-needed");
7176 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007177 }
7178 }
7179
7180 if (!Args.hasArg(options::OPT_nostdlib) &&
7181 !Args.hasArg(options::OPT_nostartfiles)) {
7182 if (!Args.hasArg(options::OPT_shared))
7183 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7184 "crtend.o")));
7185 else
7186 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7187 "crtendS.o")));
7188 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7189 "crtn.o")));
7190 }
7191
Alexey Samsonov7811d192014-02-20 13:57:37 +00007192 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007193
Logan Chieneb9162f2014-06-26 14:23:45 +00007194 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007195 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007196}
7197
Thomas Schwinge4e555262013-03-28 19:04:25 +00007198void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7199 const InputInfo &Output,
7200 const InputInfoList &Inputs,
7201 const ArgList &Args,
7202 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007203 claimNoWarnArgs(Args);
7204
Rafael Espindola92b00932010-08-10 00:25:48 +00007205 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007206 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007207
7208 // Add --32/--64 to make sure we get the format we want.
7209 // This is incomplete
7210 if (getToolChain().getArch() == llvm::Triple::x86) {
7211 CmdArgs.push_back("--32");
7212 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
Zinovy Nis1db95732014-07-10 15:27:19 +00007213 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7214 CmdArgs.push_back("--x32");
7215 else
7216 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00007217 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
7218 CmdArgs.push_back("-a32");
7219 CmdArgs.push_back("-mppc");
7220 CmdArgs.push_back("-many");
7221 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
7222 CmdArgs.push_back("-a64");
7223 CmdArgs.push_back("-mppc64");
7224 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00007225 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
7226 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007227 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007228 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007229 CmdArgs.push_back("-mlittle-endian");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007230 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
7231 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007232 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007233 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007234 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
7235 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007236 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007237 NeedsKPIC = true;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007238 } else if (getToolChain().getArch() == llvm::Triple::arm ||
7239 getToolChain().getArch() == llvm::Triple::armeb) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00007240 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00007241 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
7242 CmdArgs.push_back("-mfpu=neon");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007243 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
7244 MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
Bernard Ogdena58ef052013-10-24 18:32:41 +00007245 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007246
Tim Northover9c7e0352013-12-12 11:55:52 +00007247 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
7248 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007249 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007250
7251 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007252
7253 // FIXME: remove krait check when GNU tools support krait cpu
7254 // for now replace it with -march=armv7-a to avoid a lower
7255 // march from being picked in the absence of a cpu flag.
7256 Arg *A;
7257 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
7258 StringRef(A->getValue()) == "krait")
7259 CmdArgs.push_back("-march=armv7-a");
7260 else
7261 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007262 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007263 } else if (getToolChain().getArch() == llvm::Triple::mips ||
7264 getToolChain().getArch() == llvm::Triple::mipsel ||
7265 getToolChain().getArch() == llvm::Triple::mips64 ||
7266 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007267 StringRef CPUName;
7268 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007269 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007270 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007271
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007272 CmdArgs.push_back("-march");
7273 CmdArgs.push_back(CPUName.data());
7274
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007275 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007276 CmdArgs.push_back(ABIName.data());
7277
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007278 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7279 // or -mshared (not implemented) is in effect.
7280 bool IsPicOrPie = false;
7281 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7282 options::OPT_fpic, options::OPT_fno_pic,
7283 options::OPT_fPIE, options::OPT_fno_PIE,
7284 options::OPT_fpie, options::OPT_fno_pie)) {
7285 if (A->getOption().matches(options::OPT_fPIC) ||
7286 A->getOption().matches(options::OPT_fpic) ||
7287 A->getOption().matches(options::OPT_fPIE) ||
7288 A->getOption().matches(options::OPT_fpie))
7289 IsPicOrPie = true;
7290 }
7291 if (!IsPicOrPie)
7292 CmdArgs.push_back("-mno-shared");
7293
Daniel Sanders379d44b2014-07-16 11:52:23 +00007294 // LLVM doesn't support -mplt yet and acts as if it is always given.
7295 // However, -mplt has no effect with the N64 ABI.
7296 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007297
7298 if (getToolChain().getArch() == llvm::Triple::mips ||
7299 getToolChain().getArch() == llvm::Triple::mips64)
7300 CmdArgs.push_back("-EB");
7301 else
7302 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007303
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007304 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7305 if (StringRef(A->getValue()) == "2008")
7306 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7307 }
7308
Daniel Sanders379d44b2014-07-16 11:52:23 +00007309 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7310 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7311 options::OPT_mfp64)) {
7312 A->claim();
7313 A->render(Args, CmdArgs);
7314 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7315 ABIName))
7316 CmdArgs.push_back("-mfpxx");
7317
7318 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7319 // -mno-mips16 is actually -no-mips16.
7320 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7321 options::OPT_mno_mips16)) {
7322 if (A->getOption().matches(options::OPT_mips16)) {
7323 A->claim();
7324 A->render(Args, CmdArgs);
7325 } else {
7326 A->claim();
7327 CmdArgs.push_back("-no-mips16");
7328 }
7329 }
7330
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007331 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7332 options::OPT_mno_micromips);
7333 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7334 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7335
Simon Atanasyanbd986632013-11-26 11:58:04 +00007336 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7337 // Do not use AddLastArg because not all versions of MIPS assembler
7338 // support -mmsa / -mno-msa options.
7339 if (A->getOption().matches(options::OPT_mmsa))
7340 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7341 }
7342
Daniel Sanders379d44b2014-07-16 11:52:23 +00007343 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7344 options::OPT_msoft_float);
7345
7346 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7347 options::OPT_mno_odd_spreg);
7348
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007349 NeedsKPIC = true;
7350 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
7351 // Always pass an -march option, since our default of z10 is later
7352 // than the GNU assembler's default.
7353 StringRef CPUName = getSystemZTargetCPU(Args);
7354 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
7355 }
7356
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007357 if (NeedsKPIC)
7358 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007359
7360 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7361 options::OPT_Xassembler);
7362
7363 CmdArgs.push_back("-o");
7364 CmdArgs.push_back(Output.getFilename());
7365
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007366 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007367 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007368
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007369 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007370 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007371
7372 // Handle the debug info splitting at object creation time if we're
7373 // creating an object.
7374 // TODO: Currently only works on linux with newer objcopy.
7375 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007376 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007377 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
7378 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00007379}
7380
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007381static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007382 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007383 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007384 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7385 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007386 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007387 CmdArgs.push_back("-lgcc");
7388
Logan Chien3d3373c2012-11-19 12:04:11 +00007389 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007390 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007391 CmdArgs.push_back("-lgcc");
7392 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007393 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007394 CmdArgs.push_back("--as-needed");
7395 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007396 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007397 CmdArgs.push_back("--no-as-needed");
7398 }
7399
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007400 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007401 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007402 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007403 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007404
7405 // According to Android ABI, we have to link with libdl if we are
7406 // linking with non-static libgcc.
7407 //
7408 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7409 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7410 if (isAndroid && !StaticLibgcc)
7411 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007412}
7413
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007414static std::string getLinuxDynamicLinker(const ArgList &Args,
7415 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007416 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7417 if (ToolChain.getTriple().isArch64Bit())
7418 return "/system/bin/linker64";
7419 else
7420 return "/system/bin/linker";
7421 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7422 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007423 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007424 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007425 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007426 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007427 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007428 else if (ToolChain.getArch() == llvm::Triple::arm ||
7429 ToolChain.getArch() == llvm::Triple::thumb) {
7430 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7431 return "/lib/ld-linux-armhf.so.3";
7432 else
7433 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007434 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7435 ToolChain.getArch() == llvm::Triple::thumbeb) {
7436 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7437 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7438 else
7439 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007440 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007441 ToolChain.getArch() == llvm::Triple::mipsel ||
7442 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007443 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007444 StringRef CPUName;
7445 StringRef ABIName;
7446 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7447 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7448
7449 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7450 .Case("o32", "/lib")
7451 .Case("n32", "/lib32")
7452 .Case("n64", "/lib64")
7453 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007454 StringRef LibName;
7455 if (mips::isUCLibc(Args))
7456 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7457 else
7458 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007459
7460 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007461 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7462 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007463 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7464 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7465 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007466 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007467 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7468 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7469 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007470 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007471 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7472 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007473 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7474 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007475 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7476 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7477 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007478 else
7479 return "/lib64/ld-linux-x86-64.so.2";
7480}
7481
Renato Golinc4b49242014-02-13 10:01:16 +00007482static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007483 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007484 // Make use of compiler-rt if --rtlib option is used
7485 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7486
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007487 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007488 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007489 switch (TC.getTriple().getOS()) {
7490 default: llvm_unreachable("unsupported OS");
7491 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007492 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007493 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007494 break;
7495 }
Renato Golinc4b49242014-02-13 10:01:16 +00007496 break;
7497 case ToolChain::RLT_Libgcc:
7498 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7499 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007500 }
7501}
7502
Rafael Espindola1e085772014-08-15 17:14:35 +00007503static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7504 switch (T.getArch()) {
7505 case llvm::Triple::x86:
7506 return "elf_i386";
7507 case llvm::Triple::aarch64:
7508 return "aarch64linux";
7509 case llvm::Triple::aarch64_be:
7510 return "aarch64_be_linux";
7511 case llvm::Triple::arm:
7512 case llvm::Triple::thumb:
7513 return "armelf_linux_eabi";
7514 case llvm::Triple::armeb:
7515 case llvm::Triple::thumbeb:
7516 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7517 case llvm::Triple::ppc:
7518 return "elf32ppclinux";
7519 case llvm::Triple::ppc64:
7520 return "elf64ppc";
7521 case llvm::Triple::ppc64le:
7522 return "elf64lppc";
7523 case llvm::Triple::sparc:
7524 return "elf32_sparc";
7525 case llvm::Triple::sparcv9:
7526 return "elf64_sparc";
7527 case llvm::Triple::mips:
7528 return "elf32btsmip";
7529 case llvm::Triple::mipsel:
7530 return "elf32ltsmip";
7531 case llvm::Triple::mips64:
7532 if (mips::hasMipsAbiArg(Args, "n32"))
7533 return "elf32btsmipn32";
7534 return "elf64btsmip";
7535 case llvm::Triple::mips64el:
7536 if (mips::hasMipsAbiArg(Args, "n32"))
7537 return "elf32ltsmipn32";
7538 return "elf64ltsmip";
7539 case llvm::Triple::systemz:
7540 return "elf64_s390";
7541 case llvm::Triple::x86_64:
7542 if (T.getEnvironment() == llvm::Triple::GNUX32)
7543 return "elf32_x86_64";
7544 return "elf_x86_64";
7545 default:
7546 llvm_unreachable("Unexpected arch");
7547 }
7548}
7549
Thomas Schwinge4e555262013-03-28 19:04:25 +00007550void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7551 const InputInfo &Output,
7552 const InputInfoList &Inputs,
7553 const ArgList &Args,
7554 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007555 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007556 static_cast<const toolchains::Linux&>(getToolChain());
7557 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007558 const bool isAndroid =
7559 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007560 const bool IsPIE =
7561 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007562 !Args.hasArg(options::OPT_static) &&
7563 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault() ||
7564 // On Android every code is PIC so every executable is PIE
Alexey Volkov6468f5d2014-04-29 12:07:34 +00007565 // Cannot use isPIEDefault here since otherwise
7566 // PIE only logic will be enabled during compilation
Alexey Volkov06921032014-04-29 10:25:20 +00007567 isAndroid);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007568
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007569 ArgStringList CmdArgs;
7570
Rafael Espindolad1002f62010-11-15 18:28:16 +00007571 // Silence warning for "clang -g foo.o -o foo"
7572 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007573 // and "clang -emit-llvm foo.o -o foo"
7574 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007575 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007576 // handled somewhere else.
7577 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007578
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007579 if (!D.SysRoot.empty())
7580 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007581
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007582 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007583 CmdArgs.push_back("-pie");
7584
Rafael Espindola1c76c592010-11-07 22:57:16 +00007585 if (Args.hasArg(options::OPT_rdynamic))
7586 CmdArgs.push_back("-export-dynamic");
7587
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007588 if (Args.hasArg(options::OPT_s))
7589 CmdArgs.push_back("-s");
7590
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007591 if (ToolChain.getArch() == llvm::Triple::armeb ||
7592 ToolChain.getArch() == llvm::Triple::thumbeb)
7593 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
7594
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007595 for (const auto &Opt : ToolChain.ExtraOpts)
7596 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007597
7598 if (!Args.hasArg(options::OPT_static)) {
7599 CmdArgs.push_back("--eh-frame-hdr");
7600 }
7601
7602 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007603 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007604
7605 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007606 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007607 ToolChain.getArch() == llvm::Triple::armeb ||
7608 ToolChain.getArch() == llvm::Triple::thumb ||
7609 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007610 CmdArgs.push_back("-Bstatic");
7611 else
7612 CmdArgs.push_back("-static");
7613 } else if (Args.hasArg(options::OPT_shared)) {
7614 CmdArgs.push_back("-shared");
7615 }
7616
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007617 if (ToolChain.getArch() == llvm::Triple::arm ||
7618 ToolChain.getArch() == llvm::Triple::armeb ||
7619 ToolChain.getArch() == llvm::Triple::thumb ||
7620 ToolChain.getArch() == llvm::Triple::thumbeb ||
7621 (!Args.hasArg(options::OPT_static) &&
7622 !Args.hasArg(options::OPT_shared))) {
7623 CmdArgs.push_back("-dynamic-linker");
7624 CmdArgs.push_back(Args.MakeArgString(
7625 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7626 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007627
Ulrich Weigandf32a1ac2015-01-29 19:08:51 +00007628 // Work around a bug in GNU ld (and gold) linker versions up to 2.25
7629 // that may mis-optimize code generated by this version of clang/LLVM
7630 // to access general-dynamic or local-dynamic TLS variables.
7631 if (ToolChain.getArch() == llvm::Triple::ppc64 ||
7632 ToolChain.getArch() == llvm::Triple::ppc64le)
7633 CmdArgs.push_back("--no-tls-optimize");
7634
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007635 CmdArgs.push_back("-o");
7636 CmdArgs.push_back(Output.getFilename());
7637
Rafael Espindola81937ec2010-12-01 01:52:43 +00007638 if (!Args.hasArg(options::OPT_nostdlib) &&
7639 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007640 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007641 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007642 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007643 if (Args.hasArg(options::OPT_pg))
7644 crt1 = "gcrt1.o";
7645 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007646 crt1 = "Scrt1.o";
7647 else
7648 crt1 = "crt1.o";
7649 }
7650 if (crt1)
7651 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007652
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007653 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7654 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007655
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007656 const char *crtbegin;
7657 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007658 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007659 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007660 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007661 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007662 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007663 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007664 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007665 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007666
7667 // Add crtfastmath.o if available and fast math is enabled.
7668 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007669 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007670
7671 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007672 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007673
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007674 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007675
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007676 for (const auto &Path : Paths)
7677 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007678
Alp Tokerce365ca2013-12-02 12:43:03 +00007679 if (D.IsUsingLTO(Args))
7680 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007681
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007682 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7683 CmdArgs.push_back("--no-demangle");
7684
Alexey Samsonov52550342014-09-15 19:58:40 +00007685 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007686 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007687 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007688 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007689
Hans Wennborg70850d82013-07-18 20:29:38 +00007690 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007691 !Args.hasArg(options::OPT_nostdlib) &&
7692 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007693 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7694 !Args.hasArg(options::OPT_static);
7695 if (OnlyLibstdcxxStatic)
7696 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007697 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007698 if (OnlyLibstdcxxStatic)
7699 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007700 CmdArgs.push_back("-lm");
7701 }
7702
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007703 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007704 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7705 if (Args.hasArg(options::OPT_static))
7706 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007707
Alexey Samsonov52550342014-09-15 19:58:40 +00007708 if (NeedsSanitizerDeps)
7709 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
7710
Alexey Bataev186b28a2014-03-06 05:43:53 +00007711 LibOpenMP UsedOpenMPLib = LibUnknown;
7712 if (Args.hasArg(options::OPT_fopenmp)) {
7713 UsedOpenMPLib = LibGOMP;
7714 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7715 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7716 .Case("libgomp", LibGOMP)
7717 .Case("libiomp5", LibIOMP5)
7718 .Default(LibUnknown);
7719 if (UsedOpenMPLib == LibUnknown)
7720 D.Diag(diag::err_drv_unsupported_option_argument)
7721 << A->getOption().getName() << A->getValue();
7722 }
7723 switch (UsedOpenMPLib) {
7724 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007725 CmdArgs.push_back("-lgomp");
7726
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007727 // FIXME: Exclude this for platforms with libgomp that don't require
7728 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007729 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007730 break;
7731 case LibIOMP5:
7732 CmdArgs.push_back("-liomp5");
7733 break;
7734 case LibUnknown:
7735 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007736 }
Renato Golinc4b49242014-02-13 10:01:16 +00007737 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007738
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007739 if ((Args.hasArg(options::OPT_pthread) ||
7740 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7741 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007742 CmdArgs.push_back("-lpthread");
7743
7744 CmdArgs.push_back("-lc");
7745
7746 if (Args.hasArg(options::OPT_static))
7747 CmdArgs.push_back("--end-group");
7748 else
Renato Golinc4b49242014-02-13 10:01:16 +00007749 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007750 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007751
Rafael Espindola81937ec2010-12-01 01:52:43 +00007752 if (!Args.hasArg(options::OPT_nostartfiles)) {
7753 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007754 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007755 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007756 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007757 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007758 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007759 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007760
Rafael Espindola81937ec2010-12-01 01:52:43 +00007761 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007762 if (!isAndroid)
7763 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007764 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007765 }
7766
David Blaikiec11bf802014-09-04 16:04:28 +00007767 C.addCommand(
7768 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00007769}
7770
Chris Lattner3e2ee142010-07-07 16:01:42 +00007771void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007772 const InputInfo &Output,
7773 const InputInfoList &Inputs,
7774 const ArgList &Args,
7775 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007776 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007777 ArgStringList CmdArgs;
7778
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007779 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007780
7781 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007782 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007783
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007784 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007785 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007786
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007787 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007788 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007789}
7790
7791void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007792 const InputInfo &Output,
7793 const InputInfoList &Inputs,
7794 const ArgList &Args,
7795 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007796 const Driver &D = getToolChain().getDriver();
7797 ArgStringList CmdArgs;
7798
Daniel Dunbarb440f562010-08-02 02:38:21 +00007799 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007800 CmdArgs.push_back("-o");
7801 CmdArgs.push_back(Output.getFilename());
7802 } else {
7803 assert(Output.isNothing() && "Invalid output.");
7804 }
7805
7806 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00007807 !Args.hasArg(options::OPT_nostartfiles)) {
7808 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7809 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7810 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7811 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7812 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007813
7814 Args.AddAllArgs(CmdArgs, options::OPT_L);
7815 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7816 Args.AddAllArgs(CmdArgs, options::OPT_e);
7817
Daniel Dunbar54423b22010-09-17 00:24:54 +00007818 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007819
Alexey Samsonov7811d192014-02-20 13:57:37 +00007820 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00007821
Chris Lattner3e2ee142010-07-07 16:01:42 +00007822 if (!Args.hasArg(options::OPT_nostdlib) &&
7823 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007824 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007825 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007826 CmdArgs.push_back("-lm");
7827 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007828 }
7829
7830 if (!Args.hasArg(options::OPT_nostdlib) &&
7831 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00007832 if (Args.hasArg(options::OPT_pthread))
7833 CmdArgs.push_back("-lpthread");
7834 CmdArgs.push_back("-lc");
7835 CmdArgs.push_back("-lCompilerRT-Generic");
7836 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7837 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00007838 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007839 }
7840
Logan Chieneb9162f2014-06-26 14:23:45 +00007841 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007842 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007843}
7844
Daniel Dunbarcc912342009-05-02 18:28:39 +00007845/// DragonFly Tools
7846
7847// For now, DragonFly Assemble does just about the same as for
7848// FreeBSD, but this may change soon.
7849void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007850 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007851 const InputInfoList &Inputs,
7852 const ArgList &Args,
7853 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007854 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007855 ArgStringList CmdArgs;
7856
7857 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7858 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007859 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00007860 CmdArgs.push_back("--32");
7861
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007862 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007863
7864 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007865 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007866
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007867 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007868 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007869
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007870 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007871 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007872}
7873
7874void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007875 const InputInfo &Output,
7876 const InputInfoList &Inputs,
7877 const ArgList &Args,
7878 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007879 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00007880 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00007881 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00007882
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007883 if (!D.SysRoot.empty())
7884 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7885
John McCall65b8da02013-04-11 22:55:55 +00007886 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007887 if (Args.hasArg(options::OPT_static)) {
7888 CmdArgs.push_back("-Bstatic");
7889 } else {
John McCall65b8da02013-04-11 22:55:55 +00007890 if (Args.hasArg(options::OPT_rdynamic))
7891 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007892 if (Args.hasArg(options::OPT_shared))
7893 CmdArgs.push_back("-Bshareable");
7894 else {
7895 CmdArgs.push_back("-dynamic-linker");
7896 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7897 }
John McCall65b8da02013-04-11 22:55:55 +00007898 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007899 }
7900
7901 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7902 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007903 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007904 CmdArgs.push_back("-m");
7905 CmdArgs.push_back("elf_i386");
7906 }
7907
Daniel Dunbarb440f562010-08-02 02:38:21 +00007908 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007909 CmdArgs.push_back("-o");
7910 CmdArgs.push_back(Output.getFilename());
7911 } else {
7912 assert(Output.isNothing() && "Invalid output.");
7913 }
7914
7915 if (!Args.hasArg(options::OPT_nostdlib) &&
7916 !Args.hasArg(options::OPT_nostartfiles)) {
7917 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00007918 if (Args.hasArg(options::OPT_pg))
7919 CmdArgs.push_back(Args.MakeArgString(
7920 getToolChain().GetFilePath("gcrt1.o")));
7921 else {
7922 if (Args.hasArg(options::OPT_pie))
7923 CmdArgs.push_back(Args.MakeArgString(
7924 getToolChain().GetFilePath("Scrt1.o")));
7925 else
7926 CmdArgs.push_back(Args.MakeArgString(
7927 getToolChain().GetFilePath("crt1.o")));
7928 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007929 }
John McCall65b8da02013-04-11 22:55:55 +00007930 CmdArgs.push_back(Args.MakeArgString(
7931 getToolChain().GetFilePath("crti.o")));
7932 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7933 CmdArgs.push_back(Args.MakeArgString(
7934 getToolChain().GetFilePath("crtbeginS.o")));
7935 else
7936 CmdArgs.push_back(Args.MakeArgString(
7937 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007938 }
7939
7940 Args.AddAllArgs(CmdArgs, options::OPT_L);
7941 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7942 Args.AddAllArgs(CmdArgs, options::OPT_e);
7943
Daniel Dunbar54423b22010-09-17 00:24:54 +00007944 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007945
7946 if (!Args.hasArg(options::OPT_nostdlib) &&
7947 !Args.hasArg(options::OPT_nodefaultlibs)) {
7948 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7949 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00007950 if (UseGCC47)
7951 CmdArgs.push_back("-L/usr/lib/gcc47");
7952 else
7953 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007954
7955 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00007956 if (UseGCC47) {
7957 CmdArgs.push_back("-rpath");
7958 CmdArgs.push_back("/usr/lib/gcc47");
7959 } else {
7960 CmdArgs.push_back("-rpath");
7961 CmdArgs.push_back("/usr/lib/gcc44");
7962 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007963 }
7964
Hans Wennborg70850d82013-07-18 20:29:38 +00007965 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007966 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00007967 CmdArgs.push_back("-lm");
7968 }
7969
Daniel Dunbarcc912342009-05-02 18:28:39 +00007970 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00007971 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007972
7973 if (!Args.hasArg(options::OPT_nolibc)) {
7974 CmdArgs.push_back("-lc");
7975 }
7976
John McCall65b8da02013-04-11 22:55:55 +00007977 if (UseGCC47) {
7978 if (Args.hasArg(options::OPT_static) ||
7979 Args.hasArg(options::OPT_static_libgcc)) {
7980 CmdArgs.push_back("-lgcc");
7981 CmdArgs.push_back("-lgcc_eh");
7982 } else {
7983 if (Args.hasArg(options::OPT_shared_libgcc)) {
7984 CmdArgs.push_back("-lgcc_pic");
7985 if (!Args.hasArg(options::OPT_shared))
7986 CmdArgs.push_back("-lgcc");
7987 } else {
7988 CmdArgs.push_back("-lgcc");
7989 CmdArgs.push_back("--as-needed");
7990 CmdArgs.push_back("-lgcc_pic");
7991 CmdArgs.push_back("--no-as-needed");
7992 }
7993 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007994 } else {
John McCall65b8da02013-04-11 22:55:55 +00007995 if (Args.hasArg(options::OPT_shared)) {
7996 CmdArgs.push_back("-lgcc_pic");
7997 } else {
7998 CmdArgs.push_back("-lgcc");
7999 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008000 }
8001 }
8002
8003 if (!Args.hasArg(options::OPT_nostdlib) &&
8004 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008005 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00008006 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00008007 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008008 else
8009 CmdArgs.push_back(Args.MakeArgString(
8010 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008011 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00008012 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008013 }
8014
Alexey Samsonov7811d192014-02-20 13:57:37 +00008015 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008016
Logan Chieneb9162f2014-06-26 14:23:45 +00008017 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008018 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008019}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008020
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008021// Try to find Exe from a Visual Studio distribution. This first tries to find
8022// an installed copy of Visual Studio and, failing that, looks in the PATH,
8023// making sure that whatever executable that's found is not a same-named exe
8024// from clang itself to prevent clang from falling back to itself.
8025static std::string FindVisualStudioExecutable(const ToolChain &TC,
8026 const char *Exe,
8027 const char *ClangProgramPath) {
8028 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8029 std::string visualStudioBinDir;
8030 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8031 visualStudioBinDir)) {
8032 SmallString<128> FilePath(visualStudioBinDir);
8033 llvm::sys::path::append(FilePath, Exe);
8034 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8035 return FilePath.str();
8036 }
8037
8038 return Exe;
8039}
8040
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008041void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
8042 const InputInfo &Output,
8043 const InputInfoList &Inputs,
8044 const ArgList &Args,
8045 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008046 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008047 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008048
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008049 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8050 if (Output.isFilename())
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00008051 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
8052 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008053
8054 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008055 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008056 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008057
Zachary Turner10d75b22014-10-22 20:40:43 +00008058 if (!llvm::sys::Process::GetEnv("LIB")) {
8059 // If the VC environment hasn't been configured (perhaps because the user
8060 // did not run vcvarsall), try to build a consistent link environment. If
8061 // the environment variable is set however, assume the user knows what he's
8062 // doing.
8063 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008064 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008065 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8066 SmallString<128> LibDir(VisualStudioDir);
8067 llvm::sys::path::append(LibDir, "VC", "lib");
8068 switch (MSVC.getArch()) {
8069 case llvm::Triple::x86:
8070 // x86 just puts the libraries directly in lib
8071 break;
8072 case llvm::Triple::x86_64:
8073 llvm::sys::path::append(LibDir, "amd64");
8074 break;
8075 case llvm::Triple::arm:
8076 llvm::sys::path::append(LibDir, "arm");
8077 break;
8078 default:
8079 break;
8080 }
8081 CmdArgs.push_back(
8082 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8083 }
8084
8085 std::string WindowsSdkLibPath;
8086 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8087 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8088 WindowsSdkLibPath.c_str()));
8089 }
8090
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008091 CmdArgs.push_back("-nologo");
8092
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008093 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008094 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008095
Hans Wennborgf1a74252013-09-10 20:18:04 +00008096 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008097 if (DLL) {
8098 CmdArgs.push_back(Args.MakeArgString("-dll"));
8099
8100 SmallString<128> ImplibName(Output.getFilename());
8101 llvm::sys::path::replace_extension(ImplibName, "lib");
8102 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
8103 ImplibName.str()));
8104 }
8105
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008106 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008107 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008108 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008109 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008110 static const char *CompilerRTComponents[] = {
8111 "asan_dynamic",
8112 "asan_dynamic_runtime_thunk",
8113 };
8114 for (const auto &Component : CompilerRTComponents)
8115 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008116 // Make sure the dynamic runtime thunk is not optimized out at link time
8117 // to ensure proper SEH handling.
8118 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008119 } else if (DLL) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008120 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008121 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008122 static const char *CompilerRTComponents[] = {
8123 "asan",
8124 "asan_cxx",
8125 };
8126 for (const auto &Component : CompilerRTComponents)
8127 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008128 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008129 }
8130
Hans Wennborg2e274592013-08-13 23:38:57 +00008131 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008132
Reid Kleckner337188f2014-09-16 19:22:00 +00008133 // Add filenames, libraries, and other linker inputs.
8134 for (const auto &Input : Inputs) {
8135 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008136 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008137 continue;
8138 }
8139
8140 const Arg &A = Input.getInputArg();
8141
8142 // Render -l options differently for the MSVC linker.
8143 if (A.getOption().matches(options::OPT_l)) {
8144 StringRef Lib = A.getValue();
8145 const char *LinkLibArg;
8146 if (Lib.endswith(".lib"))
8147 LinkLibArg = Args.MakeArgString(Lib);
8148 else
8149 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8150 CmdArgs.push_back(LinkLibArg);
8151 continue;
8152 }
8153
8154 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8155 // or -L. Render it, even if MSVC doesn't understand it.
8156 A.renderAsInput(Args, CmdArgs);
8157 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008158
Zachary Turner719f58c2014-12-01 23:06:47 +00008159 // We need to special case some linker paths. In the case of lld, we need to
8160 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8161 // linker, we need to use a special search algorithm.
8162 llvm::SmallString<128> linkPath;
8163 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8164 if (Linker.equals_lower("lld"))
8165 Linker = "lld-link";
8166
8167 if (Linker.equals_lower("link")) {
8168 // If we're using the MSVC linker, it's not sufficient to just use link
8169 // from the program PATH, because other environments like GnuWin32 install
8170 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008171 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008172 C.getDriver().getClangProgramPath());
8173 } else {
8174 linkPath = Linker;
8175 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008176 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008177 }
8178
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008179 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008180 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008181}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008182
8183void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8184 const InputInfo &Output,
8185 const InputInfoList &Inputs,
8186 const ArgList &Args,
8187 const char *LinkingOutput) const {
8188 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8189}
8190
David Blaikiec11bf802014-09-04 16:04:28 +00008191std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8192 Compilation &C, const JobAction &JA, const InputInfo &Output,
8193 const InputInfoList &Inputs, const ArgList &Args,
8194 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008195 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008196 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008197 CmdArgs.push_back("/c"); // Compile only.
8198 CmdArgs.push_back("/W0"); // No warnings.
8199
8200 // The goal is to be able to invoke this tool correctly based on
8201 // any flag accepted by clang-cl.
8202
8203 // These are spelled the same way in clang and cl.exe,.
8204 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8205 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008206
8207 // Optimization level.
8208 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8209 if (A->getOption().getID() == options::OPT_O0) {
8210 CmdArgs.push_back("/Od");
8211 } else {
8212 StringRef OptLevel = A->getValue();
8213 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8214 A->render(Args, CmdArgs);
8215 else if (OptLevel == "3")
8216 CmdArgs.push_back("/Ox");
8217 }
8218 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008219
8220 // Flags for which clang-cl have an alias.
8221 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8222
David Majnemerf6072342014-07-01 22:24:56 +00008223 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8224 /*default=*/false))
8225 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008226 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8227 options::OPT_fno_function_sections))
8228 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8229 ? "/Gy"
8230 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008231 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8232 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008233 CmdArgs.push_back(
8234 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008235 if (Args.hasArg(options::OPT_fsyntax_only))
8236 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008237 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8238 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008239
Hans Wennborg260ff402013-09-27 17:54:18 +00008240 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008241 for (const auto &Include : Includes)
8242 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008243
Hans Wennborg87cfa712013-09-19 20:32:16 +00008244 // Flags that can simply be passed through.
8245 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8246 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008247 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008248
8249 // The order of these flags is relevant, so pick the last one.
8250 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8251 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8252 A->render(Args, CmdArgs);
8253
8254
8255 // Input filename.
8256 assert(Inputs.size() == 1);
8257 const InputInfo &II = Inputs[0];
8258 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8259 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8260 if (II.isFilename())
8261 CmdArgs.push_back(II.getFilename());
8262 else
8263 II.getInputArg().renderAsInput(Args, CmdArgs);
8264
8265 // Output filename.
8266 assert(Output.getType() == types::TY_Object);
8267 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8268 Output.getFilename());
8269 CmdArgs.push_back(Fo);
8270
Hans Wennborg188382e2013-09-20 18:16:35 +00008271 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008272 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8273 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008274 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8275 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008276}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008277
8278
8279/// XCore Tools
8280// We pass assemble and link construction to the xcc tool.
8281
8282void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8283 const InputInfo &Output,
8284 const InputInfoList &Inputs,
8285 const ArgList &Args,
8286 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008287 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008288 ArgStringList CmdArgs;
8289
8290 CmdArgs.push_back("-o");
8291 CmdArgs.push_back(Output.getFilename());
8292
8293 CmdArgs.push_back("-c");
8294
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008295 if (Args.hasArg(options::OPT_v))
8296 CmdArgs.push_back("-v");
8297
Robert Lytton894d25c2014-05-02 09:33:25 +00008298 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8299 if (!A->getOption().matches(options::OPT_g0))
8300 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008301
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008302 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8303 false))
8304 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008305
8306 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8307 options::OPT_Xassembler);
8308
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008309 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008310 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008311
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008312 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008313 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008314}
8315
8316void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8317 const InputInfo &Output,
8318 const InputInfoList &Inputs,
8319 const ArgList &Args,
8320 const char *LinkingOutput) const {
8321 ArgStringList CmdArgs;
8322
8323 if (Output.isFilename()) {
8324 CmdArgs.push_back("-o");
8325 CmdArgs.push_back(Output.getFilename());
8326 } else {
8327 assert(Output.isNothing() && "Invalid output.");
8328 }
8329
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008330 if (Args.hasArg(options::OPT_v))
8331 CmdArgs.push_back("-v");
8332
David Majnemer8de68642014-12-05 08:11:58 +00008333 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008334 CmdArgs.push_back("-fexceptions");
8335
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008336 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8337
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008338 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008339 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008340}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008341
8342void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8343 const InputInfo &Output,
8344 const InputInfoList &Inputs,
8345 const ArgList &Args,
8346 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008347 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008348 const auto &TC =
8349 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8350 ArgStringList CmdArgs;
8351 const char *Exec;
8352
8353 switch (TC.getArch()) {
8354 default: llvm_unreachable("unsupported architecture");
8355 case llvm::Triple::arm:
8356 case llvm::Triple::thumb:
8357 break;
8358 case llvm::Triple::x86:
8359 CmdArgs.push_back("--32");
8360 break;
8361 case llvm::Triple::x86_64:
8362 CmdArgs.push_back("--64");
8363 break;
8364 }
8365
8366 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8367
8368 CmdArgs.push_back("-o");
8369 CmdArgs.push_back(Output.getFilename());
8370
8371 for (const auto &Input : Inputs)
8372 CmdArgs.push_back(Input.getFilename());
8373
8374 const std::string Assembler = TC.GetProgramPath("as");
8375 Exec = Args.MakeArgString(Assembler);
8376
8377 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8378}
8379
8380void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8381 const InputInfo &Output,
8382 const InputInfoList &Inputs,
8383 const ArgList &Args,
8384 const char *LinkingOutput) const {
8385 const auto &TC =
8386 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8387 const llvm::Triple &T = TC.getTriple();
8388 const Driver &D = TC.getDriver();
8389 SmallString<128> EntryPoint;
8390 ArgStringList CmdArgs;
8391 const char *Exec;
8392
8393 // Silence warning for "clang -g foo.o -o foo"
8394 Args.ClaimAllArgs(options::OPT_g_Group);
8395 // and "clang -emit-llvm foo.o -o foo"
8396 Args.ClaimAllArgs(options::OPT_emit_llvm);
8397 // and for "clang -w foo.o -o foo"
8398 Args.ClaimAllArgs(options::OPT_w);
8399 // Other warning options are already handled somewhere else.
8400
8401 if (!D.SysRoot.empty())
8402 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8403
8404 if (Args.hasArg(options::OPT_pie))
8405 CmdArgs.push_back("-pie");
8406 if (Args.hasArg(options::OPT_rdynamic))
8407 CmdArgs.push_back("-export-dynamic");
8408 if (Args.hasArg(options::OPT_s))
8409 CmdArgs.push_back("--strip-all");
8410
8411 CmdArgs.push_back("-m");
8412 switch (TC.getArch()) {
8413 default: llvm_unreachable("unsupported architecture");
8414 case llvm::Triple::arm:
8415 case llvm::Triple::thumb:
8416 // FIXME: this is incorrect for WinCE
8417 CmdArgs.push_back("thumb2pe");
8418 break;
8419 case llvm::Triple::x86:
8420 CmdArgs.push_back("i386pe");
8421 EntryPoint.append("_");
8422 break;
8423 case llvm::Triple::x86_64:
8424 CmdArgs.push_back("i386pep");
8425 break;
8426 }
8427
8428 if (Args.hasArg(options::OPT_shared)) {
8429 switch (T.getArch()) {
8430 default: llvm_unreachable("unsupported architecture");
8431 case llvm::Triple::arm:
8432 case llvm::Triple::thumb:
8433 case llvm::Triple::x86_64:
8434 EntryPoint.append("_DllMainCRTStartup");
8435 break;
8436 case llvm::Triple::x86:
8437 EntryPoint.append("_DllMainCRTStartup@12");
8438 break;
8439 }
8440
8441 CmdArgs.push_back("-shared");
8442 CmdArgs.push_back("-Bdynamic");
8443
8444 CmdArgs.push_back("--enable-auto-image-base");
8445
8446 CmdArgs.push_back("--entry");
8447 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8448 } else {
8449 EntryPoint.append("mainCRTStartup");
8450
8451 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8452 : "-Bdynamic");
8453
8454 if (!Args.hasArg(options::OPT_nostdlib) &&
8455 !Args.hasArg(options::OPT_nostartfiles)) {
8456 CmdArgs.push_back("--entry");
8457 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8458 }
8459
8460 // FIXME: handle subsystem
8461 }
8462
8463 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00008464 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008465
8466 CmdArgs.push_back("-o");
8467 CmdArgs.push_back(Output.getFilename());
8468
8469 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8470 SmallString<261> ImpLib(Output.getFilename());
8471 llvm::sys::path::replace_extension(ImpLib, ".lib");
8472
8473 CmdArgs.push_back("--out-implib");
8474 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8475 }
8476
8477 if (!Args.hasArg(options::OPT_nostdlib) &&
8478 !Args.hasArg(options::OPT_nostartfiles)) {
8479 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8480 const char *CRTBegin;
8481
8482 CRTBegin =
8483 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8484 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8485 }
8486
8487 Args.AddAllArgs(CmdArgs, options::OPT_L);
8488
8489 const auto &Paths = TC.getFilePaths();
8490 for (const auto &Path : Paths)
8491 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8492
8493 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8494
8495 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8496 !Args.hasArg(options::OPT_nodefaultlibs)) {
8497 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
8498 !Args.hasArg(options::OPT_static);
8499 if (StaticCXX)
8500 CmdArgs.push_back("-Bstatic");
8501 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8502 if (StaticCXX)
8503 CmdArgs.push_back("-Bdynamic");
8504 }
8505
8506 if (!Args.hasArg(options::OPT_nostdlib)) {
8507 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8508 // TODO handle /MT[d] /MD[d]
8509 CmdArgs.push_back("-lmsvcrt");
8510 AddRunTimeLibs(TC, D, CmdArgs, Args);
8511 }
8512 }
8513
8514 const std::string Linker = TC.GetProgramPath("ld");
8515 Exec = Args.MakeArgString(Linker);
8516
8517 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8518}