blob: 24363ba9977f7cba09968ffa70401650cfad8812 [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
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002291static bool shouldUseFramePointerForTarget(const ArgList &Args,
2292 const llvm::Triple &Triple) {
2293 switch (Triple.getArch()) {
2294 // Don't use a frame pointer on linux if optimizing for certain targets.
2295 case llvm::Triple::mips64:
2296 case llvm::Triple::mips64el:
2297 case llvm::Triple::mips:
2298 case llvm::Triple::mipsel:
2299 case llvm::Triple::systemz:
2300 case llvm::Triple::x86:
2301 case llvm::Triple::x86_64:
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002302 if (Triple.isOSLinux())
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002303 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2304 if (!A->getOption().matches(options::OPT_O0))
2305 return false;
2306 return true;
2307 case llvm::Triple::xcore:
2308 return false;
2309 default:
2310 return true;
2311 }
2312}
2313
Rafael Espindola224dd632011-12-14 21:02:23 +00002314static bool shouldUseFramePointer(const ArgList &Args,
2315 const llvm::Triple &Triple) {
2316 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2317 options::OPT_fomit_frame_pointer))
2318 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2319
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002320 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002321}
2322
Eric Christopherb7d97e92013-04-03 01:58:53 +00002323static bool shouldUseLeafFramePointer(const ArgList &Args,
2324 const llvm::Triple &Triple) {
2325 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2326 options::OPT_momit_leaf_frame_pointer))
2327 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2328
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002329 if (Triple.isPS4CPU())
2330 return false;
2331
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002332 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002333}
2334
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002335/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002336static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002337 SmallString<128> cwd;
2338 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002339 CmdArgs.push_back("-fdebug-compilation-dir");
2340 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002341 }
2342}
2343
Eric Christopherd3804002013-02-22 20:12:52 +00002344static const char *SplitDebugName(const ArgList &Args,
2345 const InputInfoList &Inputs) {
2346 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2347 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2348 SmallString<128> T(FinalOutput->getValue());
2349 llvm::sys::path::replace_extension(T, "dwo");
2350 return Args.MakeArgString(T);
2351 } else {
2352 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002353 SmallString<128> T(
2354 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Eric Christopherd3804002013-02-22 20:12:52 +00002355 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2356 llvm::sys::path::replace_extension(F, "dwo");
2357 T += F;
2358 return Args.MakeArgString(F);
2359 }
2360}
2361
2362static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2363 const Tool &T, const JobAction &JA,
2364 const ArgList &Args, const InputInfo &Output,
2365 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002366 ArgStringList ExtractArgs;
2367 ExtractArgs.push_back("--extract-dwo");
2368
2369 ArgStringList StripArgs;
2370 StripArgs.push_back("--strip-dwo");
2371
2372 // Grabbing the output of the earlier compile step.
2373 StripArgs.push_back(Output.getFilename());
2374 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002375 ExtractArgs.push_back(OutFile);
2376
2377 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002378 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002379
2380 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002381 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002382
2383 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002384 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002385}
2386
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002387/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002388/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2389static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002390 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002391 if (A->getOption().matches(options::OPT_O4) ||
2392 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002393 return true;
2394
2395 if (A->getOption().matches(options::OPT_O0))
2396 return false;
2397
2398 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2399
Rafael Espindola91780de2013-08-26 14:05:41 +00002400 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002401 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002402 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002403 return true;
2404
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002405 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002406 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002407 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002408
2409 unsigned OptLevel = 0;
2410 if (S.getAsInteger(10, OptLevel))
2411 return false;
2412
2413 return OptLevel > 1;
2414 }
2415
2416 return false;
2417}
2418
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002419/// Add -x lang to \p CmdArgs for \p Input.
2420static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2421 ArgStringList &CmdArgs) {
2422 // When using -verify-pch, we don't want to provide the type
2423 // 'precompiled-header' if it was inferred from the file extension
2424 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2425 return;
2426
2427 CmdArgs.push_back("-x");
2428 if (Args.hasArg(options::OPT_rewrite_objc))
2429 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2430 else
2431 CmdArgs.push_back(types::getTypeName(Input.getType()));
2432}
2433
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002434static std::string getMSCompatibilityVersion(const char *VersionStr) {
2435 unsigned Version;
2436 if (StringRef(VersionStr).getAsInteger(10, Version))
2437 return "0";
2438
2439 if (Version < 100)
2440 return llvm::utostr_32(Version) + ".0";
2441
2442 if (Version < 10000)
2443 return llvm::utostr_32(Version / 100) + "." +
2444 llvm::utostr_32(Version % 100);
2445
2446 unsigned Build = 0, Factor = 1;
2447 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2448 Build = Build + (Version % 10) * Factor;
2449 return llvm::utostr_32(Version / 100) + "." +
2450 llvm::utostr_32(Version % 100) + "." +
2451 llvm::utostr_32(Build);
2452}
2453
Rafael Espindola577637a2015-01-03 00:06:04 +00002454// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002455// options that build systems might add but are unused when assembling or only
2456// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002457static void claimNoWarnArgs(const ArgList &Args) {
2458 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002459 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002460 Args.ClaimAllArgs(options::OPT_flto);
2461 Args.ClaimAllArgs(options::OPT_fno_lto);
2462}
2463
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002464static void appendUserToPath(SmallVectorImpl<char> &Result) {
2465#ifdef LLVM_ON_UNIX
2466 const char *Username = getenv("LOGNAME");
2467#else
2468 const char *Username = getenv("USERNAME");
2469#endif
2470 if (Username) {
2471 // Validate that LoginName can be used in a path, and get its length.
2472 size_t Len = 0;
2473 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002474 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002475 Username = nullptr;
2476 break;
2477 }
2478 }
2479
2480 if (Username && Len > 0) {
2481 Result.append(Username, Username + Len);
2482 return;
2483 }
2484 }
2485
2486 // Fallback to user id.
2487#ifdef LLVM_ON_UNIX
2488 std::string UID = llvm::utostr(getuid());
2489#else
2490 // FIXME: Windows seems to have an 'SID' that might work.
2491 std::string UID = "9999";
2492#endif
2493 Result.append(UID.begin(), UID.end());
2494}
2495
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002496void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002497 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002498 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002499 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002500 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002501 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2502 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002503 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002504 ArgStringList CmdArgs;
2505
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002506 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002507 bool IsWindowsCygnus =
2508 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002509 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2510
Daniel Dunbare521a892009-03-31 20:53:55 +00002511 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2512
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002513 // Invoke ourselves in -cc1 mode.
2514 //
2515 // FIXME: Implement custom jobs for internal actions.
2516 CmdArgs.push_back("-cc1");
2517
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002518 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002519 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002520 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002521 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002522
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002523 const llvm::Triple TT(TripleStr);
2524 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2525 TT.getArch() == llvm::Triple::thumb)) {
2526 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2527 unsigned Version;
2528 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2529 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002530 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2531 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002532 }
2533
Tim Northover336f1892014-03-29 13:16:12 +00002534 // Push all default warning arguments that are specific to
2535 // the given target. These come before user provided warning options
2536 // are provided.
2537 getToolChain().addClangWarningOptions(CmdArgs);
2538
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002539 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002540 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002541
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002542 if (isa<AnalyzeJobAction>(JA)) {
2543 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2544 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002545 } else if (isa<MigrateJobAction>(JA)) {
2546 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002547 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002548 if (Output.getType() == types::TY_Dependencies)
2549 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002550 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002551 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002552 if (Args.hasArg(options::OPT_rewrite_objc) &&
2553 !Args.hasArg(options::OPT_g_Group))
2554 CmdArgs.push_back("-P");
2555 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002556 } else if (isa<AssembleJobAction>(JA)) {
2557 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002558
David Blaikie9260ed62013-07-25 21:19:01 +00002559 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002560
2561 // Also ignore explicit -force_cpusubtype_ALL option.
2562 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002563 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002564 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002565 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002566
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002567 if (JA.getType() == types::TY_Nothing)
2568 CmdArgs.push_back("-fsyntax-only");
2569 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002570 CmdArgs.push_back("-emit-pch");
2571 else
2572 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002573 } else if (isa<VerifyPCHJobAction>(JA)) {
2574 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002575 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002576 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2577 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002578
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002579 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002580 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002581 } else if (JA.getType() == types::TY_LLVM_IR ||
2582 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002583 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002584 } else if (JA.getType() == types::TY_LLVM_BC ||
2585 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002586 CmdArgs.push_back("-emit-llvm-bc");
2587 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002588 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002589 } else if (JA.getType() == types::TY_AST) {
2590 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002591 } else if (JA.getType() == types::TY_ModuleFile) {
2592 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002593 } else if (JA.getType() == types::TY_RewrittenObjC) {
2594 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002595 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002596 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2597 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002598 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002599 } else {
2600 assert(JA.getType() == types::TY_PP_Asm &&
2601 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002602 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002603 }
2604
Justin Bognera88f0122014-06-20 22:59:50 +00002605 // We normally speed up the clang process a bit by skipping destructors at
2606 // exit, but when we're generating diagnostics we can rely on some of the
2607 // cleanup.
2608 if (!C.isForDiagnostics())
2609 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002610
John McCallbb79b5f2010-02-13 03:50:24 +00002611 // Disable the verification pass in -asserts builds.
2612#ifdef NDEBUG
2613 CmdArgs.push_back("-disable-llvm-verifier");
2614#endif
2615
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002616 // Set the main file name, so that debug info works even with
2617 // -save-temps.
2618 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002619 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002620
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002621 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002622 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002623 if (Args.hasArg(options::OPT_static))
2624 CmdArgs.push_back("-static-define");
2625
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002626 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002627 // Enable region store model by default.
2628 CmdArgs.push_back("-analyzer-store=region");
2629
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002630 // Treat blocks as analysis entry points.
2631 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2632
Ted Kremenek49c79792011-03-24 00:28:47 +00002633 CmdArgs.push_back("-analyzer-eagerly-assume");
2634
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002635 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002636 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002637 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002638
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002639 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002640 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002641
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002642 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002643 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002644
2645 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002646
Jordan Rose10ad0812013-04-05 17:55:07 +00002647 if (types::isCXX(Inputs[0].getType()))
2648 CmdArgs.push_back("-analyzer-checker=cplusplus");
2649
Nico Webere8e53112014-05-11 01:04:02 +00002650 // Enable the following experimental checkers for testing.
2651 CmdArgs.push_back(
2652 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002653 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2654 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2655 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2656 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2657 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002658 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002659
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002660 // Set the output format. The default is plist, for (lame) historical
2661 // reasons.
2662 CmdArgs.push_back("-analyzer-output");
2663 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002664 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002665 else
2666 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002667
Ted Kremenekfe449a22010-03-22 22:32:05 +00002668 // Disable the presentation of standard compiler warnings when
2669 // using --analyze. We only want to show static analyzer diagnostics
2670 // or frontend errors.
2671 CmdArgs.push_back("-w");
2672
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002673 // Add -Xanalyzer arguments when running as analyzer.
2674 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002675 }
2676
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002677 CheckCodeGenerationOptions(D, Args);
2678
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002679 bool PIE = getToolChain().isPIEDefault();
2680 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002681 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002682
Alexey Bataev40e75222014-01-28 06:30:35 +00002683 // Android-specific defaults for PIC/PIE
2684 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2685 switch (getToolChain().getTriple().getArch()) {
2686 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002687 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002688 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002689 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002690 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002691 case llvm::Triple::mips:
2692 case llvm::Triple::mipsel:
2693 case llvm::Triple::mips64:
2694 case llvm::Triple::mips64el:
2695 PIC = true; // "-fpic"
2696 break;
2697
2698 case llvm::Triple::x86:
2699 case llvm::Triple::x86_64:
2700 PIC = true; // "-fPIC"
2701 IsPICLevelTwo = true;
2702 break;
2703
2704 default:
2705 break;
2706 }
2707 }
2708
Brad Smith5b05db82014-06-24 19:51:29 +00002709 // OpenBSD-specific defaults for PIE
2710 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2711 switch (getToolChain().getTriple().getArch()) {
2712 case llvm::Triple::mips64:
2713 case llvm::Triple::mips64el:
2714 case llvm::Triple::sparc:
2715 case llvm::Triple::x86:
2716 case llvm::Triple::x86_64:
2717 IsPICLevelTwo = false; // "-fpie"
2718 break;
2719
2720 case llvm::Triple::ppc:
2721 case llvm::Triple::sparcv9:
2722 IsPICLevelTwo = true; // "-fPIE"
2723 break;
2724
2725 default:
2726 break;
2727 }
2728 }
2729
Alexey Samsonov090301e2013-04-09 12:28:19 +00002730 // For the PIC and PIE flag options, this logic is different from the
2731 // legacy logic in very old versions of GCC, as that logic was just
2732 // a bug no one had ever fixed. This logic is both more rational and
2733 // consistent with GCC's new logic now that the bugs are fixed. The last
2734 // argument relating to either PIC or PIE wins, and no other argument is
2735 // used. If the last argument is any flavor of the '-fno-...' arguments,
2736 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2737 // at the same level.
2738 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2739 options::OPT_fpic, options::OPT_fno_pic,
2740 options::OPT_fPIE, options::OPT_fno_PIE,
2741 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002742 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2743 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002744 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002745 if (LastPICArg) {
2746 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002747 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2748 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2749 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2750 PIC = PIE || O.matches(options::OPT_fPIC) ||
2751 O.matches(options::OPT_fpic);
2752 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2753 O.matches(options::OPT_fPIC);
2754 } else {
2755 PIE = PIC = false;
2756 }
2757 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002758 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002759
Nick Lewycky609dd662013-10-11 03:33:53 +00002760 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002761 // specified while enabling PIC enabled level 1 PIC, just force it back to
2762 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2763 // informal testing).
2764 if (PIC && getToolChain().getTriple().isOSDarwin())
2765 IsPICLevelTwo |= getToolChain().isPICDefault();
2766
Chandler Carruthc0c04552012-04-08 16:40:35 +00002767 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2768 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002769 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00002770 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002771 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002772 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002773 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002774
Chandler Carruth76a943b2012-11-19 03:52:03 +00002775 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2776 // This is a very special mode. It trumps the other modes, almost no one
2777 // uses it, and it isn't even valid on any OS but Darwin.
2778 if (!getToolChain().getTriple().isOSDarwin())
2779 D.Diag(diag::err_drv_unsupported_opt_for_target)
2780 << A->getSpelling() << getToolChain().getTriple().str();
2781
2782 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2783
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002784 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002785 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002786
Chandler Carruth76a943b2012-11-19 03:52:03 +00002787 // Only a forced PIC mode can cause the actual compile to have PIC defines
2788 // etc., no flags are sufficient. This behavior was selected to closely
2789 // match that of llvm-gcc and Apple GCC before that.
2790 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2791 CmdArgs.push_back("-pic-level");
2792 CmdArgs.push_back("2");
2793 }
2794 } else {
2795 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2796 // handled in Clang's IRGen by the -pie-level flag.
2797 CmdArgs.push_back("-mrelocation-model");
2798 CmdArgs.push_back(PIC ? "pic" : "static");
2799
2800 if (PIC) {
2801 CmdArgs.push_back("-pic-level");
2802 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2803 if (PIE) {
2804 CmdArgs.push_back("-pie-level");
2805 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2806 }
2807 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002808 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002809
Jonathan Roelofsb140a102014-10-03 21:57:44 +00002810 CmdArgs.push_back("-mthread-model");
2811 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
2812 CmdArgs.push_back(A->getValue());
2813 else
2814 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
2815
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002816 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2817 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002818 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002819
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002820 // LLVM Code Generator Options.
2821
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00002822 if (Args.hasArg(options::OPT_frewrite_map_file) ||
2823 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
2824 for (arg_iterator
2825 MFI = Args.filtered_begin(options::OPT_frewrite_map_file,
2826 options::OPT_frewrite_map_file_EQ),
2827 MFE = Args.filtered_end();
2828 MFI != MFE; ++MFI) {
2829 CmdArgs.push_back("-frewrite-map-file");
2830 CmdArgs.push_back((*MFI)->getValue());
2831 (*MFI)->claim();
2832 }
2833 }
2834
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002835 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2836 StringRef v = A->getValue();
2837 CmdArgs.push_back("-mllvm");
2838 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2839 A->claim();
2840 }
2841
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002842 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2843 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002844 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002845 }
2846
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002847 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2848 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002849 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002850 D.Diag(diag::err_drv_unsupported_opt_for_target)
2851 << A->getSpelling() << getToolChain().getTriple().str();
2852 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2853 CmdArgs.push_back("-fpcc-struct-return");
2854 } else {
2855 assert(A->getOption().matches(options::OPT_freg_struct_return));
2856 CmdArgs.push_back("-freg-struct-return");
2857 }
2858 }
2859
Roman Divacky65b88cd2011-03-01 17:40:53 +00002860 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2861 CmdArgs.push_back("-mrtd");
2862
Rafael Espindola224dd632011-12-14 21:02:23 +00002863 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002864 CmdArgs.push_back("-mdisable-fp-elim");
2865 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2866 options::OPT_fno_zero_initialized_in_bss))
2867 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002868
2869 bool OFastEnabled = isOptimizationLevelFast(Args);
2870 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2871 // enabled. This alias option is being used to simplify the hasFlag logic.
2872 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2873 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002874 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2875 // doesn't do any TBAA.
2876 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002877 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002878 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002879 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002880 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2881 options::OPT_fno_struct_path_tbaa))
2882 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002883 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2884 false))
2885 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002886 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2887 options::OPT_fno_optimize_sibling_calls))
2888 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002889
Eric Christopher006208c2013-04-04 06:29:47 +00002890 // Handle segmented stacks.
2891 if (Args.hasArg(options::OPT_fsplit_stack))
2892 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002893
2894 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2895 // This alias option is being used to simplify the getLastArg logic.
2896 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2897 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002898
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002899 // Handle various floating point optimization flags, mapping them to the
2900 // appropriate LLVM code generation flags. The pattern for all of these is to
2901 // default off the codegen optimizations, and if any flag enables them and no
2902 // flag disables them after the flag enabling them, enable the codegen
2903 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002904 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002905 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002906 options::OPT_ffinite_math_only,
2907 options::OPT_fno_finite_math_only,
2908 options::OPT_fhonor_infinities,
2909 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002910 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2911 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002912 A->getOption().getID() != options::OPT_fhonor_infinities)
2913 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002914 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002915 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002916 options::OPT_ffinite_math_only,
2917 options::OPT_fno_finite_math_only,
2918 options::OPT_fhonor_nans,
2919 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002920 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2921 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002922 A->getOption().getID() != options::OPT_fhonor_nans)
2923 CmdArgs.push_back("-menable-no-nans");
2924
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002925 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2926 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002927 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002928 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002929 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002930 options::OPT_fno_math_errno)) {
2931 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2932 // However, turning *off* -ffast_math merely restores the toolchain default
2933 // (which may be false).
2934 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2935 A->getOption().getID() == options::OPT_ffast_math ||
2936 A->getOption().getID() == options::OPT_Ofast)
2937 MathErrno = false;
2938 else if (A->getOption().getID() == options::OPT_fmath_errno)
2939 MathErrno = true;
2940 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002941 if (MathErrno)
2942 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002943
2944 // There are several flags which require disabling very specific
2945 // optimizations. Any of these being disabled forces us to turn off the
2946 // entire set of LLVM optimizations, so collect them through all the flag
2947 // madness.
2948 bool AssociativeMath = false;
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_funsafe_math_optimizations,
2952 options::OPT_fno_unsafe_math_optimizations,
2953 options::OPT_fassociative_math,
2954 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002955 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2956 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002957 A->getOption().getID() != options::OPT_fno_associative_math)
2958 AssociativeMath = true;
2959 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002960 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002961 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002962 options::OPT_funsafe_math_optimizations,
2963 options::OPT_fno_unsafe_math_optimizations,
2964 options::OPT_freciprocal_math,
2965 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002966 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2967 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002968 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2969 ReciprocalMath = true;
2970 bool SignedZeros = true;
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_fsigned_zeros,
2976 options::OPT_fno_signed_zeros))
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_fsigned_zeros)
2980 SignedZeros = false;
2981 bool TrappingMath = true;
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_ftrapping_math,
2987 options::OPT_fno_trapping_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_ftrapping_math)
2991 TrappingMath = false;
2992 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2993 !TrappingMath)
2994 CmdArgs.push_back("-menable-unsafe-fp-math");
2995
Sanjay Patel76c9e092015-01-23 16:40:50 +00002996 if (!SignedZeros)
2997 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00002998
2999 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003000 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003001 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003002 options::OPT_ffp_contract)) {
3003 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003004 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003005 if (Val == "fast" || Val == "on" || Val == "off") {
3006 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3007 } else {
3008 D.Diag(diag::err_drv_unsupported_option_argument)
3009 << A->getOption().getName() << Val;
3010 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003011 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3012 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003013 // If fast-math is set then set the fp-contract mode to fast.
3014 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3015 }
3016 }
3017
Bob Wilson6a039162012-07-19 03:52:53 +00003018 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3019 // and if we find them, tell the frontend to provide the appropriate
3020 // preprocessor macros. This is distinct from enabling any optimizations as
3021 // these options induce language changes which must survive serialization
3022 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003023 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3024 options::OPT_fno_fast_math))
3025 if (!A->getOption().matches(options::OPT_fno_fast_math))
3026 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003027 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3028 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003029 if (A->getOption().matches(options::OPT_ffinite_math_only))
3030 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003031
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003032 // Decide whether to use verbose asm. Verbose assembly is the default on
3033 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003034 bool IsIntegratedAssemblerDefault =
3035 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003036 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003037 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003038 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003039 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003040
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00003041 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003042 IsIntegratedAssemblerDefault))
3043 CmdArgs.push_back("-no-integrated-as");
3044
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003045 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3046 CmdArgs.push_back("-mdebug-pass");
3047 CmdArgs.push_back("Structure");
3048 }
3049 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3050 CmdArgs.push_back("-mdebug-pass");
3051 CmdArgs.push_back("Arguments");
3052 }
3053
John McCall8517abc2010-02-19 02:45:38 +00003054 // Enable -mconstructor-aliases except on darwin, where we have to
3055 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003056 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003057 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003058
John McCall7ef5cb32011-03-18 02:56:14 +00003059 // Darwin's kernel doesn't support guard variables; just die if we
3060 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003061 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003062 CmdArgs.push_back("-fforbid-guard-variables");
3063
Douglas Gregordbe39272011-02-01 15:15:22 +00003064 if (Args.hasArg(options::OPT_mms_bitfields)) {
3065 CmdArgs.push_back("-mms-bitfields");
3066 }
John McCall8517abc2010-02-19 02:45:38 +00003067
Daniel Dunbar306945d2009-09-16 06:17:29 +00003068 // This is a coarse approximation of what llvm-gcc actually does, both
3069 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3070 // complicated ways.
3071 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003072 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3073 options::OPT_fno_asynchronous_unwind_tables,
3074 (getToolChain().IsUnwindTablesDefault() ||
3075 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3076 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003077 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3078 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003079 CmdArgs.push_back("-munwind-tables");
3080
Chandler Carruth05fb5852012-11-21 23:40:23 +00003081 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003082
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003083 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3084 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003085 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003086 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003087
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003088 // FIXME: Handle -mtune=.
3089 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003090
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003091 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003092 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003093 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003094 }
3095
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003096 // Add the target cpu
3097 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3098 llvm::Triple ETriple(ETripleStr);
3099 std::string CPU = getCPUName(Args, ETriple);
3100 if (!CPU.empty()) {
3101 CmdArgs.push_back("-target-cpu");
3102 CmdArgs.push_back(Args.MakeArgString(CPU));
3103 }
3104
Rafael Espindolaeb265472013-08-21 21:59:03 +00003105 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3106 CmdArgs.push_back("-mfpmath");
3107 CmdArgs.push_back(A->getValue());
3108 }
3109
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003110 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003111 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003112
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003113 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003114 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003115 default:
3116 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003117
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003118 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003119 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003120 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003121 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003122 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003123 break;
3124
Tim Northover573cbee2014-05-24 12:52:07 +00003125 case llvm::Triple::aarch64:
3126 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003127 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003128 break;
3129
Eric Christopher0b26a612010-03-02 02:41:08 +00003130 case llvm::Triple::mips:
3131 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003132 case llvm::Triple::mips64:
3133 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003134 AddMIPSTargetArgs(Args, CmdArgs);
3135 break;
3136
Ulrich Weigand8afad612014-07-28 13:17:52 +00003137 case llvm::Triple::ppc:
3138 case llvm::Triple::ppc64:
3139 case llvm::Triple::ppc64le:
3140 AddPPCTargetArgs(Args, CmdArgs);
3141 break;
3142
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003143 case llvm::Triple::sparc:
Brad Smith10cd0f42014-07-11 20:12:08 +00003144 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003145 AddSparcTargetArgs(Args, CmdArgs);
3146 break;
3147
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003148 case llvm::Triple::x86:
3149 case llvm::Triple::x86_64:
3150 AddX86TargetArgs(Args, CmdArgs);
3151 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003152
3153 case llvm::Triple::hexagon:
3154 AddHexagonTargetArgs(Args, CmdArgs);
3155 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003156 }
3157
Hans Wennborg75958c42013-08-08 00:17:41 +00003158 // Add clang-cl arguments.
3159 if (getToolChain().getDriver().IsCLMode())
3160 AddClangCLArgs(Args, CmdArgs);
3161
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003162 // Pass the linker version in use.
3163 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3164 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003165 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003166 }
3167
Eric Christopherb7d97e92013-04-03 01:58:53 +00003168 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003169 CmdArgs.push_back("-momit-leaf-frame-pointer");
3170
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003171 // Explicitly error on some things we know we don't support and can't just
3172 // ignore.
3173 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003174 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3175 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003176 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003177 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003178 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003179 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3180 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003181 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003182 << Unsupported->getOption().getName();
3183 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003184 }
3185
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003186 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003187 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003188 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003189 CmdArgs.push_back("-header-include-file");
3190 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3191 D.CCPrintHeadersFilename : "-");
3192 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003193 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003194 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003195
Chad Rosierbe10f982011-08-02 17:58:04 +00003196 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003197 CmdArgs.push_back("-diagnostic-log-file");
3198 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3199 D.CCLogDiagnosticsFilename : "-");
3200 }
3201
Manman Ren17bdb0f2013-11-20 20:22:14 +00003202 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3203 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003204 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003205 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003206 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3207 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003208 // FIXME: we should support specifying dwarf version with
3209 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003210 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003211 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003212 const llvm::Triple &Triple = getToolChain().getTriple();
3213 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003214 Triple.getOS() == llvm::Triple::FreeBSD ||
3215 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003216 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003217 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003218 CmdArgs.push_back("-gdwarf-2");
3219 else if (A->getOption().matches(options::OPT_gdwarf_3))
3220 CmdArgs.push_back("-gdwarf-3");
3221 else if (A->getOption().matches(options::OPT_gdwarf_4))
3222 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003223 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003224 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003225 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003226 const llvm::Triple &Triple = getToolChain().getTriple();
3227 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003228 Triple.getOS() == llvm::Triple::FreeBSD ||
3229 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003230 CmdArgs.push_back("-gdwarf-2");
3231 else
3232 CmdArgs.push_back("-g");
3233 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003234 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003235
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003236 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3237 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003238 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3239 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003240 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003241
Eric Christopher138c32b2013-09-13 22:37:55 +00003242 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003243 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3244 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003245 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003246 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003247 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003248 CmdArgs.push_back("-g");
3249 CmdArgs.push_back("-backend-option");
3250 CmdArgs.push_back("-split-dwarf=Enable");
3251 }
3252
Eric Christopher138c32b2013-09-13 22:37:55 +00003253 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3254 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3255 CmdArgs.push_back("-backend-option");
3256 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3257 }
Eric Christophereec89c22013-06-18 00:03:50 +00003258
Eric Christopher0d403d22014-02-14 01:27:03 +00003259 // -gdwarf-aranges turns on the emission of the aranges section in the
3260 // backend.
3261 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3262 CmdArgs.push_back("-backend-option");
3263 CmdArgs.push_back("-generate-arange-section");
3264 }
3265
David Blaikief36d9ba2014-01-27 18:52:43 +00003266 if (Args.hasFlag(options::OPT_fdebug_types_section,
3267 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003268 CmdArgs.push_back("-backend-option");
3269 CmdArgs.push_back("-generate-type-units");
3270 }
Eric Christophereec89c22013-06-18 00:03:50 +00003271
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003272 if (Args.hasFlag(options::OPT_ffunction_sections,
3273 options::OPT_fno_function_sections, false)) {
3274 CmdArgs.push_back("-ffunction-sections");
3275 }
3276
3277 if (Args.hasFlag(options::OPT_fdata_sections,
3278 options::OPT_fno_data_sections, false)) {
3279 CmdArgs.push_back("-fdata-sections");
3280 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003281
Chris Lattner3c77a352010-06-22 00:03:40 +00003282 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3283
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003284 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
3285 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3286 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3287 D.Diag(diag::err_drv_argument_not_allowed_with)
3288 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3289
3290 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3291
3292 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3293 A->render(Args, CmdArgs);
3294 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3295 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3296
Nick Lewycky207bce32011-04-21 23:44:07 +00003297 if (Args.hasArg(options::OPT_ftest_coverage) ||
3298 Args.hasArg(options::OPT_coverage))
3299 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003300 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3301 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003302 Args.hasArg(options::OPT_coverage))
3303 CmdArgs.push_back("-femit-coverage-data");
3304
Alex Lorenzee024992014-08-04 18:41:51 +00003305 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
3306 !Args.hasArg(options::OPT_fprofile_instr_generate))
3307 D.Diag(diag::err_drv_argument_only_allowed_with)
3308 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3309
3310 if (Args.hasArg(options::OPT_fcoverage_mapping))
3311 CmdArgs.push_back("-fcoverage-mapping");
3312
Nick Lewycky480cb992011-05-04 20:46:58 +00003313 if (C.getArgs().hasArg(options::OPT_c) ||
3314 C.getArgs().hasArg(options::OPT_S)) {
3315 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003316 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003317 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003318 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003319 CoverageFilename = FinalOutput->getValue();
3320 } else {
3321 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3322 }
Nick Lewycky737a4522013-03-07 08:28:53 +00003323 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003324 SmallString<128> Pwd;
3325 if (!llvm::sys::fs::current_path(Pwd)) {
3326 llvm::sys::path::append(Pwd, CoverageFilename.str());
3327 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003328 }
3329 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003330 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003331 }
3332 }
3333
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003334 // Pass options for controlling the default header search paths.
3335 if (Args.hasArg(options::OPT_nostdinc)) {
3336 CmdArgs.push_back("-nostdsysteminc");
3337 CmdArgs.push_back("-nobuiltininc");
3338 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003339 if (Args.hasArg(options::OPT_nostdlibinc))
3340 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003341 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3342 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3343 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003344
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003345 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003346 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003347 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003348
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003349 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3350
Ted Kremenekf7639e12012-03-06 20:06:33 +00003351 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003352 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003353 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003354 options::OPT_ccc_arcmt_modify,
3355 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003356 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003357 switch (A->getOption().getID()) {
3358 default:
3359 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003360 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003361 CmdArgs.push_back("-arcmt-check");
3362 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003363 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003364 CmdArgs.push_back("-arcmt-modify");
3365 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003366 case options::OPT_ccc_arcmt_migrate:
3367 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003368 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003369 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003370
3371 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3372 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003373 break;
John McCalld70fb982011-06-15 23:25:17 +00003374 }
3375 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003376 } else {
3377 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3378 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3379 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003380 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003381
Ted Kremenekf7639e12012-03-06 20:06:33 +00003382 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3383 if (ARCMTEnabled) {
3384 D.Diag(diag::err_drv_argument_not_allowed_with)
3385 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3386 }
3387 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003388 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003389
3390 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003391 options::OPT_objcmt_migrate_subscripting,
3392 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003393 // None specified, means enable them all.
3394 CmdArgs.push_back("-objcmt-migrate-literals");
3395 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003396 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003397 } else {
3398 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3399 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003400 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003401 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003402 } else {
3403 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3404 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3405 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3406 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3407 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3408 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
3409 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3410 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3411 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3412 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3413 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3414 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3415 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003416 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003417 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003418 }
3419
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003420 // Add preprocessing options like -I, -D, etc. if we are using the
3421 // preprocessor.
3422 //
3423 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003424 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003425 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003426
Rafael Espindolaa7431922011-07-21 23:40:37 +00003427 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3428 // that "The compiler can only warn and ignore the option if not recognized".
3429 // When building with ccache, it will pass -D options to clang even on
3430 // preprocessed inputs and configure concludes that -fPIC is not supported.
3431 Args.ClaimAllArgs(options::OPT_D);
3432
Alp Toker7874bdc2013-11-15 20:40:58 +00003433 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003434 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3435 if (A->getOption().matches(options::OPT_O4)) {
3436 CmdArgs.push_back("-O3");
3437 D.Diag(diag::warn_O4_is_O3);
3438 } else {
3439 A->render(Args, CmdArgs);
3440 }
3441 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003442
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003443 // Warn about ignored options to clang.
3444 for (arg_iterator it = Args.filtered_begin(
3445 options::OPT_clang_ignored_gcc_optimization_f_Group),
3446 ie = Args.filtered_end(); it != ie; ++it) {
3447 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3448 }
3449
Rafael Espindola577637a2015-01-03 00:06:04 +00003450 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003451
Richard Smith3be1cb22014-08-07 00:24:21 +00003452 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003453 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003454 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3455 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003456 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003457 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003458
3459 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003460 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003461 //
3462 // If a std is supplied, only add -trigraphs if it follows the
3463 // option.
3464 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3465 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003466 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003467 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003468 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003469 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003470 else
3471 Std->render(Args, CmdArgs);
3472
Nico Weber00721502014-12-23 22:32:37 +00003473 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003474 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003475 options::OPT_ftrigraphs,
3476 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003477 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003478 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003479 } else {
3480 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003481 //
3482 // FIXME: Clang doesn't correctly handle -std= when the input language
3483 // doesn't match. For the time being just ignore this for C++ inputs;
3484 // eventually we want to do all the standard defaulting here instead of
3485 // splitting it between the driver and clang -cc1.
3486 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003487 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3488 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003489 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003490 CmdArgs.push_back("-std=c++11");
3491
Nico Weber00721502014-12-23 22:32:37 +00003492 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3493 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003494 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003495
Richard Smith282b4492013-09-04 22:50:31 +00003496 // GCC's behavior for -Wwrite-strings is a bit strange:
3497 // * In C, this "warning flag" changes the types of string literals from
3498 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3499 // for the discarded qualifier.
3500 // * In C++, this is just a normal warning flag.
3501 //
3502 // Implementing this warning correctly in C is hard, so we follow GCC's
3503 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3504 // a non-const char* in C, rather than using this crude hack.
3505 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003506 // FIXME: This should behave just like a warning flag, and thus should also
3507 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3508 Arg *WriteStrings =
3509 Args.getLastArg(options::OPT_Wwrite_strings,
3510 options::OPT_Wno_write_strings, options::OPT_w);
3511 if (WriteStrings &&
3512 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003513 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003514 }
3515
Chandler Carruth61fbf622011-04-23 09:27:53 +00003516 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003517 // during C++ compilation, which it is by default. GCC keeps this define even
3518 // in the presence of '-w', match this behavior bug-for-bug.
3519 if (types::isCXX(InputType) &&
3520 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3521 true)) {
3522 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003523 }
3524
Chandler Carruthe0391482010-05-22 02:21:53 +00003525 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3526 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3527 if (Asm->getOption().matches(options::OPT_fasm))
3528 CmdArgs.push_back("-fgnu-keywords");
3529 else
3530 CmdArgs.push_back("-fno-gnu-keywords");
3531 }
3532
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003533 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3534 CmdArgs.push_back("-fno-dwarf-directory-asm");
3535
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003536 if (ShouldDisableAutolink(Args, getToolChain()))
3537 CmdArgs.push_back("-fno-autolink");
3538
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003539 // Add in -fdebug-compilation-dir if necessary.
3540 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003541
Richard Smith9a568822011-11-21 19:36:32 +00003542 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3543 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003544 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003545 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003546 }
3547
Richard Smith79c927b2013-11-06 19:31:51 +00003548 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3549 CmdArgs.push_back("-foperator-arrow-depth");
3550 CmdArgs.push_back(A->getValue());
3551 }
3552
Richard Smith9a568822011-11-21 19:36:32 +00003553 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3554 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003555 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003556 }
3557
Richard Smitha3d3bd22013-05-08 02:12:03 +00003558 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3559 CmdArgs.push_back("-fconstexpr-steps");
3560 CmdArgs.push_back(A->getValue());
3561 }
3562
Richard Smithb3a14522013-02-22 01:59:51 +00003563 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3564 CmdArgs.push_back("-fbracket-depth");
3565 CmdArgs.push_back(A->getValue());
3566 }
3567
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003568 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3569 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003570 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003571 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003572 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3573 } else
3574 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003575 }
3576
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003577
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003578 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003579 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003580
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003581 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3582 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003583 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003584 }
David Chisnall5778fce2009-08-31 16:41:57 +00003585
Chris Lattnere23003d2010-01-09 21:54:33 +00003586 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3587 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003588 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003589 }
3590
Chris Lattnerb35583d2010-04-07 20:49:23 +00003591 CmdArgs.push_back("-ferror-limit");
3592 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003593 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003594 else
3595 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003596
Chandler Carrutha77a7272010-05-06 04:55:18 +00003597 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3598 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003599 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003600 }
3601
3602 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3603 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003604 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003605 }
3606
Richard Smithf6f003a2011-12-16 19:06:07 +00003607 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3608 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003609 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003610 }
3611
Nick Lewycky24653262014-12-16 21:39:02 +00003612 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3613 CmdArgs.push_back("-fspell-checking-limit");
3614 CmdArgs.push_back(A->getValue());
3615 }
3616
Daniel Dunbar2c978472009-11-04 06:24:47 +00003617 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003618 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003619 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003620 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003621 } else {
3622 // If -fmessage-length=N was not specified, determine whether this is a
3623 // terminal and, if so, implicitly define -fmessage-length appropriately.
3624 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003625 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003626 }
3627
John McCallb4a99d32013-02-19 01:57:35 +00003628 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3629 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3630 options::OPT_fvisibility_ms_compat)) {
3631 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3632 CmdArgs.push_back("-fvisibility");
3633 CmdArgs.push_back(A->getValue());
3634 } else {
3635 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3636 CmdArgs.push_back("-fvisibility");
3637 CmdArgs.push_back("hidden");
3638 CmdArgs.push_back("-ftype-visibility");
3639 CmdArgs.push_back("default");
3640 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003641 }
3642
Douglas Gregor08329632010-06-15 17:05:35 +00003643 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003644
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003645 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3646
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003647 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003648 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3649 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003650 CmdArgs.push_back("-ffreestanding");
3651
Daniel Dunbare357d562009-12-03 18:42:11 +00003652 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003653 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003654 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003655 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3656 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003657 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003658 // AltiVec language extensions aren't relevant for assembling.
3659 if (!isa<PreprocessJobAction>(JA) ||
3660 Output.getType() != types::TY_PP_Asm)
3661 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003662 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3663 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003664
Peter Collingbourne32701642013-11-01 18:16:25 +00003665 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3666 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003667
Eric Christopher459d2712013-02-19 06:16:53 +00003668 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003669 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003670 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003671 getToolChain().getArch() == llvm::Triple::ppc64 ||
3672 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003673 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003674 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003675
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003676 if (getToolChain().SupportsProfiling())
3677 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003678
3679 // -flax-vector-conversions is default.
3680 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3681 options::OPT_fno_lax_vector_conversions))
3682 CmdArgs.push_back("-fno-lax-vector-conversions");
3683
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003684 if (Args.getLastArg(options::OPT_fapple_kext))
3685 CmdArgs.push_back("-fapple-kext");
3686
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003687 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003688 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003689 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003690 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3691 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003692
3693 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3694 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003695 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003696 }
3697
Bob Wilson14adb362012-02-03 06:27:22 +00003698 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003699
Chandler Carruth6e501032011-03-27 00:04:55 +00003700 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3701 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3702 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3703 options::OPT_fno_wrapv)) {
3704 if (A->getOption().matches(options::OPT_fwrapv))
3705 CmdArgs.push_back("-fwrapv");
3706 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3707 options::OPT_fno_strict_overflow)) {
3708 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3709 CmdArgs.push_back("-fwrapv");
3710 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003711
3712 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3713 options::OPT_fno_reroll_loops))
3714 if (A->getOption().matches(options::OPT_freroll_loops))
3715 CmdArgs.push_back("-freroll-loops");
3716
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003717 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003718 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3719 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003720
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003721 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3722
Mahesha S6a682be42012-10-27 07:47:56 +00003723
Daniel Dunbar4930e332009-11-17 08:07:36 +00003724 // -stack-protector=0 is default.
3725 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003726 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3727 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003728 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003729 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003730 if (A->getOption().matches(options::OPT_fstack_protector)) {
3731 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3732 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3733 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003734 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003735 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003736 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003737 } else {
3738 StackProtectorLevel =
3739 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3740 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003741 if (StackProtectorLevel) {
3742 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003743 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003744 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003745
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003746 // --param ssp-buffer-size=
3747 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3748 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003749 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003750 if (Str.startswith("ssp-buffer-size=")) {
3751 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003752 CmdArgs.push_back("-stack-protector-buffer-size");
3753 // FIXME: Verify the argument is a valid integer.
3754 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003755 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003756 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003757 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003758 }
3759
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003760 // Translate -mstackrealign
3761 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3762 false)) {
3763 CmdArgs.push_back("-backend-option");
3764 CmdArgs.push_back("-force-align-stack");
3765 }
3766 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3767 false)) {
3768 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3769 }
3770
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003771 if (Args.hasArg(options::OPT_mstack_alignment)) {
3772 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3773 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003774 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003775
Hans Wennborg77dc2362015-01-20 19:45:50 +00003776 if (Args.hasArg(options::OPT_mstack_probe_size)) {
3777 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
3778
3779 if (!Size.empty())
3780 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
3781 else
3782 CmdArgs.push_back("-mstack-probe-size=0");
3783 }
3784
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003785 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3786 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
3787 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3788
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003789 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3790 options::OPT_mno_restrict_it)) {
3791 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3792 CmdArgs.push_back("-backend-option");
3793 CmdArgs.push_back("-arm-restrict-it");
3794 } else {
3795 CmdArgs.push_back("-backend-option");
3796 CmdArgs.push_back("-arm-no-restrict-it");
3797 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003798 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3799 TT.getArch() == llvm::Triple::thumb)) {
3800 // Windows on ARM expects restricted IT blocks
3801 CmdArgs.push_back("-backend-option");
3802 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003803 }
3804
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003805 if (TT.getArch() == llvm::Triple::arm ||
3806 TT.getArch() == llvm::Triple::thumb) {
3807 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3808 options::OPT_mno_long_calls)) {
3809 if (A->getOption().matches(options::OPT_mlong_calls)) {
3810 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003811 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003812 }
3813 }
3814 }
3815
Daniel Dunbard18049a2009-04-07 21:16:11 +00003816 // Forward -f options with positive and negative forms; we translate
3817 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003818 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3819 StringRef fname = A->getValue();
3820 if (!llvm::sys::fs::exists(fname))
3821 D.Diag(diag::err_drv_no_such_file) << fname;
3822 else
3823 A->render(Args, CmdArgs);
3824 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003825
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003826 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003827 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003828 CmdArgs.push_back("-fapple-kext");
3829 if (!Args.hasArg(options::OPT_fbuiltin))
3830 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003831 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003832 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003833 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003834 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003835 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003836
Nuno Lopes13c88c72009-12-16 16:59:22 +00003837 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3838 options::OPT_fno_assume_sane_operator_new))
3839 CmdArgs.push_back("-fno-assume-sane-operator-new");
3840
Daniel Dunbar4930e332009-11-17 08:07:36 +00003841 // -fblocks=0 is default.
3842 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003843 getToolChain().IsBlocksDefault()) ||
3844 (Args.hasArg(options::OPT_fgnu_runtime) &&
3845 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3846 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003847 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003848
3849 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3850 !getToolChain().hasBlocksRuntime())
3851 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003852 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003853
Richard Smithffb65082014-09-30 23:10:19 +00003854 // -fmodules enables modules (off by default).
3855 // Users can pass -fno-cxx-modules to turn off modules support for
3856 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003857 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003858 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3859 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3860 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00003861 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003862 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003863 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003864 HaveModules = true;
3865 }
3866 }
3867
Daniel Jasper07e6c402013-08-05 20:26:17 +00003868 // -fmodule-maps enables module map processing (off by default) for header
3869 // checking. It is implied by -fmodules.
3870 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3871 false)) {
3872 CmdArgs.push_back("-fmodule-maps");
3873 }
3874
Daniel Jasperac42b752013-10-21 06:34:34 +00003875 // -fmodules-decluse checks that modules used are declared so (off by
3876 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003877 if (Args.hasFlag(options::OPT_fmodules_decluse,
3878 options::OPT_fno_modules_decluse,
3879 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003880 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003881 }
3882
Daniel Jasper962b38e2014-04-11 11:47:45 +00003883 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3884 // all #included headers are part of modules.
3885 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3886 options::OPT_fno_modules_strict_decluse,
3887 false)) {
3888 CmdArgs.push_back("-fmodules-strict-decluse");
3889 }
3890
Daniel Jasperac42b752013-10-21 06:34:34 +00003891 // -fmodule-name specifies the module that is currently being built (or
3892 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00003893 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00003894
Richard Smith9887d792014-10-17 01:42:53 +00003895 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00003896 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00003897 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00003898
Richard Smithe842a472014-10-22 02:05:46 +00003899 // -fmodule-file can be used to specify files containing precompiled modules.
3900 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
3901
3902 // -fmodule-cache-path specifies where our implicitly-built module files
3903 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00003904 SmallString<128> ModuleCachePath;
3905 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
3906 ModuleCachePath = A->getValue();
3907 if (HaveModules) {
3908 if (C.isForDiagnostics()) {
3909 // When generating crash reports, we want to emit the modules along with
3910 // the reproduction sources, so we ignore any provided module path.
3911 ModuleCachePath = Output.getFilename();
3912 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
3913 llvm::sys::path::append(ModuleCachePath, "modules");
3914 } else if (ModuleCachePath.empty()) {
3915 // No module path was provided: use the default.
3916 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3917 ModuleCachePath);
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003918 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
3919 appendUserToPath(ModuleCachePath);
Justin Bognera88f0122014-06-20 22:59:50 +00003920 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
3921 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00003922 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00003923 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
3924 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
3925 }
3926
3927 // When building modules and generating crashdumps, we need to dump a module
3928 // dependency VFS alongside the output.
3929 if (HaveModules && C.isForDiagnostics()) {
3930 SmallString<128> VFSDir(Output.getFilename());
3931 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00003932 // Add the cache directory as a temp so the crash diagnostics pick it up.
3933 C.addTempFile(Args.MakeArgString(VFSDir));
3934
Justin Bognera88f0122014-06-20 22:59:50 +00003935 llvm::sys::path::append(VFSDir, "vfs");
3936 CmdArgs.push_back("-module-dependency-dir");
3937 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003938 }
3939
Richard Smith9887d792014-10-17 01:42:53 +00003940 if (HaveModules)
3941 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003942
Douglas Gregor35b04d62013-02-07 19:01:24 +00003943 // Pass through all -fmodules-ignore-macro arguments.
3944 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003945 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3946 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003947
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003948 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3949
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003950 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
3951 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
3952 D.Diag(diag::err_drv_argument_not_allowed_with)
3953 << A->getAsString(Args) << "-fbuild-session-timestamp";
3954
3955 llvm::sys::fs::file_status Status;
3956 if (llvm::sys::fs::status(A->getValue(), Status))
3957 D.Diag(diag::err_drv_no_such_file) << A->getValue();
NAKAMURA Takumi0f9447d2014-08-03 01:11:44 +00003958 char TimeStamp[48];
3959 snprintf(TimeStamp, sizeof(TimeStamp), "-fbuild-session-timestamp=%" PRIu64,
3960 (uint64_t)Status.getLastModificationTime().toEpochTime());
3961 CmdArgs.push_back(Args.MakeArgString(TimeStamp));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003962 }
3963
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003964 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003965 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
3966 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003967 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
3968
3969 Args.AddLastArg(CmdArgs,
3970 options::OPT_fmodules_validate_once_per_build_session);
3971 }
3972
Ben Langmuirdcf73862014-03-12 00:06:17 +00003973 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
3974
John McCalldfea9982010-04-09 19:12:06 +00003975 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003976 if (Args.hasFlag(options::OPT_fno_access_control,
3977 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003978 false))
John McCall3155f572010-04-09 19:03:51 +00003979 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003980
Anders Carlssond470fef2010-11-21 00:09:52 +00003981 // -felide-constructors is the default.
3982 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3983 options::OPT_felide_constructors,
3984 false))
3985 CmdArgs.push_back("-fno-elide-constructors");
3986
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00003987 // -frtti is default, except for the PS4 CPU.
3988 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti,
3989 !Triple.isPS4CPU()) ||
Richard Smith52be6192012-11-05 22:04:41 +00003990 KernelOrKext) {
Filipe Cabecinhasf2a3aec2015-01-31 23:05:51 +00003991 bool IsCXX = types::isCXX(InputType);
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00003992 bool RTTIEnabled = false;
3993 Arg *NoRTTIArg = Args.getLastArg(
3994 options::OPT_mkernel, options::OPT_fapple_kext, options::OPT_fno_rtti);
3995
3996 // PS4 requires rtti when exceptions are enabled. If -fno-rtti was
3997 // explicitly passed, error out. Otherwise enable rtti and emit a
3998 // warning.
Filipe Cabecinhasf2a3aec2015-01-31 23:05:51 +00003999 Arg *Exceptions = Args.getLastArg(
4000 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
4001 options::OPT_fexceptions, options::OPT_fno_exceptions);
4002 if (Triple.isPS4CPU() && Exceptions) {
4003 bool CXXExceptions =
4004 (IsCXX &&
4005 Exceptions->getOption().matches(options::OPT_fexceptions)) ||
4006 Exceptions->getOption().matches(options::OPT_fcxx_exceptions);
4007 if (CXXExceptions) {
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004008 if (NoRTTIArg)
4009 D.Diag(diag::err_drv_argument_not_allowed_with)
Filipe Cabecinhasf2a3aec2015-01-31 23:05:51 +00004010 << NoRTTIArg->getAsString(Args) << Exceptions->getAsString(Args);
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004011 else {
4012 RTTIEnabled = true;
4013 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
4014 }
4015 }
4016 }
Mike Stump183c3d22009-07-31 23:15:31 +00004017
Richard Smith52be6192012-11-05 22:04:41 +00004018 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00004019 if (Sanitize.sanitizesVptr()) {
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004020 // If rtti was explicitly disabled and the vptr sanitizer is on, error
4021 // out. Otherwise, warn that vptr will be disabled unless -frtti is
4022 // passed.
4023 if (NoRTTIArg) {
4024 D.Diag(diag::err_drv_argument_not_allowed_with)
4025 << "-fsanitize=vptr" << NoRTTIArg->getAsString(Args);
4026 } else {
4027 D.Diag(diag::warn_drv_disabling_vptr_no_rtti_default);
4028 // All sanitizer switches have been pushed. This -fno-sanitize
4029 // will override any -fsanitize={vptr,undefined} passed before it.
4030 CmdArgs.push_back("-fno-sanitize=vptr");
4031 }
Richard Smith52be6192012-11-05 22:04:41 +00004032 }
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004033
4034 if (!RTTIEnabled)
4035 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004036 }
4037
Tony Linthicum76329bf2011-12-12 21:14:55 +00004038 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004039 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00004040 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004041 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00004042 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004043 CmdArgs.push_back("-fshort-enums");
4044
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004045 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004046 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004047 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004048 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00004049
Anders Carlssonfcd764a2010-02-06 23:23:06 +00004050 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004051 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00004052 options::OPT_fno_threadsafe_statics))
4053 CmdArgs.push_back("-fno-threadsafe-statics");
4054
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004055 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004056 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4057 options::OPT_fno_use_cxa_atexit,
4058 !IsWindowsCygnus && !IsWindowsGNU &&
4059 getToolChain().getArch() != llvm::Triple::hexagon &&
4060 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004061 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004062 CmdArgs.push_back("-fno-use-cxa-atexit");
4063
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004064 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004065 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004066 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004067 CmdArgs.push_back("-fms-extensions");
4068
Francois Pichet1b4f1632011-09-17 04:32:15 +00004069 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004070 if (Args.hasFlag(options::OPT_fms_compatibility,
4071 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004072 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4073 options::OPT_fno_ms_extensions,
4074 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004075 CmdArgs.push_back("-fms-compatibility");
4076
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004077 // -fms-compatibility-version=17.00 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004078 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004079 IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version) ||
4080 Args.hasArg(options::OPT_fms_compatibility_version)) {
4081 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4082 const Arg *MSCompatibilityVersion =
4083 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004084
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004085 if (MSCVersion && MSCompatibilityVersion)
4086 D.Diag(diag::err_drv_argument_not_allowed_with)
4087 << MSCVersion->getAsString(Args)
4088 << MSCompatibilityVersion->getAsString(Args);
4089
4090 std::string Ver;
4091 if (MSCompatibilityVersion)
4092 Ver = Args.getLastArgValue(options::OPT_fms_compatibility_version);
4093 else if (MSCVersion)
4094 Ver = getMSCompatibilityVersion(MSCVersion->getValue());
4095
4096 if (Ver.empty())
4097 CmdArgs.push_back("-fms-compatibility-version=17.00");
4098 else
4099 CmdArgs.push_back(Args.MakeArgString("-fms-compatibility-version=" + Ver));
4100 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004101
Eric Christopher5ecce122013-02-18 00:38:31 +00004102 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004103 if (Args.hasFlag(options::OPT_fborland_extensions,
4104 options::OPT_fno_borland_extensions, false))
4105 CmdArgs.push_back("-fborland-extensions");
4106
Francois Pichet02744872011-09-01 16:38:08 +00004107 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4108 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004109 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004110 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004111 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004112
Chandler Carruthe03aa552010-04-17 20:17:31 +00004113 // -fgnu-keywords default varies depending on language; only pass if
4114 // specified.
4115 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004116 options::OPT_fno_gnu_keywords))
4117 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004118
Rafael Espindola922a6242011-06-02 17:30:53 +00004119 if (Args.hasFlag(options::OPT_fgnu89_inline,
4120 options::OPT_fno_gnu89_inline,
4121 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004122 CmdArgs.push_back("-fgnu89-inline");
4123
Chad Rosier9c76d242012-03-15 22:31:42 +00004124 if (Args.hasArg(options::OPT_fno_inline))
4125 CmdArgs.push_back("-fno-inline");
4126
Chad Rosier64d6be92012-03-06 21:17:19 +00004127 if (Args.hasArg(options::OPT_fno_inline_functions))
4128 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004129
John McCall5fb5df92012-06-20 06:18:46 +00004130 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004131
John McCall5fb5df92012-06-20 06:18:46 +00004132 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004133 // legacy is the default. Except for deployment taget of 10.5,
4134 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4135 // gets ignored silently.
4136 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004137 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4138 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004139 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004140 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004141 if (getToolChain().UseObjCMixedDispatch())
4142 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4143 else
4144 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4145 }
4146 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004147
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004148 // When ObjectiveC legacy runtime is in effect on MacOSX,
4149 // turn on the option to do Array/Dictionary subscripting
4150 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004151 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4152 getToolChain().getTriple().isMacOSX() &&
4153 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4154 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004155 objcRuntime.isNeXTFamily())
4156 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4157
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004158 // -fencode-extended-block-signature=1 is default.
4159 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4160 CmdArgs.push_back("-fencode-extended-block-signature");
4161 }
4162
John McCall24fc0de2011-07-06 00:26:06 +00004163 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4164 // NOTE: This logic is duplicated in ToolChains.cpp.
4165 bool ARC = isObjCAutoRefCount(Args);
4166 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004167 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004168
John McCall24fc0de2011-07-06 00:26:06 +00004169 CmdArgs.push_back("-fobjc-arc");
4170
Chandler Carruth491db322011-11-04 07:34:47 +00004171 // FIXME: It seems like this entire block, and several around it should be
4172 // wrapped in isObjC, but for now we just use it here as this is where it
4173 // was being used previously.
4174 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4175 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4176 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4177 else
4178 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4179 }
4180
John McCall24fc0de2011-07-06 00:26:06 +00004181 // Allow the user to enable full exceptions code emission.
4182 // We define off for Objective-CC, on for Objective-C++.
4183 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4184 options::OPT_fno_objc_arc_exceptions,
4185 /*default*/ types::isCXX(InputType)))
4186 CmdArgs.push_back("-fobjc-arc-exceptions");
4187 }
4188
4189 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4190 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004191 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004192 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004193
John McCall24fc0de2011-07-06 00:26:06 +00004194 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4195 // takes precedence.
4196 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4197 if (!GCArg)
4198 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4199 if (GCArg) {
4200 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004201 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004202 << GCArg->getAsString(Args);
4203 } else if (getToolChain().SupportsObjCGC()) {
4204 GCArg->render(Args, CmdArgs);
4205 } else {
4206 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004207 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004208 << GCArg->getAsString(Args);
4209 }
4210 }
4211
Reid Klecknerc542d372014-06-27 17:02:02 +00004212 // Handle GCC-style exception args.
4213 if (!C.getDriver().IsCLMode())
4214 addExceptionArgs(Args, InputType, getToolChain().getTriple(), KernelOrKext,
4215 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004216
4217 if (getToolChain().UseSjLjExceptions())
4218 CmdArgs.push_back("-fsjlj-exceptions");
4219
4220 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004221 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4222 options::OPT_fno_assume_sane_operator_new))
4223 CmdArgs.push_back("-fno-assume-sane-operator-new");
4224
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004225 // -fconstant-cfstrings is default, and may be subject to argument translation
4226 // on Darwin.
4227 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4228 options::OPT_fno_constant_cfstrings) ||
4229 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4230 options::OPT_mno_constant_cfstrings))
4231 CmdArgs.push_back("-fno-constant-cfstrings");
4232
John Thompsoned4e2952009-11-05 20:14:16 +00004233 // -fshort-wchar default varies depending on platform; only
4234 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004235 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4236 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004237 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004238
Hans Wennborg28c96312013-07-31 23:39:13 +00004239 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004240 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004241 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004242 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004243 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004244
Daniel Dunbar096ed292011-10-05 21:04:55 +00004245 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4246 // -fno-pack-struct doesn't apply to -fpack-struct=.
4247 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004248 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004249 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004250 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004251 } else if (Args.hasFlag(options::OPT_fpack_struct,
4252 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004253 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004254 }
4255
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004256 // Handle -fmax-type-align=N and -fno-type-align
4257 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4258 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4259 if (!SkipMaxTypeAlign) {
4260 std::string MaxTypeAlignStr = "-fmax-type-align=";
4261 MaxTypeAlignStr += A->getValue();
4262 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4263 }
4264 } else if (getToolChain().getTriple().isOSDarwin()) {
4265 if (!SkipMaxTypeAlign) {
4266 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4267 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4268 }
4269 }
4270
Robert Lytton0e076492013-08-13 09:43:10 +00004271 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004272 if (!Args.hasArg(options::OPT_fcommon))
4273 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004274 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004275 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004276
Daniel Dunbard18049a2009-04-07 21:16:11 +00004277 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004278 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004279 CmdArgs.push_back("-fno-common");
4280
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004281 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004282 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004283 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004284 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004285 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004286 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4287
Daniel Dunbar6358d682010-10-15 22:30:42 +00004288 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4289 if (!Args.hasFlag(options::OPT_ffor_scope,
4290 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004291 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004292 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4293
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004294 // -finput_charset=UTF-8 is default. Reject others
4295 if (Arg *inputCharset = Args.getLastArg(
4296 options::OPT_finput_charset_EQ)) {
4297 StringRef value = inputCharset->getValue();
4298 if (value != "UTF-8")
4299 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4300 }
4301
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004302 // -fexec_charset=UTF-8 is default. Reject others
4303 if (Arg *execCharset = Args.getLastArg(
4304 options::OPT_fexec_charset_EQ)) {
4305 StringRef value = execCharset->getValue();
4306 if (value != "UTF-8")
4307 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4308 }
4309
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004310 // -fcaret-diagnostics is default.
4311 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4312 options::OPT_fno_caret_diagnostics, true))
4313 CmdArgs.push_back("-fno-caret-diagnostics");
4314
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004315 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004316 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004317 options::OPT_fno_diagnostics_fixit_info))
4318 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004319
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004320 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004321 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004322 options::OPT_fno_diagnostics_show_option))
4323 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004324
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004325 if (const Arg *A =
4326 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4327 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004328 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004329 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004330
Douglas Gregor643c9222011-05-21 17:07:29 +00004331 if (const Arg *A =
4332 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4333 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004334 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004335 }
4336
Chandler Carruthb6766f02011-03-27 01:50:55 +00004337 if (Arg *A = Args.getLastArg(
4338 options::OPT_fdiagnostics_show_note_include_stack,
4339 options::OPT_fno_diagnostics_show_note_include_stack)) {
4340 if (A->getOption().matches(
4341 options::OPT_fdiagnostics_show_note_include_stack))
4342 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4343 else
4344 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4345 }
4346
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004347 // Color diagnostics are the default, unless the terminal doesn't support
4348 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004349 // Support both clang's -f[no-]color-diagnostics and gcc's
4350 // -f[no-]diagnostics-colors[=never|always|auto].
4351 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004352 for (const auto &Arg : Args) {
4353 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004354 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4355 !O.matches(options::OPT_fdiagnostics_color) &&
4356 !O.matches(options::OPT_fno_color_diagnostics) &&
4357 !O.matches(options::OPT_fno_diagnostics_color) &&
4358 !O.matches(options::OPT_fdiagnostics_color_EQ))
4359 continue;
4360
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004361 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004362 if (O.matches(options::OPT_fcolor_diagnostics) ||
4363 O.matches(options::OPT_fdiagnostics_color)) {
4364 ShowColors = Colors_On;
4365 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4366 O.matches(options::OPT_fno_diagnostics_color)) {
4367 ShowColors = Colors_Off;
4368 } else {
4369 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004370 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004371 if (value == "always")
4372 ShowColors = Colors_On;
4373 else if (value == "never")
4374 ShowColors = Colors_Off;
4375 else if (value == "auto")
4376 ShowColors = Colors_Auto;
4377 else
4378 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4379 << ("-fdiagnostics-color=" + value).str();
4380 }
4381 }
4382 if (ShowColors == Colors_On ||
4383 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004384 CmdArgs.push_back("-fcolor-diagnostics");
4385
Nico Rieck7857d462013-09-11 00:38:02 +00004386 if (Args.hasArg(options::OPT_fansi_escape_codes))
4387 CmdArgs.push_back("-fansi-escape-codes");
4388
Daniel Dunbardb097022009-06-08 21:13:54 +00004389 if (!Args.hasFlag(options::OPT_fshow_source_location,
4390 options::OPT_fno_show_source_location))
4391 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004392
Douglas Gregor643c9222011-05-21 17:07:29 +00004393 if (!Args.hasFlag(options::OPT_fshow_column,
4394 options::OPT_fno_show_column,
4395 true))
4396 CmdArgs.push_back("-fno-show-column");
4397
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004398 if (!Args.hasFlag(options::OPT_fspell_checking,
4399 options::OPT_fno_spell_checking))
4400 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004401
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004402
Chad Rosierc8e56e82012-12-05 21:08:21 +00004403 // -fno-asm-blocks is default.
4404 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4405 false))
4406 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004407
Steven Wucb0d13f2015-01-16 23:05:28 +00004408 // -fgnu-inline-asm is default.
4409 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4410 options::OPT_fno_gnu_inline_asm, true))
4411 CmdArgs.push_back("-fno-gnu-inline-asm");
4412
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004413 // Enable vectorization per default according to the optimization level
4414 // selected. For optimization levels that want vectorization we use the alias
4415 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004416 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004417 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004418 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004419 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004420 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004421 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004422
Chad Rosier136d67d2014-04-28 19:30:57 +00004423 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004424 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4425 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004426 options::OPT_fslp_vectorize;
4427 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004428 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004429 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004430
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004431 // -fno-slp-vectorize-aggressive is default.
4432 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004433 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004434 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004435
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004436 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4437 A->render(Args, CmdArgs);
4438
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004439 // -fdollars-in-identifiers default varies depending on platform and
4440 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004441 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004442 options::OPT_fno_dollars_in_identifiers)) {
4443 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004444 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004445 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004446 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004447 }
4448
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004449 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4450 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004451 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004452 options::OPT_fno_unit_at_a_time)) {
4453 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004454 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004455 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004456
Eli Friedman055c9702011-11-02 01:53:16 +00004457 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4458 options::OPT_fno_apple_pragma_pack, false))
4459 CmdArgs.push_back("-fapple-pragma-pack");
4460
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004461 // le32-specific flags:
4462 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4463 // by default.
4464 if (getToolChain().getArch() == llvm::Triple::le32) {
4465 CmdArgs.push_back("-fno-math-builtin");
4466 }
4467
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004468 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004469 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004470 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004471#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004472 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004473 (getToolChain().getArch() == llvm::Triple::arm ||
4474 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004475 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4476 CmdArgs.push_back("-fno-builtin-strcat");
4477 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4478 CmdArgs.push_back("-fno-builtin-strcpy");
4479 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004480#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004481
Justin Bognera88f0122014-06-20 22:59:50 +00004482 // Enable rewrite includes if the user's asked for it or if we're generating
4483 // diagnostics.
4484 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4485 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004486 if (Args.hasFlag(options::OPT_frewrite_includes,
4487 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004488 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004489 CmdArgs.push_back("-frewrite-includes");
4490
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004491 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004492 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004493 options::OPT_traditional_cpp)) {
4494 if (isa<PreprocessJobAction>(JA))
4495 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004496 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004497 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004498 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004499
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004500 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004501 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004502
4503 // Handle serialized diagnostics.
4504 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4505 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004506 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004507 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004508
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004509 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4510 CmdArgs.push_back("-fretain-comments-from-system-headers");
4511
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004512 // Forward -fcomment-block-commands to -cc1.
4513 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004514 // Forward -fparse-all-comments to -cc1.
4515 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004516
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004517 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4518 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004519 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004520 bool OptDisabled = false;
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004521 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4522 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004523 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004524
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004525 // We translate this by hand to the -cc1 argument, since nightly test uses
4526 // it and developers have been trained to spell it with -mllvm.
Bob Wilson23a55f12014-12-21 07:00:00 +00004527 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004528 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004529 OptDisabled = true;
4530 } else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004531 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004532 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004533
Bob Wilson23a55f12014-12-21 07:00:00 +00004534 // With -save-temps, we want to save the unoptimized bitcode output from the
4535 // CompileJobAction, so disable optimizations if they are not already
4536 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004537 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004538 isa<CompileJobAction>(JA))
4539 CmdArgs.push_back("-disable-llvm-optzns");
4540
Daniel Dunbard67a3222009-03-30 06:36:42 +00004541 if (Output.getType() == types::TY_Dependencies) {
4542 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004543 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004544 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004545 CmdArgs.push_back(Output.getFilename());
4546 } else {
4547 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004548 }
4549
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004550 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004551 addDashXForInput(Args, II, CmdArgs);
4552
Daniel Dunbarb440f562010-08-02 02:38:21 +00004553 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004554 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004555 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004556 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004557 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004558
Chris Lattnere9d7d782009-11-03 19:50:27 +00004559 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4560
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004561 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004562
4563 // Optionally embed the -cc1 level arguments into the debug info, for build
4564 // analysis.
4565 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004566 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004567 for (const auto &Arg : Args)
4568 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004569
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004570 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004571 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004572 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004573 SmallString<128> EscapedArg;
4574 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004575 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004576 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004577 }
4578 CmdArgs.push_back("-dwarf-debug-flags");
4579 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4580 }
4581
Eric Christopherd3804002013-02-22 20:12:52 +00004582 // Add the split debug info name to the command lines here so we
4583 // can propagate it to the backend.
4584 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004585 getToolChain().getTriple().isOSLinux() &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004586 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4587 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004588 const char *SplitDwarfOut;
4589 if (SplitDwarf) {
4590 CmdArgs.push_back("-split-dwarf-file");
4591 SplitDwarfOut = SplitDebugName(Args, Inputs);
4592 CmdArgs.push_back(SplitDwarfOut);
4593 }
4594
4595 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004596 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004597 Output.getType() == types::TY_Object &&
4598 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004599 auto CLCommand =
4600 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4601 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4602 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004603 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004604 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004605 }
4606
Daniel Dunbar17731772009-03-23 19:03:36 +00004607
Eric Christopherf1545832013-02-22 23:50:16 +00004608 // Handle the debug info splitting at object creation time if we're
4609 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004610 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004611 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004612 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004613
Roman Divacky178e01602011-02-10 16:52:03 +00004614 if (Arg *A = Args.getLastArg(options::OPT_pg))
4615 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004616 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004617 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004618
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004619 // Claim some arguments which clang supports automatically.
4620
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004621 // -fpch-preprocess is used with gcc to add a special marker in the output to
4622 // include the PCH file. Clang's PTH solution is completely transparent, so we
4623 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004624 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004625
Daniel Dunbar17731772009-03-23 19:03:36 +00004626 // Claim some arguments which clang doesn't support, but we don't
4627 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004628 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4629 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004630
Rafael Espindolab0092d72013-09-04 19:37:35 +00004631 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004632 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004633}
4634
John McCall5fb5df92012-06-20 06:18:46 +00004635/// Add options related to the Objective-C runtime/ABI.
4636///
4637/// Returns true if the runtime is non-fragile.
4638ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4639 ArgStringList &cmdArgs,
4640 RewriteKind rewriteKind) const {
4641 // Look for the controlling runtime option.
4642 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4643 options::OPT_fgnu_runtime,
4644 options::OPT_fobjc_runtime_EQ);
4645
4646 // Just forward -fobjc-runtime= to the frontend. This supercedes
4647 // options about fragility.
4648 if (runtimeArg &&
4649 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4650 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004651 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004652 if (runtime.tryParse(value)) {
4653 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4654 << value;
4655 }
4656
4657 runtimeArg->render(args, cmdArgs);
4658 return runtime;
4659 }
4660
4661 // Otherwise, we'll need the ABI "version". Version numbers are
4662 // slightly confusing for historical reasons:
4663 // 1 - Traditional "fragile" ABI
4664 // 2 - Non-fragile ABI, version 1
4665 // 3 - Non-fragile ABI, version 2
4666 unsigned objcABIVersion = 1;
4667 // If -fobjc-abi-version= is present, use that to set the version.
4668 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004669 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004670 if (value == "1")
4671 objcABIVersion = 1;
4672 else if (value == "2")
4673 objcABIVersion = 2;
4674 else if (value == "3")
4675 objcABIVersion = 3;
4676 else
4677 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4678 << value;
4679 } else {
4680 // Otherwise, determine if we are using the non-fragile ABI.
4681 bool nonFragileABIIsDefault =
4682 (rewriteKind == RK_NonFragile ||
4683 (rewriteKind == RK_None &&
4684 getToolChain().IsObjCNonFragileABIDefault()));
4685 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4686 options::OPT_fno_objc_nonfragile_abi,
4687 nonFragileABIIsDefault)) {
4688 // Determine the non-fragile ABI version to use.
4689#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4690 unsigned nonFragileABIVersion = 1;
4691#else
4692 unsigned nonFragileABIVersion = 2;
4693#endif
4694
4695 if (Arg *abiArg = args.getLastArg(
4696 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004697 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004698 if (value == "1")
4699 nonFragileABIVersion = 1;
4700 else if (value == "2")
4701 nonFragileABIVersion = 2;
4702 else
4703 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4704 << value;
4705 }
4706
4707 objcABIVersion = 1 + nonFragileABIVersion;
4708 } else {
4709 objcABIVersion = 1;
4710 }
4711 }
4712
4713 // We don't actually care about the ABI version other than whether
4714 // it's non-fragile.
4715 bool isNonFragile = objcABIVersion != 1;
4716
4717 // If we have no runtime argument, ask the toolchain for its default runtime.
4718 // However, the rewriter only really supports the Mac runtime, so assume that.
4719 ObjCRuntime runtime;
4720 if (!runtimeArg) {
4721 switch (rewriteKind) {
4722 case RK_None:
4723 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4724 break;
4725 case RK_Fragile:
4726 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4727 break;
4728 case RK_NonFragile:
4729 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4730 break;
4731 }
4732
4733 // -fnext-runtime
4734 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4735 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004736 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004737 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4738
4739 // Otherwise, build for a generic macosx port.
4740 } else {
4741 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4742 }
4743
4744 // -fgnu-runtime
4745 } else {
4746 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004747 // Legacy behaviour is to target the gnustep runtime if we are i
4748 // non-fragile mode or the GCC runtime in fragile mode.
4749 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004750 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004751 else
4752 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004753 }
4754
4755 cmdArgs.push_back(args.MakeArgString(
4756 "-fobjc-runtime=" + runtime.getAsString()));
4757 return runtime;
4758}
4759
Reid Klecknerc542d372014-06-27 17:02:02 +00004760static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4761 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4762 I += HaveDash;
4763 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004764}
Reid Klecknerc542d372014-06-27 17:02:02 +00004765
4766struct EHFlags {
4767 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4768 bool Synch;
4769 bool Asynch;
4770 bool NoExceptC;
4771};
4772
4773/// /EH controls whether to run destructor cleanups when exceptions are
4774/// thrown. There are three modifiers:
4775/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4776/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4777/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4778/// - c: Assume that extern "C" functions are implicitly noexcept. This
4779/// modifier is an optimization, so we ignore it for now.
4780/// The default is /EHs-c-, meaning cleanups are disabled.
4781static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4782 EHFlags EH;
4783 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4784 for (auto EHVal : EHArgs) {
4785 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4786 switch (EHVal[I]) {
4787 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4788 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4789 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4790 default: break;
4791 }
4792 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4793 break;
4794 }
4795 }
4796 return EH;
4797}
4798
Hans Wennborg75958c42013-08-08 00:17:41 +00004799void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4800 unsigned RTOptionID = options::OPT__SLASH_MT;
4801
Hans Wennborgf1a74252013-09-10 20:18:04 +00004802 if (Args.hasArg(options::OPT__SLASH_LDd))
4803 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4804 // but defining _DEBUG is sticky.
4805 RTOptionID = options::OPT__SLASH_MTd;
4806
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004807 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004808 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004809
Hans Wennborg75958c42013-08-08 00:17:41 +00004810 switch(RTOptionID) {
4811 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004812 if (Args.hasArg(options::OPT__SLASH_LDd))
4813 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004814 CmdArgs.push_back("-D_MT");
4815 CmdArgs.push_back("-D_DLL");
4816 CmdArgs.push_back("--dependent-lib=msvcrt");
4817 break;
4818 case options::OPT__SLASH_MDd:
4819 CmdArgs.push_back("-D_DEBUG");
4820 CmdArgs.push_back("-D_MT");
4821 CmdArgs.push_back("-D_DLL");
4822 CmdArgs.push_back("--dependent-lib=msvcrtd");
4823 break;
4824 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004825 if (Args.hasArg(options::OPT__SLASH_LDd))
4826 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004827 CmdArgs.push_back("-D_MT");
4828 CmdArgs.push_back("--dependent-lib=libcmt");
4829 break;
4830 case options::OPT__SLASH_MTd:
4831 CmdArgs.push_back("-D_DEBUG");
4832 CmdArgs.push_back("-D_MT");
4833 CmdArgs.push_back("--dependent-lib=libcmtd");
4834 break;
4835 default:
4836 llvm_unreachable("Unexpected option ID.");
4837 }
4838
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004839 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4840 // users want. The /Za flag to cl.exe turns this off, but it's not
4841 // implemented in clang.
4842 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004843
Hans Wennborg8858a032014-07-21 23:42:07 +00004844 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4845 // would produce interleaved output, so ignore /showIncludes in such cases.
4846 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4847 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4848 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004849
David Majnemerf6072342014-07-01 22:24:56 +00004850 // This controls whether or not we emit RTTI data for polymorphic types.
4851 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4852 /*default=*/false))
4853 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004854
Reid Klecknerc542d372014-06-27 17:02:02 +00004855 const Driver &D = getToolChain().getDriver();
4856 EHFlags EH = parseClangCLEHFlags(D, Args);
4857 // FIXME: Do something with NoExceptC.
Reid Klecknerab80f182015-01-30 01:04:16 +00004858 if (EH.Synch || EH.Asynch)
Reid Klecknerc542d372014-06-27 17:02:02 +00004859 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerab80f182015-01-30 01:04:16 +00004860 // Always add -fexceptions to allow SEH __try.
4861 CmdArgs.push_back("-fexceptions");
Reid Klecknerc542d372014-06-27 17:02:02 +00004862
Hans Wennborge50cec32014-06-13 20:59:54 +00004863 // /EP should expand to -E -P.
4864 if (Args.hasArg(options::OPT__SLASH_EP)) {
4865 CmdArgs.push_back("-E");
4866 CmdArgs.push_back("-P");
4867 }
4868
David Majnemer86c318f2014-02-11 21:05:00 +00004869 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4870 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4871 if (MostGeneralArg && BestCaseArg)
4872 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4873 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4874
4875 if (MostGeneralArg) {
4876 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4877 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4878 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4879
4880 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4881 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4882 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4883 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4884 << FirstConflict->getAsString(Args)
4885 << SecondConflict->getAsString(Args);
4886
4887 if (SingleArg)
4888 CmdArgs.push_back("-fms-memptr-rep=single");
4889 else if (MultipleArg)
4890 CmdArgs.push_back("-fms-memptr-rep=multiple");
4891 else
4892 CmdArgs.push_back("-fms-memptr-rep=virtual");
4893 }
4894
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00004895 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4896 A->render(Args, CmdArgs);
4897
Hans Wennborg81f74482013-09-10 01:07:07 +00004898 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4899 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004900 if (Args.hasArg(options::OPT__SLASH_fallback))
4901 CmdArgs.push_back("msvc-fallback");
4902 else
4903 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004904 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004905}
4906
Hans Wennborg1da044a2014-06-26 19:59:02 +00004907visualstudio::Compile *Clang::getCLFallback() const {
4908 if (!CLFallback)
4909 CLFallback.reset(new visualstudio::Compile(getToolChain()));
4910 return CLFallback.get();
4911}
4912
Daniel Sanders7f933f42015-01-30 17:35:23 +00004913void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
4914 ArgStringList &CmdArgs) const {
4915 StringRef CPUName;
4916 StringRef ABIName;
4917 const llvm::Triple &Triple = getToolChain().getTriple();
4918 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
4919
4920 CmdArgs.push_back("-target-abi");
4921 CmdArgs.push_back(ABIName.data());
4922}
4923
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004924void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004925 const InputInfo &Output,
4926 const InputInfoList &Inputs,
4927 const ArgList &Args,
4928 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004929 ArgStringList CmdArgs;
4930
4931 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4932 const InputInfo &Input = Inputs[0];
4933
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004934 // Don't warn about "clang -w -c foo.s"
4935 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004936 // and "clang -emit-llvm -c foo.s"
4937 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004938
Rafael Espindola577637a2015-01-03 00:06:04 +00004939 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00004940
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004941 // Invoke ourselves in -cc1as mode.
4942 //
4943 // FIXME: Implement custom jobs for internal actions.
4944 CmdArgs.push_back("-cc1as");
4945
4946 // Add the "effective" target triple.
4947 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004948 std::string TripleStr =
4949 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004950 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4951
4952 // Set the output mode, we currently only expect to be used as a real
4953 // assembler.
4954 CmdArgs.push_back("-filetype");
4955 CmdArgs.push_back("obj");
4956
Eric Christopher45f2e712012-12-18 00:31:10 +00004957 // Set the main file name, so that debug info works even with
4958 // -save-temps or preprocessed assembly.
4959 CmdArgs.push_back("-main-file-name");
4960 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4961
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004962 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004963 const llvm::Triple &Triple = getToolChain().getTriple();
4964 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004965 if (!CPU.empty()) {
4966 CmdArgs.push_back("-target-cpu");
4967 CmdArgs.push_back(Args.MakeArgString(CPU));
4968 }
4969
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004970 // Add the target features
4971 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004972 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004973
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004974 // Ignore explicit -force_cpusubtype_ALL option.
4975 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004976
Eric Christopherfc3ee562012-01-10 00:38:01 +00004977 // Determine the original source input.
4978 const Action *SourceAction = &JA;
4979 while (SourceAction->getKind() != Action::InputClass) {
4980 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4981 SourceAction = SourceAction->getInputs()[0];
4982 }
4983
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004984 // Forward -g and handle debug info related flags, assuming we are dealing
4985 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004986 if (SourceAction->getType() == types::TY_Asm ||
4987 SourceAction->getType() == types::TY_PP_Asm) {
4988 Args.ClaimAllArgs(options::OPT_g_Group);
4989 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4990 if (!A->getOption().matches(options::OPT_g0))
4991 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004992
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00004993 if (Args.hasArg(options::OPT_gdwarf_2))
4994 CmdArgs.push_back("-gdwarf-2");
4995 if (Args.hasArg(options::OPT_gdwarf_3))
4996 CmdArgs.push_back("-gdwarf-3");
4997 if (Args.hasArg(options::OPT_gdwarf_4))
4998 CmdArgs.push_back("-gdwarf-4");
4999
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005000 // Add the -fdebug-compilation-dir flag if needed.
5001 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005002
5003 // Set the AT_producer to the clang version when using the integrated
5004 // assembler on assembly source files.
5005 CmdArgs.push_back("-dwarf-debug-producer");
5006 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00005007 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005008
5009 // Optionally embed the -cc1as level arguments into the debug info, for build
5010 // analysis.
5011 if (getToolChain().UseDwarfDebugFlags()) {
5012 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005013 for (const auto &Arg : Args)
5014 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005015
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005016 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005017 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5018 Flags += Exec;
5019 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005020 SmallString<128> EscapedArg;
5021 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005022 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005023 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005024 }
5025 CmdArgs.push_back("-dwarf-debug-flags");
5026 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
5027 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005028
5029 // FIXME: Add -static support, once we have it.
5030
Daniel Sanders7f933f42015-01-30 17:35:23 +00005031 // Add target specific flags.
5032 switch(getToolChain().getArch()) {
5033 default:
5034 break;
5035
5036 case llvm::Triple::mips:
5037 case llvm::Triple::mipsel:
5038 case llvm::Triple::mips64:
5039 case llvm::Triple::mips64el:
5040 AddMIPSTargetArgs(Args, CmdArgs);
5041 break;
5042 }
5043
David Blaikie372d9502014-01-17 03:17:40 +00005044 // Consume all the warning flags. Usually this would be handled more
5045 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5046 // doesn't handle that so rather than warning about unused flags that are
5047 // actually used, we'll lie by omission instead.
5048 // FIXME: Stop lying and consume only the appropriate driver flags
5049 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
5050 ie = Args.filtered_end();
5051 it != ie; ++it)
5052 (*it)->claim();
5053
David Blaikie9260ed62013-07-25 21:19:01 +00005054 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5055 getToolChain().getDriver());
5056
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005057 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005058
5059 assert(Output.isFilename() && "Unexpected lipo output.");
5060 CmdArgs.push_back("-o");
5061 CmdArgs.push_back(Output.getFilename());
5062
Daniel Dunbarb440f562010-08-02 02:38:21 +00005063 assert(Input.isFilename() && "Invalid input.");
5064 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005065
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005066 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005067 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005068
5069 // Handle the debug info splitting at object creation time if we're
5070 // creating an object.
5071 // TODO: Currently only works on linux with newer objcopy.
5072 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005073 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005074 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
5075 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005076}
5077
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005078void GnuTool::anchor() {}
5079
Daniel Dunbara3246a02009-03-18 08:07:30 +00005080void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005081 const InputInfo &Output,
5082 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005083 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005084 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005085 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005086 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005087
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005088 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005089 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005090 // Don't forward any -g arguments to assembly steps.
5091 if (isa<AssembleJobAction>(JA) &&
5092 A->getOption().matches(options::OPT_g_Group))
5093 continue;
5094
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005095 // Don't forward any -W arguments to assembly and link steps.
5096 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5097 A->getOption().matches(options::OPT_W_Group))
5098 continue;
5099
Daniel Dunbar2da02722009-03-19 07:55:12 +00005100 // It is unfortunate that we have to claim here, as this means
5101 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005102 // platforms using a generic gcc, even if we are just using gcc
5103 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005104 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005105 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005106 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005107 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005108
Daniel Dunbar4e295052010-01-25 22:35:08 +00005109 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005110
5111 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005112 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005113 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005114 CmdArgs.push_back(
5115 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005116 }
5117
Daniel Dunbar5716d872009-05-02 21:41:52 +00005118 // Try to force gcc to match the tool chain we want, if we recognize
5119 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005120 //
5121 // FIXME: The triple class should directly provide the information we want
5122 // here.
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005123 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005124 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005125 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005126 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5127 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005128 CmdArgs.push_back("-m64");
5129
Daniel Dunbarb440f562010-08-02 02:38:21 +00005130 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005131 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005132 CmdArgs.push_back(Output.getFilename());
5133 } else {
5134 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005135 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005136 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005137
Tony Linthicum76329bf2011-12-12 21:14:55 +00005138 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5139 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005140
5141 // Only pass -x if gcc will understand it; otherwise hope gcc
5142 // understands the suffix correctly. The main use case this would go
5143 // wrong in is for linker inputs if they happened to have an odd
5144 // suffix; really the only way to get this to happen is a command
5145 // like '-x foobar a.c' which will treat a.c like a linker input.
5146 //
5147 // FIXME: For the linker case specifically, can we safely convert
5148 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005149 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005150 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005151 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5152 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005153 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005154 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005155 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005156 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005157 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005158 else if (II.getType() == types::TY_ModuleFile)
5159 D.Diag(diag::err_drv_no_module_support)
5160 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005161
Daniel Dunbara3246a02009-03-18 08:07:30 +00005162 if (types::canTypeBeUserSpecified(II.getType())) {
5163 CmdArgs.push_back("-x");
5164 CmdArgs.push_back(types::getTypeName(II.getType()));
5165 }
5166
Daniel Dunbarb440f562010-08-02 02:38:21 +00005167 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005168 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005169 else {
5170 const Arg &A = II.getInputArg();
5171
5172 // Reverse translate some rewritten options.
5173 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5174 CmdArgs.push_back("-lstdc++");
5175 continue;
5176 }
5177
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005178 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005179 A.render(Args, CmdArgs);
5180 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005181 }
5182
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005183 const std::string customGCCName = D.getCCCGenericGCCName();
5184 const char *GCCName;
5185 if (!customGCCName.empty())
5186 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005187 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005188 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005189 } else
5190 GCCName = "gcc";
5191
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005192 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005193 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005194 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005195}
5196
Daniel Dunbar4e295052010-01-25 22:35:08 +00005197void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5198 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005199 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005200}
5201
Daniel Dunbar4e295052010-01-25 22:35:08 +00005202void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5203 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005204 const Driver &D = getToolChain().getDriver();
5205
Eric Christophercc7ff502015-01-29 00:56:17 +00005206 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005207 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005208 case types::TY_LLVM_IR:
5209 case types::TY_LTO_IR:
5210 case types::TY_LLVM_BC:
5211 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005212 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005213 break;
5214 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005215 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005216 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005217 case types::TY_Nothing:
5218 CmdArgs.push_back("-fsyntax-only");
5219 break;
5220 default:
5221 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005222 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005223}
5224
Daniel Dunbar4e295052010-01-25 22:35:08 +00005225void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5226 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005227 // The types are (hopefully) good enough.
5228}
5229
Tony Linthicum76329bf2011-12-12 21:14:55 +00005230// Hexagon tools start.
5231void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5232 ArgStringList &CmdArgs) const {
5233
5234}
5235void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5236 const InputInfo &Output,
5237 const InputInfoList &Inputs,
5238 const ArgList &Args,
5239 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005240 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005241
5242 const Driver &D = getToolChain().getDriver();
5243 ArgStringList CmdArgs;
5244
5245 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005246 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005247 CmdArgs.push_back(Args.MakeArgString(MarchString));
5248
5249 RenderExtraToolArgs(JA, CmdArgs);
5250
5251 if (Output.isFilename()) {
5252 CmdArgs.push_back("-o");
5253 CmdArgs.push_back(Output.getFilename());
5254 } else {
5255 assert(Output.isNothing() && "Unexpected output");
5256 CmdArgs.push_back("-fsyntax-only");
5257 }
5258
Matthew Curtise8f80a12012-12-06 17:49:03 +00005259 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5260 if (!SmallDataThreshold.empty())
5261 CmdArgs.push_back(
5262 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005263
Matthew Curtise5df3812012-12-07 17:23:04 +00005264 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5265 options::OPT_Xassembler);
5266
Tony Linthicum76329bf2011-12-12 21:14:55 +00005267 // Only pass -x if gcc will understand it; otherwise hope gcc
5268 // understands the suffix correctly. The main use case this would go
5269 // wrong in is for linker inputs if they happened to have an odd
5270 // suffix; really the only way to get this to happen is a command
5271 // like '-x foobar a.c' which will treat a.c like a linker input.
5272 //
5273 // FIXME: For the linker case specifically, can we safely convert
5274 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005275 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005276 // Don't try to pass LLVM or AST inputs to a generic gcc.
5277 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5278 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5279 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5280 << getToolChain().getTripleString();
5281 else if (II.getType() == types::TY_AST)
5282 D.Diag(clang::diag::err_drv_no_ast_support)
5283 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005284 else if (II.getType() == types::TY_ModuleFile)
5285 D.Diag(diag::err_drv_no_module_support)
5286 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005287
5288 if (II.isFilename())
5289 CmdArgs.push_back(II.getFilename());
5290 else
5291 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5292 II.getInputArg().render(Args, CmdArgs);
5293 }
5294
5295 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005296 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005297 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005298}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005299
Tony Linthicum76329bf2011-12-12 21:14:55 +00005300void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5301 ArgStringList &CmdArgs) const {
5302 // The types are (hopefully) good enough.
5303}
5304
5305void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5306 const InputInfo &Output,
5307 const InputInfoList &Inputs,
5308 const ArgList &Args,
5309 const char *LinkingOutput) const {
5310
Matthew Curtise689b052012-12-06 15:46:07 +00005311 const toolchains::Hexagon_TC& ToolChain =
5312 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5313 const Driver &D = ToolChain.getDriver();
5314
Tony Linthicum76329bf2011-12-12 21:14:55 +00005315 ArgStringList CmdArgs;
5316
Matthew Curtise689b052012-12-06 15:46:07 +00005317 //----------------------------------------------------------------------------
5318 //
5319 //----------------------------------------------------------------------------
5320 bool hasStaticArg = Args.hasArg(options::OPT_static);
5321 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005322 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005323 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5324 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5325 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5326 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005327
Matthew Curtise689b052012-12-06 15:46:07 +00005328 //----------------------------------------------------------------------------
5329 // Silence warnings for various options
5330 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005331
Matthew Curtise689b052012-12-06 15:46:07 +00005332 Args.ClaimAllArgs(options::OPT_g_Group);
5333 Args.ClaimAllArgs(options::OPT_emit_llvm);
5334 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5335 // handled somewhere else.
5336 Args.ClaimAllArgs(options::OPT_static_libgcc);
5337
5338 //----------------------------------------------------------------------------
5339 //
5340 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005341 for (const auto &Opt : ToolChain.ExtraOpts)
5342 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005343
Matthew Curtisf10a5952012-12-06 14:16:43 +00005344 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5345 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005346
Matthew Curtise689b052012-12-06 15:46:07 +00005347 if (buildingLib) {
5348 CmdArgs.push_back("-shared");
5349 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5350 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005351 }
5352
Matthew Curtise689b052012-12-06 15:46:07 +00005353 if (hasStaticArg)
5354 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005355
Matthew Curtise8f80a12012-12-06 17:49:03 +00005356 if (buildPIE && !buildingLib)
5357 CmdArgs.push_back("-pie");
5358
5359 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5360 if (!SmallDataThreshold.empty()) {
5361 CmdArgs.push_back(
5362 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5363 }
5364
Matthew Curtise689b052012-12-06 15:46:07 +00005365 //----------------------------------------------------------------------------
5366 //
5367 //----------------------------------------------------------------------------
5368 CmdArgs.push_back("-o");
5369 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005370
Matthew Curtise689b052012-12-06 15:46:07 +00005371 const std::string MarchSuffix = "/" + MarchString;
5372 const std::string G0Suffix = "/G0";
5373 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005374 const std::string RootDir =
5375 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005376 const std::string StartFilesDir = RootDir
5377 + "hexagon/lib"
5378 + (buildingLib
5379 ? MarchG0Suffix : MarchSuffix);
5380
5381 //----------------------------------------------------------------------------
5382 // moslib
5383 //----------------------------------------------------------------------------
5384 std::vector<std::string> oslibs;
5385 bool hasStandalone= false;
5386
5387 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5388 ie = Args.filtered_end(); it != ie; ++it) {
5389 (*it)->claim();
5390 oslibs.push_back((*it)->getValue());
5391 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005392 }
Matthew Curtise689b052012-12-06 15:46:07 +00005393 if (oslibs.empty()) {
5394 oslibs.push_back("standalone");
5395 hasStandalone = true;
5396 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005397
Matthew Curtise689b052012-12-06 15:46:07 +00005398 //----------------------------------------------------------------------------
5399 // Start Files
5400 //----------------------------------------------------------------------------
5401 if (incStdLib && incStartFiles) {
5402
5403 if (!buildingLib) {
5404 if (hasStandalone) {
5405 CmdArgs.push_back(
5406 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5407 }
5408 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5409 }
5410 std::string initObj = useShared ? "/initS.o" : "/init.o";
5411 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5412 }
5413
5414 //----------------------------------------------------------------------------
5415 // Library Search Paths
5416 //----------------------------------------------------------------------------
5417 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005418 for (const auto &LibPath : LibPaths)
5419 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005420
5421 //----------------------------------------------------------------------------
5422 //
5423 //----------------------------------------------------------------------------
5424 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5425 Args.AddAllArgs(CmdArgs, options::OPT_e);
5426 Args.AddAllArgs(CmdArgs, options::OPT_s);
5427 Args.AddAllArgs(CmdArgs, options::OPT_t);
5428 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5429
5430 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5431
5432 //----------------------------------------------------------------------------
5433 // Libraries
5434 //----------------------------------------------------------------------------
5435 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005436 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005437 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5438 CmdArgs.push_back("-lm");
5439 }
5440
5441 CmdArgs.push_back("--start-group");
5442
5443 if (!buildingLib) {
5444 for(std::vector<std::string>::iterator i = oslibs.begin(),
5445 e = oslibs.end(); i != e; ++i)
5446 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5447 CmdArgs.push_back("-lc");
5448 }
5449 CmdArgs.push_back("-lgcc");
5450
5451 CmdArgs.push_back("--end-group");
5452 }
5453
5454 //----------------------------------------------------------------------------
5455 // End files
5456 //----------------------------------------------------------------------------
5457 if (incStdLib && incStartFiles) {
5458 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5459 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5460 }
5461
5462 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005463 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5464 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005465}
5466// Hexagon tools end.
5467
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005468/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Bernard Ogden31561762013-12-12 13:27:11 +00005469const char *arm::getARMCPUForMArch(const ArgList &Args,
5470 const llvm::Triple &Triple) {
5471 StringRef MArch;
5472 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5473 // Otherwise, if we have -march= choose the base CPU for that arch.
5474 MArch = A->getValue();
5475 } else {
5476 // Otherwise, use the Arch from the triple.
5477 MArch = Triple.getArchName();
5478 }
5479
5480 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005481 if (MArch == "native") {
5482 std::string CPU = llvm::sys::getHostCPUName();
5483 if (CPU != "generic") {
5484 // Translate the native cpu into the architecture. The switch below will
5485 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00005486 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00005487 }
5488 }
5489
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005490 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00005491}
5492
5493/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005494StringRef arm::getARMTargetCPU(const ArgList &Args,
5495 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005496 // FIXME: Warn on inconsistent use of -mcpu and -march.
5497 // If we have -mcpu=, use that.
5498 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5499 StringRef MCPU = A->getValue();
5500 // Handle -mcpu=native.
5501 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005502 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005503 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005504 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005505 }
5506
5507 return getARMCPUForMArch(Args, Triple);
5508}
5509
5510/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5511/// CPU.
5512//
5513// FIXME: This is redundant with -mcpu, why does LLVM use this.
5514// FIXME: tblgen this, or kill it!
5515const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5516 return llvm::StringSwitch<const char *>(CPU)
5517 .Case("strongarm", "v4")
5518 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5519 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5520 .Cases("arm920", "arm920t", "arm922t", "v4t")
5521 .Cases("arm940t", "ep9312","v4t")
5522 .Cases("arm10tdmi", "arm1020t", "v5")
5523 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5524 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5525 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
5526 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
5527 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
5528 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Charlie Turner2919cbd2014-11-06 14:59:30 +00005529 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin5886bc32014-10-13 10:22:48 +00005530 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "v7")
Bernard Ogden31561762013-12-12 13:27:11 +00005531 .Cases("cortex-r4", "cortex-r5", "v7r")
5532 .Case("cortex-m0", "v6m")
5533 .Case("cortex-m3", "v7m")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00005534 .Cases("cortex-m4", "cortex-m7", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005535 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005536 .Case("cyclone", "v8")
Renato Golin84545d72015-02-04 13:31:56 +00005537 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005538 .Default("");
5539}
5540
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005541void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple) {
5542 if (Args.hasArg(options::OPT_r))
5543 return;
5544
5545 StringRef Suffix = getLLVMArchSuffixForARM(getARMCPUForMArch(Args, Triple));
5546 const char *LinkFlag = llvm::StringSwitch<const char *>(Suffix)
5547 .Cases("v4", "v4t", "v5", "v5e", nullptr)
5548 .Cases("v6", "v6t2", nullptr)
5549 .Default("--be8");
5550
5551 if (LinkFlag)
5552 CmdArgs.push_back(LinkFlag);
5553}
5554
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005555bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5556 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5557 return A && (A->getValue() == StringRef(Value));
5558}
5559
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005560bool mips::isUCLibc(const ArgList &Args) {
5561 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005562 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005563}
5564
Daniel Sanders2bf13662014-07-10 14:40:57 +00005565bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005566 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5567 return llvm::StringSwitch<bool>(NaNArg->getValue())
5568 .Case("2008", true)
5569 .Case("legacy", false)
5570 .Default(false);
5571
5572 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005573 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5574 .Cases("mips32r6", "mips64r6", true)
5575 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005576
5577 return false;
5578}
5579
Daniel Sanders379d44b2014-07-16 11:52:23 +00005580bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5581 StringRef ABIName) {
5582 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005583 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005584 return false;
5585
5586 if (ABIName != "32")
5587 return false;
5588
5589 return llvm::StringSwitch<bool>(CPUName)
5590 .Cases("mips2", "mips3", "mips4", "mips5", true)
5591 .Cases("mips32", "mips32r2", true)
5592 .Cases("mips64", "mips64r2", true)
5593 .Default(false);
5594}
5595
Tim Northover157d9112014-01-16 08:48:16 +00005596llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005597 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5598 // archs which Darwin doesn't use.
5599
5600 // The matching this routine does is fairly pointless, since it is neither the
5601 // complete architecture list, nor a reasonable subset. The problem is that
5602 // historically the driver driver accepts this and also ties its -march=
5603 // handling to the architecture name, so we need to be careful before removing
5604 // support for it.
5605
5606 // This code must be kept in sync with Clang's Darwin specific argument
5607 // translation.
5608
5609 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5610 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5611 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5612 .Case("ppc64", llvm::Triple::ppc64)
5613 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5614 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5615 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005616 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005617 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005618 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005619 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005620 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005621 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005622 .Case("r600", llvm::Triple::r600)
Tom Stellardd8e38a32015-01-06 20:34:47 +00005623 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005624 .Case("nvptx", llvm::Triple::nvptx)
5625 .Case("nvptx64", llvm::Triple::nvptx64)
5626 .Case("amdil", llvm::Triple::amdil)
5627 .Case("spir", llvm::Triple::spir)
5628 .Default(llvm::Triple::UnknownArch);
5629}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005630
Tim Northover157d9112014-01-16 08:48:16 +00005631void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5632 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5633 T.setArch(Arch);
5634
5635 if (Str == "x86_64h")
5636 T.setArchName(Str);
5637 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5638 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005639 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005640 }
5641}
5642
Bob Wilsondecc03e2012-11-23 06:14:39 +00005643const char *Clang::getBaseInputName(const ArgList &Args,
5644 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005645 return Args.MakeArgString(
5646 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005647}
5648
Bob Wilsondecc03e2012-11-23 06:14:39 +00005649const char *Clang::getBaseInputStem(const ArgList &Args,
5650 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005651 const char *Str = getBaseInputName(Args, Inputs);
5652
Chris Lattner906bb902011-01-16 08:14:11 +00005653 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005654 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005655
5656 return Str;
5657}
5658
Bob Wilsondecc03e2012-11-23 06:14:39 +00005659const char *Clang::getDependencyFileName(const ArgList &Args,
5660 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005661 // FIXME: Think about this more.
5662 std::string Res;
5663
5664 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005665 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005666 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005667 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005668 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005669 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005670 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005671}
5672
Daniel Dunbarbe220842009-03-20 16:06:39 +00005673void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005674 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005675 const InputInfoList &Inputs,
5676 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005677 const char *LinkingOutput) const {
5678 ArgStringList CmdArgs;
5679
5680 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5681 const InputInfo &Input = Inputs[0];
5682
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005683 // Determine the original source input.
5684 const Action *SourceAction = &JA;
5685 while (SourceAction->getKind() != Action::InputClass) {
5686 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5687 SourceAction = SourceAction->getInputs()[0];
5688 }
5689
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005690 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005691 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005692 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5693 // FIXME: at run-time detect assembler capabilities or rely on version
5694 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005695 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005696 const llvm::Triple &T(getToolChain().getTriple());
5697 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005698 CmdArgs.push_back("-Q");
5699 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005700
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005701 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005702 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005703 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005704 if (Args.hasArg(options::OPT_gstabs))
5705 CmdArgs.push_back("--gstabs");
5706 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005707 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005708 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005709
Daniel Dunbarbe220842009-03-20 16:06:39 +00005710 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005711 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005712
Daniel Dunbar6d484762010-07-22 01:47:22 +00005713 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005714 if (getToolChain().getArch() == llvm::Triple::x86 ||
5715 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005716 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5717 CmdArgs.push_back("-force_cpusubtype_ALL");
5718
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005719 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005720 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005721 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005722 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005723 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005724 CmdArgs.push_back("-static");
5725
Daniel Dunbarbe220842009-03-20 16:06:39 +00005726 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5727 options::OPT_Xassembler);
5728
5729 assert(Output.isFilename() && "Unexpected lipo output.");
5730 CmdArgs.push_back("-o");
5731 CmdArgs.push_back(Output.getFilename());
5732
Daniel Dunbarb440f562010-08-02 02:38:21 +00005733 assert(Input.isFilename() && "Invalid input.");
5734 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005735
5736 // asm_final spec is empty.
5737
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005738 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005739 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00005740 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005741}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005742
Tim Northover157d9112014-01-16 08:48:16 +00005743void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005744
Tim Northover157d9112014-01-16 08:48:16 +00005745void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5746 ArgStringList &CmdArgs) const {
5747 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005748
Daniel Dunbarc1964212009-03-26 16:23:12 +00005749 // Derived from darwin_arch spec.
5750 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005751 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005752
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005753 // FIXME: Is this needed anymore?
5754 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005755 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005756}
5757
Bill Wendling3b2000f2012-10-02 18:02:50 +00005758bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5759 // We only need to generate a temp path for LTO if we aren't compiling object
5760 // files. When compiling source files, we run 'dsymutil' after linking. We
5761 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005762 for (const auto &Input : Inputs)
5763 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00005764 return true;
5765
5766 return false;
5767}
5768
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005769void darwin::Link::AddLinkArgs(Compilation &C,
5770 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005771 ArgStringList &CmdArgs,
5772 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005773 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005774 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005775
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005776 unsigned Version[3] = { 0, 0, 0 };
5777 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5778 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005779 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005780 Version[1], Version[2], HadExtra) ||
5781 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005782 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005783 << A->getAsString(Args);
5784 }
5785
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005786 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005787 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005788 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5789 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005790
Bob Wilson3d27dad2013-08-02 22:25:34 +00005791 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5792 CmdArgs.push_back("-export_dynamic");
5793
Bill Wendling313b6bf2012-11-16 23:03:00 +00005794 // If we are using LTO, then automatically create a temporary file path for
5795 // the linker to use, so that it's lifetime will extend past a possible
5796 // dsymutil step.
5797 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5798 const char *TmpPath = C.getArgs().MakeArgString(
5799 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5800 C.addTempFile(TmpPath);
5801 CmdArgs.push_back("-object_path_lto");
5802 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00005803 }
5804
Daniel Dunbarc1964212009-03-26 16:23:12 +00005805 // Derived from the "link" spec.
5806 Args.AddAllArgs(CmdArgs, options::OPT_static);
5807 if (!Args.hasArg(options::OPT_static))
5808 CmdArgs.push_back("-dynamic");
5809 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5810 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5811 // here. How do we wish to handle such things?
5812 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005813
Daniel Dunbarc1964212009-03-26 16:23:12 +00005814 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00005815 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00005816 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00005817 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005818
5819 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5820 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5821 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5822
5823 Arg *A;
5824 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5825 (A = Args.getLastArg(options::OPT_current__version)) ||
5826 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005827 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005828 << A->getAsString(Args) << "-dynamiclib";
5829
5830 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5831 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5832 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5833 } else {
5834 CmdArgs.push_back("-dylib");
5835
5836 Arg *A;
5837 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5838 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5839 (A = Args.getLastArg(options::OPT_client__name)) ||
5840 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5841 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5842 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005843 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005844 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005845
Daniel Dunbarc1964212009-03-26 16:23:12 +00005846 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5847 "-dylib_compatibility_version");
5848 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5849 "-dylib_current_version");
5850
Tim Northover157d9112014-01-16 08:48:16 +00005851 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005852
5853 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5854 "-dylib_install_name");
5855 }
5856
5857 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5858 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5859 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00005860 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005861 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005862 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5863 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5864 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5865 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5866 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5867 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00005868 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005869 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5870 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5871 Args.AddAllArgs(CmdArgs, options::OPT_init);
5872
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005873 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00005874 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005875
Daniel Dunbarc1964212009-03-26 16:23:12 +00005876 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5877 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5878 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5879 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5880 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005881
Daniel Dunbaraf68a882010-07-13 23:31:40 +00005882 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5883 options::OPT_fno_pie,
5884 options::OPT_fno_PIE)) {
5885 if (A->getOption().matches(options::OPT_fpie) ||
5886 A->getOption().matches(options::OPT_fPIE))
5887 CmdArgs.push_back("-pie");
5888 else
5889 CmdArgs.push_back("-no_pie");
5890 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005891
5892 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5893 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5894 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5895 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5896 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5897 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5898 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5899 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5900 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5901 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5902 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5903 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5904 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5905 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5906 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5907 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005908
Daniel Dunbar84384642011-05-02 21:03:47 +00005909 // Give --sysroot= preference, over the Apple specific behavior to also use
5910 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00005911 StringRef sysroot = C.getSysRoot();
5912 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00005913 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00005914 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00005915 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5916 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00005917 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005918 }
5919
Daniel Dunbarc1964212009-03-26 16:23:12 +00005920 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5921 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5922 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5923 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5924 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005925 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005926 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5927 Args.AddAllArgs(CmdArgs, options::OPT_y);
5928 Args.AddLastArg(CmdArgs, options::OPT_w);
5929 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5930 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5931 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5932 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5933 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5934 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5935 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5936 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5937 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5938 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5939 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5940 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5941}
5942
Alexey Bataev186b28a2014-03-06 05:43:53 +00005943enum LibOpenMP {
5944 LibUnknown,
5945 LibGOMP,
5946 LibIOMP5
5947};
5948
Daniel Dunbarc1964212009-03-26 16:23:12 +00005949void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005950 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005951 const InputInfoList &Inputs,
5952 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00005953 const char *LinkingOutput) const {
5954 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00005955
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005956 // If the number of arguments surpasses the system limits, we will encode the
5957 // input files in a separate file, shortening the command line. To this end,
5958 // build a list of input file names that can be passed via a file with the
5959 // -filelist linker option.
5960 llvm::opt::ArgStringList InputFileList;
5961
Daniel Dunbarc1964212009-03-26 16:23:12 +00005962 // The logic here is derived from gcc's behavior; most of which
5963 // comes from specs (starting with link_command). Consult gcc for
5964 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00005965 ArgStringList CmdArgs;
5966
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005967 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5968 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5969 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005970 for (const auto &Arg : Args)
5971 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005972 const char *Exec =
5973 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5974 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00005975 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005976 return;
5977 }
5978
Daniel Dunbarc1964212009-03-26 16:23:12 +00005979 // I'm not sure why this particular decomposition exists in gcc, but
5980 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00005981 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005982
Daniel Dunbarc1964212009-03-26 16:23:12 +00005983 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5984 Args.AddAllArgs(CmdArgs, options::OPT_s);
5985 Args.AddAllArgs(CmdArgs, options::OPT_t);
5986 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5987 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005988 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005989 Args.AddAllArgs(CmdArgs, options::OPT_r);
5990
Daniel Dunbar767bbab2010-10-18 22:08:36 +00005991 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5992 // members of static archive libraries which implement Objective-C classes or
5993 // categories.
5994 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5995 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005996
Daniel Dunbarc1964212009-03-26 16:23:12 +00005997 CmdArgs.push_back("-o");
5998 CmdArgs.push_back(Output.getFilename());
5999
Chad Rosier06fd3c62012-05-16 23:45:12 +00006000 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006001 !Args.hasArg(options::OPT_nostartfiles))
6002 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006003
6004 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006005
Alexey Bataev186b28a2014-03-06 05:43:53 +00006006 LibOpenMP UsedOpenMPLib = LibUnknown;
6007 if (Args.hasArg(options::OPT_fopenmp)) {
6008 UsedOpenMPLib = LibGOMP;
6009 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
6010 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
6011 .Case("libgomp", LibGOMP)
6012 .Case("libiomp5", LibIOMP5)
6013 .Default(LibUnknown);
6014 if (UsedOpenMPLib == LibUnknown)
6015 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
6016 << A->getOption().getName() << A->getValue();
6017 }
6018 switch (UsedOpenMPLib) {
6019 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00006020 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00006021 break;
6022 case LibIOMP5:
6023 CmdArgs.push_back("-liomp5");
6024 break;
6025 case LibUnknown:
6026 break;
6027 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006028
Douglas Gregor9295df02012-05-15 21:00:27 +00006029 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006030 // Build the input file for -filelist (list of linker input files) in case we
6031 // need it later
6032 for (const auto &II : Inputs) {
6033 if (!II.isFilename()) {
6034 // This is a linker input argument.
6035 // We cannot mix input arguments and file names in a -filelist input, thus
6036 // we prematurely stop our list (remaining files shall be passed as
6037 // arguments).
6038 if (InputFileList.size() > 0)
6039 break;
6040
6041 continue;
6042 }
6043
6044 InputFileList.push_back(II.getFilename());
6045 }
6046
Bob Wilson16d93952012-05-15 18:57:39 +00006047 if (isObjCRuntimeLinked(Args) &&
6048 !Args.hasArg(options::OPT_nostdlib) &&
6049 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006050 // We use arclite library for both ARC and subscripting support.
6051 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6052
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006053 CmdArgs.push_back("-framework");
6054 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006055 // Link libobj.
6056 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006057 }
John McCall31168b02011-06-15 23:02:42 +00006058
Daniel Dunbarc1964212009-03-26 16:23:12 +00006059 if (LinkingOutput) {
6060 CmdArgs.push_back("-arch_multiple");
6061 CmdArgs.push_back("-final_output");
6062 CmdArgs.push_back(LinkingOutput);
6063 }
6064
Daniel Dunbarc1964212009-03-26 16:23:12 +00006065 if (Args.hasArg(options::OPT_fnested_functions))
6066 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006067
Daniel Dunbarc1964212009-03-26 16:23:12 +00006068 if (!Args.hasArg(options::OPT_nostdlib) &&
6069 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006070 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006071 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006072
Daniel Dunbarc1964212009-03-26 16:23:12 +00006073 // link_ssp spec is empty.
6074
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006075 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006076 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006077 }
6078
Chad Rosier06fd3c62012-05-16 23:45:12 +00006079 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006080 !Args.hasArg(options::OPT_nostartfiles)) {
6081 // endfile_spec is empty.
6082 }
6083
6084 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6085 Args.AddAllArgs(CmdArgs, options::OPT_F);
6086
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006087 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006088 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006089 std::unique_ptr<Command> Cmd =
6090 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6091 Cmd->setInputFileList(std::move(InputFileList));
6092 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006093}
6094
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006095void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006096 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006097 const InputInfoList &Inputs,
6098 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006099 const char *LinkingOutput) const {
6100 ArgStringList CmdArgs;
6101
6102 CmdArgs.push_back("-create");
6103 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006104
6105 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006106 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006107
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006108 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006109 assert(II.isFilename() && "Unexpected lipo input.");
6110 CmdArgs.push_back(II.getFilename());
6111 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006112
6113 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006114 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006115}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006116
Daniel Dunbar88299622010-06-04 18:28:36 +00006117void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006118 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006119 const InputInfoList &Inputs,
6120 const ArgList &Args,
6121 const char *LinkingOutput) const {
6122 ArgStringList CmdArgs;
6123
Daniel Dunbareb86b042011-05-09 17:23:16 +00006124 CmdArgs.push_back("-o");
6125 CmdArgs.push_back(Output.getFilename());
6126
Daniel Dunbar88299622010-06-04 18:28:36 +00006127 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6128 const InputInfo &Input = Inputs[0];
6129 assert(Input.isFilename() && "Unexpected dsymutil input.");
6130 CmdArgs.push_back(Input.getFilename());
6131
Daniel Dunbar88299622010-06-04 18:28:36 +00006132 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006133 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006134 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006135}
6136
Eric Christopher551ef452011-08-23 17:56:55 +00006137void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006138 const InputInfo &Output,
6139 const InputInfoList &Inputs,
6140 const ArgList &Args,
6141 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006142 ArgStringList CmdArgs;
6143 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006144 CmdArgs.push_back("--debug-info");
6145 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006146 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006147
6148 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6149 const InputInfo &Input = Inputs[0];
6150 assert(Input.isFilename() && "Unexpected verify input");
6151
6152 // Grabbing the output of the earlier dsymutil run.
6153 CmdArgs.push_back(Input.getFilename());
6154
6155 const char *Exec =
6156 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006157 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006158}
6159
David Chisnallf571cde2012-02-15 13:39:01 +00006160void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6161 const InputInfo &Output,
6162 const InputInfoList &Inputs,
6163 const ArgList &Args,
6164 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006165 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006166 ArgStringList CmdArgs;
6167
6168 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6169 options::OPT_Xassembler);
6170
6171 CmdArgs.push_back("-o");
6172 CmdArgs.push_back(Output.getFilename());
6173
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006174 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006175 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006176
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006177 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006178 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006179}
6180
David Chisnallf571cde2012-02-15 13:39:01 +00006181void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6182 const InputInfo &Output,
6183 const InputInfoList &Inputs,
6184 const ArgList &Args,
6185 const char *LinkingOutput) const {
6186 // FIXME: Find a real GCC, don't hard-code versions here
6187 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6188 const llvm::Triple &T = getToolChain().getTriple();
6189 std::string LibPath = "/usr/lib/";
6190 llvm::Triple::ArchType Arch = T.getArch();
6191 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006192 case llvm::Triple::x86:
6193 GCCLibPath +=
6194 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6195 break;
6196 case llvm::Triple::x86_64:
6197 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6198 GCCLibPath += "/4.5.2/amd64/";
6199 LibPath += "amd64/";
6200 break;
6201 default:
6202 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006203 }
6204
6205 ArgStringList CmdArgs;
6206
David Chisnall272a0712012-02-29 15:06:12 +00006207 // Demangle C++ names in errors
6208 CmdArgs.push_back("-C");
6209
David Chisnallf571cde2012-02-15 13:39:01 +00006210 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6211 (!Args.hasArg(options::OPT_shared))) {
6212 CmdArgs.push_back("-e");
6213 CmdArgs.push_back("_start");
6214 }
6215
6216 if (Args.hasArg(options::OPT_static)) {
6217 CmdArgs.push_back("-Bstatic");
6218 CmdArgs.push_back("-dn");
6219 } else {
6220 CmdArgs.push_back("-Bdynamic");
6221 if (Args.hasArg(options::OPT_shared)) {
6222 CmdArgs.push_back("-shared");
6223 } else {
6224 CmdArgs.push_back("--dynamic-linker");
6225 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6226 }
6227 }
6228
6229 if (Output.isFilename()) {
6230 CmdArgs.push_back("-o");
6231 CmdArgs.push_back(Output.getFilename());
6232 } else {
6233 assert(Output.isNothing() && "Invalid output.");
6234 }
6235
6236 if (!Args.hasArg(options::OPT_nostdlib) &&
6237 !Args.hasArg(options::OPT_nostartfiles)) {
6238 if (!Args.hasArg(options::OPT_shared)) {
6239 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6240 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006241 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006242 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6243 } else {
6244 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006245 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6246 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006247 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006248 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006249 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006250 }
6251
6252 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6253
6254 Args.AddAllArgs(CmdArgs, options::OPT_L);
6255 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6256 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006257 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006258
6259 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6260
6261 if (!Args.hasArg(options::OPT_nostdlib) &&
6262 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006263 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006264 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006265 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006266 if (!Args.hasArg(options::OPT_shared)) {
6267 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006268 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006269 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006270 }
David Chisnallf571cde2012-02-15 13:39:01 +00006271 }
6272
6273 if (!Args.hasArg(options::OPT_nostdlib) &&
6274 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006275 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006276 }
David Chisnall96de9932012-02-16 16:00:47 +00006277 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006278
Alexey Samsonov7811d192014-02-20 13:57:37 +00006279 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006280
6281 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006282 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006283 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006284}
6285
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006286void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006287 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006288 const InputInfoList &Inputs,
6289 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006290 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006291 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006292 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006293 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006294
Rafael Espindolacc126272014-02-28 01:55:21 +00006295 switch (getToolChain().getArch()) {
6296 case llvm::Triple::x86:
6297 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6298 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006299 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006300 break;
6301
6302 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006303 CmdArgs.push_back("-mppc");
6304 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006305 break;
6306
6307 case llvm::Triple::sparc:
6308 CmdArgs.push_back("-32");
6309 NeedsKPIC = true;
6310 break;
6311
6312 case llvm::Triple::sparcv9:
6313 CmdArgs.push_back("-64");
6314 CmdArgs.push_back("-Av9a");
6315 NeedsKPIC = true;
6316 break;
6317
6318 case llvm::Triple::mips64:
6319 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006320 StringRef CPUName;
6321 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006322 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006323
6324 CmdArgs.push_back("-mabi");
6325 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6326
6327 if (getToolChain().getArch() == llvm::Triple::mips64)
6328 CmdArgs.push_back("-EB");
6329 else
6330 CmdArgs.push_back("-EL");
6331
Rafael Espindolacc126272014-02-28 01:55:21 +00006332 NeedsKPIC = true;
6333 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006334 }
6335
Rafael Espindolacc126272014-02-28 01:55:21 +00006336 default:
6337 break;
6338 }
6339
6340 if (NeedsKPIC)
6341 addAssemblerKPIC(Args, CmdArgs);
6342
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006343 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6344 options::OPT_Xassembler);
6345
6346 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006347 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006348
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006349 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006350 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006351
6352 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006353 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006354 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006355}
6356
6357void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006358 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006359 const InputInfoList &Inputs,
6360 const ArgList &Args,
6361 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006362 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006363 ArgStringList CmdArgs;
6364
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006365 // Silence warning for "clang -g foo.o -o foo"
6366 Args.ClaimAllArgs(options::OPT_g_Group);
6367 // and "clang -emit-llvm foo.o -o foo"
6368 Args.ClaimAllArgs(options::OPT_emit_llvm);
6369 // and for "clang -w foo.o -o foo". Other warning options are already
6370 // handled somewhere else.
6371 Args.ClaimAllArgs(options::OPT_w);
6372
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006373 if (getToolChain().getArch() == llvm::Triple::mips64)
6374 CmdArgs.push_back("-EB");
6375 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6376 CmdArgs.push_back("-EL");
6377
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006378 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006379 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006380 CmdArgs.push_back("-e");
6381 CmdArgs.push_back("__start");
6382 }
6383
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006384 if (Args.hasArg(options::OPT_static)) {
6385 CmdArgs.push_back("-Bstatic");
6386 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006387 if (Args.hasArg(options::OPT_rdynamic))
6388 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006389 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006390 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006391 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006392 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006393 } else {
6394 CmdArgs.push_back("-dynamic-linker");
6395 CmdArgs.push_back("/usr/libexec/ld.so");
6396 }
6397 }
6398
Rafael Espindola044f7832013-06-05 04:28:55 +00006399 if (Args.hasArg(options::OPT_nopie))
6400 CmdArgs.push_back("-nopie");
6401
Daniel Dunbarb440f562010-08-02 02:38:21 +00006402 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006403 CmdArgs.push_back("-o");
6404 CmdArgs.push_back(Output.getFilename());
6405 } else {
6406 assert(Output.isNothing() && "Invalid output.");
6407 }
6408
6409 if (!Args.hasArg(options::OPT_nostdlib) &&
6410 !Args.hasArg(options::OPT_nostartfiles)) {
6411 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006412 if (Args.hasArg(options::OPT_pg))
6413 CmdArgs.push_back(Args.MakeArgString(
6414 getToolChain().GetFilePath("gcrt0.o")));
6415 else
6416 CmdArgs.push_back(Args.MakeArgString(
6417 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006418 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006419 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006420 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006421 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006422 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006423 }
6424 }
6425
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006426 std::string Triple = getToolChain().getTripleString();
6427 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006428 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006429 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006430 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006431
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006432 Args.AddAllArgs(CmdArgs, options::OPT_L);
6433 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6434 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006435 Args.AddAllArgs(CmdArgs, options::OPT_s);
6436 Args.AddAllArgs(CmdArgs, options::OPT_t);
6437 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6438 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006439
Daniel Dunbar54423b22010-09-17 00:24:54 +00006440 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006441
6442 if (!Args.hasArg(options::OPT_nostdlib) &&
6443 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006444 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006445 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006446 if (Args.hasArg(options::OPT_pg))
6447 CmdArgs.push_back("-lm_p");
6448 else
6449 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006450 }
6451
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006452 // FIXME: For some reason GCC passes -lgcc before adding
6453 // the default system libraries. Just mimic this for now.
6454 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006455
Eric Christopher17674ec2012-09-13 06:32:34 +00006456 if (Args.hasArg(options::OPT_pthread)) {
6457 if (!Args.hasArg(options::OPT_shared) &&
6458 Args.hasArg(options::OPT_pg))
6459 CmdArgs.push_back("-lpthread_p");
6460 else
6461 CmdArgs.push_back("-lpthread");
6462 }
6463
Chandler Carruth45661652011-12-17 22:32:42 +00006464 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006465 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006466 CmdArgs.push_back("-lc_p");
6467 else
6468 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006469 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006470
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006471 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006472 }
6473
6474 if (!Args.hasArg(options::OPT_nostdlib) &&
6475 !Args.hasArg(options::OPT_nostartfiles)) {
6476 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006477 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006478 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006479 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006480 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006481 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006482 }
6483
6484 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006485 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006486 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006487}
Ed Schoutene33194b2009-04-02 19:13:12 +00006488
Eli Friedman9fa28852012-08-08 23:57:20 +00006489void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6490 const InputInfo &Output,
6491 const InputInfoList &Inputs,
6492 const ArgList &Args,
6493 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006494 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006495 ArgStringList CmdArgs;
6496
6497 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6498 options::OPT_Xassembler);
6499
6500 CmdArgs.push_back("-o");
6501 CmdArgs.push_back(Output.getFilename());
6502
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006503 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006504 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006505
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006506 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006507 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006508}
6509
6510void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6511 const InputInfo &Output,
6512 const InputInfoList &Inputs,
6513 const ArgList &Args,
6514 const char *LinkingOutput) const {
6515 const Driver &D = getToolChain().getDriver();
6516 ArgStringList CmdArgs;
6517
6518 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6519 (!Args.hasArg(options::OPT_shared))) {
6520 CmdArgs.push_back("-e");
6521 CmdArgs.push_back("__start");
6522 }
6523
6524 if (Args.hasArg(options::OPT_static)) {
6525 CmdArgs.push_back("-Bstatic");
6526 } else {
6527 if (Args.hasArg(options::OPT_rdynamic))
6528 CmdArgs.push_back("-export-dynamic");
6529 CmdArgs.push_back("--eh-frame-hdr");
6530 CmdArgs.push_back("-Bdynamic");
6531 if (Args.hasArg(options::OPT_shared)) {
6532 CmdArgs.push_back("-shared");
6533 } else {
6534 CmdArgs.push_back("-dynamic-linker");
6535 CmdArgs.push_back("/usr/libexec/ld.so");
6536 }
6537 }
6538
6539 if (Output.isFilename()) {
6540 CmdArgs.push_back("-o");
6541 CmdArgs.push_back(Output.getFilename());
6542 } else {
6543 assert(Output.isNothing() && "Invalid output.");
6544 }
6545
6546 if (!Args.hasArg(options::OPT_nostdlib) &&
6547 !Args.hasArg(options::OPT_nostartfiles)) {
6548 if (!Args.hasArg(options::OPT_shared)) {
6549 if (Args.hasArg(options::OPT_pg))
6550 CmdArgs.push_back(Args.MakeArgString(
6551 getToolChain().GetFilePath("gcrt0.o")));
6552 else
6553 CmdArgs.push_back(Args.MakeArgString(
6554 getToolChain().GetFilePath("crt0.o")));
6555 CmdArgs.push_back(Args.MakeArgString(
6556 getToolChain().GetFilePath("crtbegin.o")));
6557 } else {
6558 CmdArgs.push_back(Args.MakeArgString(
6559 getToolChain().GetFilePath("crtbeginS.o")));
6560 }
6561 }
6562
6563 Args.AddAllArgs(CmdArgs, options::OPT_L);
6564 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6565 Args.AddAllArgs(CmdArgs, options::OPT_e);
6566
6567 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6568
6569 if (!Args.hasArg(options::OPT_nostdlib) &&
6570 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006571 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006572 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6573 if (Args.hasArg(options::OPT_pg))
6574 CmdArgs.push_back("-lm_p");
6575 else
6576 CmdArgs.push_back("-lm");
6577 }
6578
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006579 if (Args.hasArg(options::OPT_pthread)) {
6580 if (!Args.hasArg(options::OPT_shared) &&
6581 Args.hasArg(options::OPT_pg))
6582 CmdArgs.push_back("-lpthread_p");
6583 else
6584 CmdArgs.push_back("-lpthread");
6585 }
6586
Eli Friedman9fa28852012-08-08 23:57:20 +00006587 if (!Args.hasArg(options::OPT_shared)) {
6588 if (Args.hasArg(options::OPT_pg))
6589 CmdArgs.push_back("-lc_p");
6590 else
6591 CmdArgs.push_back("-lc");
6592 }
6593
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006594 StringRef MyArch;
6595 switch (getToolChain().getTriple().getArch()) {
6596 case llvm::Triple::arm:
6597 MyArch = "arm";
6598 break;
6599 case llvm::Triple::x86:
6600 MyArch = "i386";
6601 break;
6602 case llvm::Triple::x86_64:
6603 MyArch = "amd64";
6604 break;
6605 default:
6606 llvm_unreachable("Unsupported architecture");
6607 }
6608 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006609 }
6610
6611 if (!Args.hasArg(options::OPT_nostdlib) &&
6612 !Args.hasArg(options::OPT_nostartfiles)) {
6613 if (!Args.hasArg(options::OPT_shared))
6614 CmdArgs.push_back(Args.MakeArgString(
6615 getToolChain().GetFilePath("crtend.o")));
6616 else
6617 CmdArgs.push_back(Args.MakeArgString(
6618 getToolChain().GetFilePath("crtendS.o")));
6619 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006620
6621 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006622 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006623 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006624}
6625
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006626void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006627 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006628 const InputInfoList &Inputs,
6629 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006630 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006631 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006632 ArgStringList CmdArgs;
6633
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006634 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6635 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006636 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006637 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006638 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006639 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006640 else if (getToolChain().getArch() == llvm::Triple::mips ||
6641 getToolChain().getArch() == llvm::Triple::mipsel ||
6642 getToolChain().getArch() == llvm::Triple::mips64 ||
6643 getToolChain().getArch() == llvm::Triple::mips64el) {
6644 StringRef CPUName;
6645 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006646 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006647
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006648 CmdArgs.push_back("-march");
6649 CmdArgs.push_back(CPUName.data());
6650
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006651 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006652 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006653
6654 if (getToolChain().getArch() == llvm::Triple::mips ||
6655 getToolChain().getArch() == llvm::Triple::mips64)
6656 CmdArgs.push_back("-EB");
6657 else
6658 CmdArgs.push_back("-EL");
6659
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006660 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006661 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006662 getToolChain().getArch() == llvm::Triple::armeb ||
6663 getToolChain().getArch() == llvm::Triple::thumb ||
6664 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006665 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006666 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006667 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6668
6669 if (FloatABI == "hard") {
6670 CmdArgs.push_back("-mfpu=vfp");
6671 } else {
6672 CmdArgs.push_back("-mfpu=softvfp");
6673 }
6674
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006675 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006676 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006677 case llvm::Triple::GNUEABI:
6678 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006679 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006680 break;
6681
6682 default:
6683 CmdArgs.push_back("-matpcs");
6684 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006685 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006686 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006687 if (getToolChain().getArch() == llvm::Triple::sparc)
6688 CmdArgs.push_back("-Av8plusa");
6689 else
6690 CmdArgs.push_back("-Av9a");
6691
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006692 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006693 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006694
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006695 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6696 options::OPT_Xassembler);
6697
6698 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006699 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006700
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006701 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006702 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006703
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006704 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006705 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006706}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006707
6708void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006709 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006710 const InputInfoList &Inputs,
6711 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006712 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006713 const toolchains::FreeBSD& ToolChain =
6714 static_cast<const toolchains::FreeBSD&>(getToolChain());
6715 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006716 const bool IsPIE =
6717 !Args.hasArg(options::OPT_shared) &&
6718 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006719 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006720
6721 // Silence warning for "clang -g foo.o -o foo"
6722 Args.ClaimAllArgs(options::OPT_g_Group);
6723 // and "clang -emit-llvm foo.o -o foo"
6724 Args.ClaimAllArgs(options::OPT_emit_llvm);
6725 // and for "clang -w foo.o -o foo". Other warning options are already
6726 // handled somewhere else.
6727 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006728
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006729 if (!D.SysRoot.empty())
6730 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6731
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006732 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006733 CmdArgs.push_back("-pie");
6734
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006735 if (Args.hasArg(options::OPT_static)) {
6736 CmdArgs.push_back("-Bstatic");
6737 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006738 if (Args.hasArg(options::OPT_rdynamic))
6739 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006740 CmdArgs.push_back("--eh-frame-hdr");
6741 if (Args.hasArg(options::OPT_shared)) {
6742 CmdArgs.push_back("-Bshareable");
6743 } else {
6744 CmdArgs.push_back("-dynamic-linker");
6745 CmdArgs.push_back("/libexec/ld-elf.so.1");
6746 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006747 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6748 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006749 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6750 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6751 CmdArgs.push_back("--hash-style=both");
6752 }
6753 }
6754 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006755 }
6756
6757 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6758 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006759 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006760 CmdArgs.push_back("-m");
6761 CmdArgs.push_back("elf_i386_fbsd");
6762 }
6763
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006764 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006765 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006766 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006767 }
6768
Daniel Dunbarb440f562010-08-02 02:38:21 +00006769 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006770 CmdArgs.push_back("-o");
6771 CmdArgs.push_back(Output.getFilename());
6772 } else {
6773 assert(Output.isNothing() && "Invalid output.");
6774 }
6775
6776 if (!Args.hasArg(options::OPT_nostdlib) &&
6777 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00006778 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006779 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006780 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00006781 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006782 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006783 crt1 = "Scrt1.o";
6784 else
6785 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006786 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006787 if (crt1)
6788 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6789
6790 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6791
Craig Topper92fc2df2014-05-17 16:56:41 +00006792 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00006793 if (Args.hasArg(options::OPT_static))
6794 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006795 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006796 crtbegin = "crtbeginS.o";
6797 else
6798 crtbegin = "crtbegin.o";
6799
6800 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006801 }
6802
6803 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00006804 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006805 for (const auto &Path : Paths)
6806 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006807 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6808 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00006809 Args.AddAllArgs(CmdArgs, options::OPT_s);
6810 Args.AddAllArgs(CmdArgs, options::OPT_t);
6811 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6812 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006813
Alp Tokerce365ca2013-12-02 12:43:03 +00006814 if (D.IsUsingLTO(Args))
6815 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00006816
Alexey Samsonov52550342014-09-15 19:58:40 +00006817 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00006818 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006819
6820 if (!Args.hasArg(options::OPT_nostdlib) &&
6821 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006822 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006823 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00006824 if (Args.hasArg(options::OPT_pg))
6825 CmdArgs.push_back("-lm_p");
6826 else
6827 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00006828 }
Alexey Samsonov52550342014-09-15 19:58:40 +00006829 if (NeedsSanitizerDeps)
6830 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006831 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6832 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00006833 if (Args.hasArg(options::OPT_pg))
6834 CmdArgs.push_back("-lgcc_p");
6835 else
6836 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006837 if (Args.hasArg(options::OPT_static)) {
6838 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006839 } else if (Args.hasArg(options::OPT_pg)) {
6840 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006841 } else {
6842 CmdArgs.push_back("--as-needed");
6843 CmdArgs.push_back("-lgcc_s");
6844 CmdArgs.push_back("--no-as-needed");
6845 }
6846
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006847 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006848 if (Args.hasArg(options::OPT_pg))
6849 CmdArgs.push_back("-lpthread_p");
6850 else
6851 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006852 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006853
Roman Divacky66f22762011-02-10 16:59:40 +00006854 if (Args.hasArg(options::OPT_pg)) {
6855 if (Args.hasArg(options::OPT_shared))
6856 CmdArgs.push_back("-lc");
6857 else
6858 CmdArgs.push_back("-lc_p");
6859 CmdArgs.push_back("-lgcc_p");
6860 } else {
6861 CmdArgs.push_back("-lc");
6862 CmdArgs.push_back("-lgcc");
6863 }
6864
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006865 if (Args.hasArg(options::OPT_static)) {
6866 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006867 } else if (Args.hasArg(options::OPT_pg)) {
6868 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006869 } else {
6870 CmdArgs.push_back("--as-needed");
6871 CmdArgs.push_back("-lgcc_s");
6872 CmdArgs.push_back("--no-as-needed");
6873 }
6874 }
6875
6876 if (!Args.hasArg(options::OPT_nostdlib) &&
6877 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006878 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006879 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006880 else
6881 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006882 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006883 }
6884
Alexey Samsonov7811d192014-02-20 13:57:37 +00006885 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006886
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006887 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006888 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006889 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006890}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006891
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006892void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6893 const InputInfo &Output,
6894 const InputInfoList &Inputs,
6895 const ArgList &Args,
6896 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006897 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006898 ArgStringList CmdArgs;
6899
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006900 // GNU as needs different flags for creating the correct output format
6901 // on architectures with different ABIs or optional feature sets.
6902 switch (getToolChain().getArch()) {
6903 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006904 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006905 break;
6906 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006907 case llvm::Triple::armeb:
6908 case llvm::Triple::thumb:
6909 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00006910 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006911 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006912 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006913 }
6914
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006915 case llvm::Triple::mips:
6916 case llvm::Triple::mipsel:
6917 case llvm::Triple::mips64:
6918 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006919 StringRef CPUName;
6920 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006921 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006922
6923 CmdArgs.push_back("-march");
6924 CmdArgs.push_back(CPUName.data());
6925
6926 CmdArgs.push_back("-mabi");
6927 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6928
6929 if (getToolChain().getArch() == llvm::Triple::mips ||
6930 getToolChain().getArch() == llvm::Triple::mips64)
6931 CmdArgs.push_back("-EB");
6932 else
6933 CmdArgs.push_back("-EL");
6934
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006935 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006936 break;
6937 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006938
6939 case llvm::Triple::sparc:
6940 CmdArgs.push_back("-32");
6941 addAssemblerKPIC(Args, CmdArgs);
6942 break;
6943
6944 case llvm::Triple::sparcv9:
6945 CmdArgs.push_back("-64");
6946 CmdArgs.push_back("-Av9");
6947 addAssemblerKPIC(Args, CmdArgs);
6948 break;
6949
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006950 default:
6951 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006952 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006953
6954 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6955 options::OPT_Xassembler);
6956
6957 CmdArgs.push_back("-o");
6958 CmdArgs.push_back(Output.getFilename());
6959
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006960 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006961 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006962
David Chisnallddbd68f2011-09-27 22:03:18 +00006963 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00006964 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006965}
6966
6967void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6968 const InputInfo &Output,
6969 const InputInfoList &Inputs,
6970 const ArgList &Args,
6971 const char *LinkingOutput) const {
6972 const Driver &D = getToolChain().getDriver();
6973 ArgStringList CmdArgs;
6974
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006975 if (!D.SysRoot.empty())
6976 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6977
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00006978 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006979 if (Args.hasArg(options::OPT_static)) {
6980 CmdArgs.push_back("-Bstatic");
6981 } else {
6982 if (Args.hasArg(options::OPT_rdynamic))
6983 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006984 if (Args.hasArg(options::OPT_shared)) {
6985 CmdArgs.push_back("-Bshareable");
6986 } else {
6987 CmdArgs.push_back("-dynamic-linker");
6988 CmdArgs.push_back("/libexec/ld.elf_so");
6989 }
6990 }
6991
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006992 // Many NetBSD architectures support more than one ABI.
6993 // Determine the correct emulation for ld.
6994 switch (getToolChain().getArch()) {
6995 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006996 CmdArgs.push_back("-m");
6997 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006998 break;
6999 case llvm::Triple::arm:
7000 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007001 CmdArgs.push_back("-m");
7002 switch (getToolChain().getTriple().getEnvironment()) {
7003 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007004 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007005 CmdArgs.push_back("armelf_nbsd_eabi");
7006 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007007 case llvm::Triple::EABIHF:
7008 case llvm::Triple::GNUEABIHF:
7009 CmdArgs.push_back("armelf_nbsd_eabihf");
7010 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007011 default:
7012 CmdArgs.push_back("armelf_nbsd");
7013 break;
7014 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007015 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007016 case llvm::Triple::armeb:
7017 case llvm::Triple::thumbeb:
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007018 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007019 CmdArgs.push_back("-m");
7020 switch (getToolChain().getTriple().getEnvironment()) {
7021 case llvm::Triple::EABI:
7022 case llvm::Triple::GNUEABI:
7023 CmdArgs.push_back("armelfb_nbsd_eabi");
7024 break;
7025 case llvm::Triple::EABIHF:
7026 case llvm::Triple::GNUEABIHF:
7027 CmdArgs.push_back("armelfb_nbsd_eabihf");
7028 break;
7029 default:
7030 CmdArgs.push_back("armelfb_nbsd");
7031 break;
7032 }
7033 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007034 case llvm::Triple::mips64:
7035 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007036 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007037 CmdArgs.push_back("-m");
7038 if (getToolChain().getArch() == llvm::Triple::mips64)
7039 CmdArgs.push_back("elf32btsmip");
7040 else
7041 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007042 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007043 CmdArgs.push_back("-m");
7044 if (getToolChain().getArch() == llvm::Triple::mips64)
7045 CmdArgs.push_back("elf64btsmip");
7046 else
7047 CmdArgs.push_back("elf64ltsmip");
7048 }
7049 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007050 case llvm::Triple::ppc:
7051 CmdArgs.push_back("-m");
7052 CmdArgs.push_back("elf32ppc_nbsd");
7053 break;
7054
7055 case llvm::Triple::ppc64:
7056 case llvm::Triple::ppc64le:
7057 CmdArgs.push_back("-m");
7058 CmdArgs.push_back("elf64ppc");
7059 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007060
7061 case llvm::Triple::sparc:
7062 CmdArgs.push_back("-m");
7063 CmdArgs.push_back("elf32_sparc");
7064 break;
7065
7066 case llvm::Triple::sparcv9:
7067 CmdArgs.push_back("-m");
7068 CmdArgs.push_back("elf64_sparc");
7069 break;
7070
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007071 default:
7072 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007073 }
7074
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007075 if (Output.isFilename()) {
7076 CmdArgs.push_back("-o");
7077 CmdArgs.push_back(Output.getFilename());
7078 } else {
7079 assert(Output.isNothing() && "Invalid output.");
7080 }
7081
7082 if (!Args.hasArg(options::OPT_nostdlib) &&
7083 !Args.hasArg(options::OPT_nostartfiles)) {
7084 if (!Args.hasArg(options::OPT_shared)) {
7085 CmdArgs.push_back(Args.MakeArgString(
7086 getToolChain().GetFilePath("crt0.o")));
7087 CmdArgs.push_back(Args.MakeArgString(
7088 getToolChain().GetFilePath("crti.o")));
7089 CmdArgs.push_back(Args.MakeArgString(
7090 getToolChain().GetFilePath("crtbegin.o")));
7091 } else {
7092 CmdArgs.push_back(Args.MakeArgString(
7093 getToolChain().GetFilePath("crti.o")));
7094 CmdArgs.push_back(Args.MakeArgString(
7095 getToolChain().GetFilePath("crtbeginS.o")));
7096 }
7097 }
7098
7099 Args.AddAllArgs(CmdArgs, options::OPT_L);
7100 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7101 Args.AddAllArgs(CmdArgs, options::OPT_e);
7102 Args.AddAllArgs(CmdArgs, options::OPT_s);
7103 Args.AddAllArgs(CmdArgs, options::OPT_t);
7104 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7105 Args.AddAllArgs(CmdArgs, options::OPT_r);
7106
7107 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7108
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007109 unsigned Major, Minor, Micro;
7110 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7111 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007112 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007113 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007114 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007115 case llvm::Triple::arm:
7116 case llvm::Triple::armeb:
7117 case llvm::Triple::thumb:
7118 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007119 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007120 case llvm::Triple::ppc64:
7121 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007122 case llvm::Triple::x86:
7123 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007124 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007125 break;
7126 default:
7127 break;
7128 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007129 }
7130
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007131 if (!Args.hasArg(options::OPT_nostdlib) &&
7132 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007133 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007134 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7135 CmdArgs.push_back("-lm");
7136 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007137 if (Args.hasArg(options::OPT_pthread))
7138 CmdArgs.push_back("-lpthread");
7139 CmdArgs.push_back("-lc");
7140
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007141 if (useLibgcc) {
7142 if (Args.hasArg(options::OPT_static)) {
7143 // libgcc_eh depends on libc, so resolve as much as possible,
7144 // pull in any new requirements from libc and then get the rest
7145 // of libgcc.
7146 CmdArgs.push_back("-lgcc_eh");
7147 CmdArgs.push_back("-lc");
7148 CmdArgs.push_back("-lgcc");
7149 } else {
7150 CmdArgs.push_back("-lgcc");
7151 CmdArgs.push_back("--as-needed");
7152 CmdArgs.push_back("-lgcc_s");
7153 CmdArgs.push_back("--no-as-needed");
7154 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007155 }
7156 }
7157
7158 if (!Args.hasArg(options::OPT_nostdlib) &&
7159 !Args.hasArg(options::OPT_nostartfiles)) {
7160 if (!Args.hasArg(options::OPT_shared))
7161 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7162 "crtend.o")));
7163 else
7164 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7165 "crtendS.o")));
7166 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7167 "crtn.o")));
7168 }
7169
Alexey Samsonov7811d192014-02-20 13:57:37 +00007170 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007171
Logan Chieneb9162f2014-06-26 14:23:45 +00007172 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007173 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007174}
7175
Thomas Schwinge4e555262013-03-28 19:04:25 +00007176void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7177 const InputInfo &Output,
7178 const InputInfoList &Inputs,
7179 const ArgList &Args,
7180 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007181 claimNoWarnArgs(Args);
7182
Rafael Espindola92b00932010-08-10 00:25:48 +00007183 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007184 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007185
7186 // Add --32/--64 to make sure we get the format we want.
7187 // This is incomplete
7188 if (getToolChain().getArch() == llvm::Triple::x86) {
7189 CmdArgs.push_back("--32");
7190 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
Zinovy Nis1db95732014-07-10 15:27:19 +00007191 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7192 CmdArgs.push_back("--x32");
7193 else
7194 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00007195 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
7196 CmdArgs.push_back("-a32");
7197 CmdArgs.push_back("-mppc");
7198 CmdArgs.push_back("-many");
7199 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
7200 CmdArgs.push_back("-a64");
7201 CmdArgs.push_back("-mppc64");
7202 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00007203 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
7204 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007205 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007206 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007207 CmdArgs.push_back("-mlittle-endian");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007208 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
7209 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007210 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007211 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007212 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
7213 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007214 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007215 NeedsKPIC = true;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007216 } else if (getToolChain().getArch() == llvm::Triple::arm ||
7217 getToolChain().getArch() == llvm::Triple::armeb) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00007218 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00007219 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
7220 CmdArgs.push_back("-mfpu=neon");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007221 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
7222 MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
Bernard Ogdena58ef052013-10-24 18:32:41 +00007223 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007224
Tim Northover9c7e0352013-12-12 11:55:52 +00007225 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
7226 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007227 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007228
7229 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007230
7231 // FIXME: remove krait check when GNU tools support krait cpu
7232 // for now replace it with -march=armv7-a to avoid a lower
7233 // march from being picked in the absence of a cpu flag.
7234 Arg *A;
7235 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
7236 StringRef(A->getValue()) == "krait")
7237 CmdArgs.push_back("-march=armv7-a");
7238 else
7239 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007240 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007241 } else if (getToolChain().getArch() == llvm::Triple::mips ||
7242 getToolChain().getArch() == llvm::Triple::mipsel ||
7243 getToolChain().getArch() == llvm::Triple::mips64 ||
7244 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007245 StringRef CPUName;
7246 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007247 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007248 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007249
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007250 CmdArgs.push_back("-march");
7251 CmdArgs.push_back(CPUName.data());
7252
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007253 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007254 CmdArgs.push_back(ABIName.data());
7255
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007256 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7257 // or -mshared (not implemented) is in effect.
7258 bool IsPicOrPie = false;
7259 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7260 options::OPT_fpic, options::OPT_fno_pic,
7261 options::OPT_fPIE, options::OPT_fno_PIE,
7262 options::OPT_fpie, options::OPT_fno_pie)) {
7263 if (A->getOption().matches(options::OPT_fPIC) ||
7264 A->getOption().matches(options::OPT_fpic) ||
7265 A->getOption().matches(options::OPT_fPIE) ||
7266 A->getOption().matches(options::OPT_fpie))
7267 IsPicOrPie = true;
7268 }
7269 if (!IsPicOrPie)
7270 CmdArgs.push_back("-mno-shared");
7271
Daniel Sanders379d44b2014-07-16 11:52:23 +00007272 // LLVM doesn't support -mplt yet and acts as if it is always given.
7273 // However, -mplt has no effect with the N64 ABI.
7274 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007275
7276 if (getToolChain().getArch() == llvm::Triple::mips ||
7277 getToolChain().getArch() == llvm::Triple::mips64)
7278 CmdArgs.push_back("-EB");
7279 else
7280 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007281
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007282 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7283 if (StringRef(A->getValue()) == "2008")
7284 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7285 }
7286
Daniel Sanders379d44b2014-07-16 11:52:23 +00007287 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7288 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7289 options::OPT_mfp64)) {
7290 A->claim();
7291 A->render(Args, CmdArgs);
7292 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7293 ABIName))
7294 CmdArgs.push_back("-mfpxx");
7295
7296 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7297 // -mno-mips16 is actually -no-mips16.
7298 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7299 options::OPT_mno_mips16)) {
7300 if (A->getOption().matches(options::OPT_mips16)) {
7301 A->claim();
7302 A->render(Args, CmdArgs);
7303 } else {
7304 A->claim();
7305 CmdArgs.push_back("-no-mips16");
7306 }
7307 }
7308
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007309 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7310 options::OPT_mno_micromips);
7311 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7312 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7313
Simon Atanasyanbd986632013-11-26 11:58:04 +00007314 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7315 // Do not use AddLastArg because not all versions of MIPS assembler
7316 // support -mmsa / -mno-msa options.
7317 if (A->getOption().matches(options::OPT_mmsa))
7318 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7319 }
7320
Daniel Sanders379d44b2014-07-16 11:52:23 +00007321 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7322 options::OPT_msoft_float);
7323
7324 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7325 options::OPT_mno_odd_spreg);
7326
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007327 NeedsKPIC = true;
7328 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
7329 // Always pass an -march option, since our default of z10 is later
7330 // than the GNU assembler's default.
7331 StringRef CPUName = getSystemZTargetCPU(Args);
7332 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
7333 }
7334
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007335 if (NeedsKPIC)
7336 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007337
7338 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7339 options::OPT_Xassembler);
7340
7341 CmdArgs.push_back("-o");
7342 CmdArgs.push_back(Output.getFilename());
7343
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007344 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007345 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007346
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007347 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007348 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007349
7350 // Handle the debug info splitting at object creation time if we're
7351 // creating an object.
7352 // TODO: Currently only works on linux with newer objcopy.
7353 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007354 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007355 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
7356 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00007357}
7358
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007359static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007360 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007361 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007362 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7363 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007364 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007365 CmdArgs.push_back("-lgcc");
7366
Logan Chien3d3373c2012-11-19 12:04:11 +00007367 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007368 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007369 CmdArgs.push_back("-lgcc");
7370 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007371 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007372 CmdArgs.push_back("--as-needed");
7373 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007374 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007375 CmdArgs.push_back("--no-as-needed");
7376 }
7377
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007378 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007379 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007380 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007381 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007382
7383 // According to Android ABI, we have to link with libdl if we are
7384 // linking with non-static libgcc.
7385 //
7386 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7387 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7388 if (isAndroid && !StaticLibgcc)
7389 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007390}
7391
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007392static std::string getLinuxDynamicLinker(const ArgList &Args,
7393 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007394 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7395 if (ToolChain.getTriple().isArch64Bit())
7396 return "/system/bin/linker64";
7397 else
7398 return "/system/bin/linker";
7399 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7400 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007401 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007402 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007403 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007404 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007405 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007406 else if (ToolChain.getArch() == llvm::Triple::arm ||
7407 ToolChain.getArch() == llvm::Triple::thumb) {
7408 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7409 return "/lib/ld-linux-armhf.so.3";
7410 else
7411 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007412 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7413 ToolChain.getArch() == llvm::Triple::thumbeb) {
7414 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7415 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7416 else
7417 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007418 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007419 ToolChain.getArch() == llvm::Triple::mipsel ||
7420 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007421 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007422 StringRef CPUName;
7423 StringRef ABIName;
7424 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7425 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7426
7427 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7428 .Case("o32", "/lib")
7429 .Case("n32", "/lib32")
7430 .Case("n64", "/lib64")
7431 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007432 StringRef LibName;
7433 if (mips::isUCLibc(Args))
7434 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7435 else
7436 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007437
7438 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007439 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7440 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007441 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7442 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7443 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007444 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007445 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7446 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7447 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007448 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007449 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7450 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007451 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7452 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007453 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7454 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7455 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007456 else
7457 return "/lib64/ld-linux-x86-64.so.2";
7458}
7459
Renato Golinc4b49242014-02-13 10:01:16 +00007460static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007461 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007462 // Make use of compiler-rt if --rtlib option is used
7463 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7464
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007465 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007466 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007467 switch (TC.getTriple().getOS()) {
7468 default: llvm_unreachable("unsupported OS");
7469 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007470 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007471 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007472 break;
7473 }
Renato Golinc4b49242014-02-13 10:01:16 +00007474 break;
7475 case ToolChain::RLT_Libgcc:
7476 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7477 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007478 }
7479}
7480
Rafael Espindola1e085772014-08-15 17:14:35 +00007481static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7482 switch (T.getArch()) {
7483 case llvm::Triple::x86:
7484 return "elf_i386";
7485 case llvm::Triple::aarch64:
7486 return "aarch64linux";
7487 case llvm::Triple::aarch64_be:
7488 return "aarch64_be_linux";
7489 case llvm::Triple::arm:
7490 case llvm::Triple::thumb:
7491 return "armelf_linux_eabi";
7492 case llvm::Triple::armeb:
7493 case llvm::Triple::thumbeb:
7494 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7495 case llvm::Triple::ppc:
7496 return "elf32ppclinux";
7497 case llvm::Triple::ppc64:
7498 return "elf64ppc";
7499 case llvm::Triple::ppc64le:
7500 return "elf64lppc";
7501 case llvm::Triple::sparc:
7502 return "elf32_sparc";
7503 case llvm::Triple::sparcv9:
7504 return "elf64_sparc";
7505 case llvm::Triple::mips:
7506 return "elf32btsmip";
7507 case llvm::Triple::mipsel:
7508 return "elf32ltsmip";
7509 case llvm::Triple::mips64:
7510 if (mips::hasMipsAbiArg(Args, "n32"))
7511 return "elf32btsmipn32";
7512 return "elf64btsmip";
7513 case llvm::Triple::mips64el:
7514 if (mips::hasMipsAbiArg(Args, "n32"))
7515 return "elf32ltsmipn32";
7516 return "elf64ltsmip";
7517 case llvm::Triple::systemz:
7518 return "elf64_s390";
7519 case llvm::Triple::x86_64:
7520 if (T.getEnvironment() == llvm::Triple::GNUX32)
7521 return "elf32_x86_64";
7522 return "elf_x86_64";
7523 default:
7524 llvm_unreachable("Unexpected arch");
7525 }
7526}
7527
Thomas Schwinge4e555262013-03-28 19:04:25 +00007528void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7529 const InputInfo &Output,
7530 const InputInfoList &Inputs,
7531 const ArgList &Args,
7532 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007533 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007534 static_cast<const toolchains::Linux&>(getToolChain());
7535 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007536 const bool isAndroid =
7537 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007538 const bool IsPIE =
7539 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007540 !Args.hasArg(options::OPT_static) &&
7541 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault() ||
7542 // On Android every code is PIC so every executable is PIE
Alexey Volkov6468f5d2014-04-29 12:07:34 +00007543 // Cannot use isPIEDefault here since otherwise
7544 // PIE only logic will be enabled during compilation
Alexey Volkov06921032014-04-29 10:25:20 +00007545 isAndroid);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007546
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007547 ArgStringList CmdArgs;
7548
Rafael Espindolad1002f62010-11-15 18:28:16 +00007549 // Silence warning for "clang -g foo.o -o foo"
7550 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007551 // and "clang -emit-llvm foo.o -o foo"
7552 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007553 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007554 // handled somewhere else.
7555 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007556
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007557 if (!D.SysRoot.empty())
7558 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007559
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007560 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007561 CmdArgs.push_back("-pie");
7562
Rafael Espindola1c76c592010-11-07 22:57:16 +00007563 if (Args.hasArg(options::OPT_rdynamic))
7564 CmdArgs.push_back("-export-dynamic");
7565
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007566 if (Args.hasArg(options::OPT_s))
7567 CmdArgs.push_back("-s");
7568
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007569 if (ToolChain.getArch() == llvm::Triple::armeb ||
7570 ToolChain.getArch() == llvm::Triple::thumbeb)
7571 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
7572
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007573 for (const auto &Opt : ToolChain.ExtraOpts)
7574 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007575
7576 if (!Args.hasArg(options::OPT_static)) {
7577 CmdArgs.push_back("--eh-frame-hdr");
7578 }
7579
7580 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007581 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007582
7583 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007584 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007585 ToolChain.getArch() == llvm::Triple::armeb ||
7586 ToolChain.getArch() == llvm::Triple::thumb ||
7587 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007588 CmdArgs.push_back("-Bstatic");
7589 else
7590 CmdArgs.push_back("-static");
7591 } else if (Args.hasArg(options::OPT_shared)) {
7592 CmdArgs.push_back("-shared");
7593 }
7594
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007595 if (ToolChain.getArch() == llvm::Triple::arm ||
7596 ToolChain.getArch() == llvm::Triple::armeb ||
7597 ToolChain.getArch() == llvm::Triple::thumb ||
7598 ToolChain.getArch() == llvm::Triple::thumbeb ||
7599 (!Args.hasArg(options::OPT_static) &&
7600 !Args.hasArg(options::OPT_shared))) {
7601 CmdArgs.push_back("-dynamic-linker");
7602 CmdArgs.push_back(Args.MakeArgString(
7603 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7604 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007605
Ulrich Weigandf32a1ac2015-01-29 19:08:51 +00007606 // Work around a bug in GNU ld (and gold) linker versions up to 2.25
7607 // that may mis-optimize code generated by this version of clang/LLVM
7608 // to access general-dynamic or local-dynamic TLS variables.
7609 if (ToolChain.getArch() == llvm::Triple::ppc64 ||
7610 ToolChain.getArch() == llvm::Triple::ppc64le)
7611 CmdArgs.push_back("--no-tls-optimize");
7612
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007613 CmdArgs.push_back("-o");
7614 CmdArgs.push_back(Output.getFilename());
7615
Rafael Espindola81937ec2010-12-01 01:52:43 +00007616 if (!Args.hasArg(options::OPT_nostdlib) &&
7617 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007618 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007619 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007620 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007621 if (Args.hasArg(options::OPT_pg))
7622 crt1 = "gcrt1.o";
7623 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007624 crt1 = "Scrt1.o";
7625 else
7626 crt1 = "crt1.o";
7627 }
7628 if (crt1)
7629 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007630
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007631 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7632 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007633
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007634 const char *crtbegin;
7635 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007636 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007637 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007638 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007639 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007640 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007641 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007642 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007643 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007644
7645 // Add crtfastmath.o if available and fast math is enabled.
7646 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007647 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007648
7649 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007650 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007651
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007652 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007653
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007654 for (const auto &Path : Paths)
7655 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007656
Alp Tokerce365ca2013-12-02 12:43:03 +00007657 if (D.IsUsingLTO(Args))
7658 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007659
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007660 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7661 CmdArgs.push_back("--no-demangle");
7662
Alexey Samsonov52550342014-09-15 19:58:40 +00007663 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007664 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007665 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007666 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007667
Hans Wennborg70850d82013-07-18 20:29:38 +00007668 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007669 !Args.hasArg(options::OPT_nostdlib) &&
7670 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007671 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7672 !Args.hasArg(options::OPT_static);
7673 if (OnlyLibstdcxxStatic)
7674 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007675 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007676 if (OnlyLibstdcxxStatic)
7677 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007678 CmdArgs.push_back("-lm");
7679 }
7680
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007681 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007682 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7683 if (Args.hasArg(options::OPT_static))
7684 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007685
Alexey Samsonov52550342014-09-15 19:58:40 +00007686 if (NeedsSanitizerDeps)
7687 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
7688
Alexey Bataev186b28a2014-03-06 05:43:53 +00007689 LibOpenMP UsedOpenMPLib = LibUnknown;
7690 if (Args.hasArg(options::OPT_fopenmp)) {
7691 UsedOpenMPLib = LibGOMP;
7692 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7693 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7694 .Case("libgomp", LibGOMP)
7695 .Case("libiomp5", LibIOMP5)
7696 .Default(LibUnknown);
7697 if (UsedOpenMPLib == LibUnknown)
7698 D.Diag(diag::err_drv_unsupported_option_argument)
7699 << A->getOption().getName() << A->getValue();
7700 }
7701 switch (UsedOpenMPLib) {
7702 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007703 CmdArgs.push_back("-lgomp");
7704
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007705 // FIXME: Exclude this for platforms with libgomp that don't require
7706 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007707 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007708 break;
7709 case LibIOMP5:
7710 CmdArgs.push_back("-liomp5");
7711 break;
7712 case LibUnknown:
7713 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007714 }
Renato Golinc4b49242014-02-13 10:01:16 +00007715 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007716
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007717 if ((Args.hasArg(options::OPT_pthread) ||
7718 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7719 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007720 CmdArgs.push_back("-lpthread");
7721
7722 CmdArgs.push_back("-lc");
7723
7724 if (Args.hasArg(options::OPT_static))
7725 CmdArgs.push_back("--end-group");
7726 else
Renato Golinc4b49242014-02-13 10:01:16 +00007727 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007728 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007729
Rafael Espindola81937ec2010-12-01 01:52:43 +00007730 if (!Args.hasArg(options::OPT_nostartfiles)) {
7731 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007732 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007733 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007734 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007735 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007736 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007737 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007738
Rafael Espindola81937ec2010-12-01 01:52:43 +00007739 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007740 if (!isAndroid)
7741 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007742 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007743 }
7744
David Blaikiec11bf802014-09-04 16:04:28 +00007745 C.addCommand(
7746 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00007747}
7748
Chris Lattner3e2ee142010-07-07 16:01:42 +00007749void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007750 const InputInfo &Output,
7751 const InputInfoList &Inputs,
7752 const ArgList &Args,
7753 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007754 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007755 ArgStringList CmdArgs;
7756
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007757 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007758
7759 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007760 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007761
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007762 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007763 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007764
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007765 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007766 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007767}
7768
7769void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007770 const InputInfo &Output,
7771 const InputInfoList &Inputs,
7772 const ArgList &Args,
7773 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007774 const Driver &D = getToolChain().getDriver();
7775 ArgStringList CmdArgs;
7776
Daniel Dunbarb440f562010-08-02 02:38:21 +00007777 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007778 CmdArgs.push_back("-o");
7779 CmdArgs.push_back(Output.getFilename());
7780 } else {
7781 assert(Output.isNothing() && "Invalid output.");
7782 }
7783
7784 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00007785 !Args.hasArg(options::OPT_nostartfiles)) {
7786 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7787 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7788 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7789 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7790 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007791
7792 Args.AddAllArgs(CmdArgs, options::OPT_L);
7793 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7794 Args.AddAllArgs(CmdArgs, options::OPT_e);
7795
Daniel Dunbar54423b22010-09-17 00:24:54 +00007796 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007797
Alexey Samsonov7811d192014-02-20 13:57:37 +00007798 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00007799
Chris Lattner3e2ee142010-07-07 16:01:42 +00007800 if (!Args.hasArg(options::OPT_nostdlib) &&
7801 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007802 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007803 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007804 CmdArgs.push_back("-lm");
7805 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007806 }
7807
7808 if (!Args.hasArg(options::OPT_nostdlib) &&
7809 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00007810 if (Args.hasArg(options::OPT_pthread))
7811 CmdArgs.push_back("-lpthread");
7812 CmdArgs.push_back("-lc");
7813 CmdArgs.push_back("-lCompilerRT-Generic");
7814 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7815 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00007816 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007817 }
7818
Logan Chieneb9162f2014-06-26 14:23:45 +00007819 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007820 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007821}
7822
Daniel Dunbarcc912342009-05-02 18:28:39 +00007823/// DragonFly Tools
7824
7825// For now, DragonFly Assemble does just about the same as for
7826// FreeBSD, but this may change soon.
7827void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007828 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007829 const InputInfoList &Inputs,
7830 const ArgList &Args,
7831 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007832 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007833 ArgStringList CmdArgs;
7834
7835 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7836 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007837 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00007838 CmdArgs.push_back("--32");
7839
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007840 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007841
7842 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007843 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007844
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007845 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007846 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007847
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007848 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007849 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007850}
7851
7852void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007853 const InputInfo &Output,
7854 const InputInfoList &Inputs,
7855 const ArgList &Args,
7856 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007857 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00007858 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00007859 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00007860
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007861 if (!D.SysRoot.empty())
7862 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7863
John McCall65b8da02013-04-11 22:55:55 +00007864 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007865 if (Args.hasArg(options::OPT_static)) {
7866 CmdArgs.push_back("-Bstatic");
7867 } else {
John McCall65b8da02013-04-11 22:55:55 +00007868 if (Args.hasArg(options::OPT_rdynamic))
7869 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007870 if (Args.hasArg(options::OPT_shared))
7871 CmdArgs.push_back("-Bshareable");
7872 else {
7873 CmdArgs.push_back("-dynamic-linker");
7874 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7875 }
John McCall65b8da02013-04-11 22:55:55 +00007876 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007877 }
7878
7879 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7880 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007881 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007882 CmdArgs.push_back("-m");
7883 CmdArgs.push_back("elf_i386");
7884 }
7885
Daniel Dunbarb440f562010-08-02 02:38:21 +00007886 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007887 CmdArgs.push_back("-o");
7888 CmdArgs.push_back(Output.getFilename());
7889 } else {
7890 assert(Output.isNothing() && "Invalid output.");
7891 }
7892
7893 if (!Args.hasArg(options::OPT_nostdlib) &&
7894 !Args.hasArg(options::OPT_nostartfiles)) {
7895 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00007896 if (Args.hasArg(options::OPT_pg))
7897 CmdArgs.push_back(Args.MakeArgString(
7898 getToolChain().GetFilePath("gcrt1.o")));
7899 else {
7900 if (Args.hasArg(options::OPT_pie))
7901 CmdArgs.push_back(Args.MakeArgString(
7902 getToolChain().GetFilePath("Scrt1.o")));
7903 else
7904 CmdArgs.push_back(Args.MakeArgString(
7905 getToolChain().GetFilePath("crt1.o")));
7906 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007907 }
John McCall65b8da02013-04-11 22:55:55 +00007908 CmdArgs.push_back(Args.MakeArgString(
7909 getToolChain().GetFilePath("crti.o")));
7910 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7911 CmdArgs.push_back(Args.MakeArgString(
7912 getToolChain().GetFilePath("crtbeginS.o")));
7913 else
7914 CmdArgs.push_back(Args.MakeArgString(
7915 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007916 }
7917
7918 Args.AddAllArgs(CmdArgs, options::OPT_L);
7919 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7920 Args.AddAllArgs(CmdArgs, options::OPT_e);
7921
Daniel Dunbar54423b22010-09-17 00:24:54 +00007922 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007923
7924 if (!Args.hasArg(options::OPT_nostdlib) &&
7925 !Args.hasArg(options::OPT_nodefaultlibs)) {
7926 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7927 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00007928 if (UseGCC47)
7929 CmdArgs.push_back("-L/usr/lib/gcc47");
7930 else
7931 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007932
7933 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00007934 if (UseGCC47) {
7935 CmdArgs.push_back("-rpath");
7936 CmdArgs.push_back("/usr/lib/gcc47");
7937 } else {
7938 CmdArgs.push_back("-rpath");
7939 CmdArgs.push_back("/usr/lib/gcc44");
7940 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007941 }
7942
Hans Wennborg70850d82013-07-18 20:29:38 +00007943 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007944 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00007945 CmdArgs.push_back("-lm");
7946 }
7947
Daniel Dunbarcc912342009-05-02 18:28:39 +00007948 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00007949 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007950
7951 if (!Args.hasArg(options::OPT_nolibc)) {
7952 CmdArgs.push_back("-lc");
7953 }
7954
John McCall65b8da02013-04-11 22:55:55 +00007955 if (UseGCC47) {
7956 if (Args.hasArg(options::OPT_static) ||
7957 Args.hasArg(options::OPT_static_libgcc)) {
7958 CmdArgs.push_back("-lgcc");
7959 CmdArgs.push_back("-lgcc_eh");
7960 } else {
7961 if (Args.hasArg(options::OPT_shared_libgcc)) {
7962 CmdArgs.push_back("-lgcc_pic");
7963 if (!Args.hasArg(options::OPT_shared))
7964 CmdArgs.push_back("-lgcc");
7965 } else {
7966 CmdArgs.push_back("-lgcc");
7967 CmdArgs.push_back("--as-needed");
7968 CmdArgs.push_back("-lgcc_pic");
7969 CmdArgs.push_back("--no-as-needed");
7970 }
7971 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007972 } else {
John McCall65b8da02013-04-11 22:55:55 +00007973 if (Args.hasArg(options::OPT_shared)) {
7974 CmdArgs.push_back("-lgcc_pic");
7975 } else {
7976 CmdArgs.push_back("-lgcc");
7977 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007978 }
7979 }
7980
7981 if (!Args.hasArg(options::OPT_nostdlib) &&
7982 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00007983 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00007984 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007985 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00007986 else
7987 CmdArgs.push_back(Args.MakeArgString(
7988 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007989 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00007990 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007991 }
7992
Alexey Samsonov7811d192014-02-20 13:57:37 +00007993 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007994
Logan Chieneb9162f2014-06-26 14:23:45 +00007995 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007996 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007997}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007998
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00007999// Try to find Exe from a Visual Studio distribution. This first tries to find
8000// an installed copy of Visual Studio and, failing that, looks in the PATH,
8001// making sure that whatever executable that's found is not a same-named exe
8002// from clang itself to prevent clang from falling back to itself.
8003static std::string FindVisualStudioExecutable(const ToolChain &TC,
8004 const char *Exe,
8005 const char *ClangProgramPath) {
8006 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8007 std::string visualStudioBinDir;
8008 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8009 visualStudioBinDir)) {
8010 SmallString<128> FilePath(visualStudioBinDir);
8011 llvm::sys::path::append(FilePath, Exe);
8012 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8013 return FilePath.str();
8014 }
8015
8016 return Exe;
8017}
8018
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008019void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
8020 const InputInfo &Output,
8021 const InputInfoList &Inputs,
8022 const ArgList &Args,
8023 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008024 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008025 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008026
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008027 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8028 if (Output.isFilename())
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00008029 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
8030 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008031
8032 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008033 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008034 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008035
Zachary Turner10d75b22014-10-22 20:40:43 +00008036 if (!llvm::sys::Process::GetEnv("LIB")) {
8037 // If the VC environment hasn't been configured (perhaps because the user
8038 // did not run vcvarsall), try to build a consistent link environment. If
8039 // the environment variable is set however, assume the user knows what he's
8040 // doing.
8041 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008042 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008043 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8044 SmallString<128> LibDir(VisualStudioDir);
8045 llvm::sys::path::append(LibDir, "VC", "lib");
8046 switch (MSVC.getArch()) {
8047 case llvm::Triple::x86:
8048 // x86 just puts the libraries directly in lib
8049 break;
8050 case llvm::Triple::x86_64:
8051 llvm::sys::path::append(LibDir, "amd64");
8052 break;
8053 case llvm::Triple::arm:
8054 llvm::sys::path::append(LibDir, "arm");
8055 break;
8056 default:
8057 break;
8058 }
8059 CmdArgs.push_back(
8060 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8061 }
8062
8063 std::string WindowsSdkLibPath;
8064 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8065 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8066 WindowsSdkLibPath.c_str()));
8067 }
8068
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008069 CmdArgs.push_back("-nologo");
8070
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008071 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008072 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008073
Hans Wennborgf1a74252013-09-10 20:18:04 +00008074 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008075 if (DLL) {
8076 CmdArgs.push_back(Args.MakeArgString("-dll"));
8077
8078 SmallString<128> ImplibName(Output.getFilename());
8079 llvm::sys::path::replace_extension(ImplibName, "lib");
8080 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
8081 ImplibName.str()));
8082 }
8083
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008084 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008085 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008086 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008087 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008088 static const char *CompilerRTComponents[] = {
8089 "asan_dynamic",
8090 "asan_dynamic_runtime_thunk",
8091 };
8092 for (const auto &Component : CompilerRTComponents)
8093 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008094 // Make sure the dynamic runtime thunk is not optimized out at link time
8095 // to ensure proper SEH handling.
8096 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008097 } else if (DLL) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008098 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008099 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008100 static const char *CompilerRTComponents[] = {
8101 "asan",
8102 "asan_cxx",
8103 };
8104 for (const auto &Component : CompilerRTComponents)
8105 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008106 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008107 }
8108
Hans Wennborg2e274592013-08-13 23:38:57 +00008109 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008110
Reid Kleckner337188f2014-09-16 19:22:00 +00008111 // Add filenames, libraries, and other linker inputs.
8112 for (const auto &Input : Inputs) {
8113 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008114 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008115 continue;
8116 }
8117
8118 const Arg &A = Input.getInputArg();
8119
8120 // Render -l options differently for the MSVC linker.
8121 if (A.getOption().matches(options::OPT_l)) {
8122 StringRef Lib = A.getValue();
8123 const char *LinkLibArg;
8124 if (Lib.endswith(".lib"))
8125 LinkLibArg = Args.MakeArgString(Lib);
8126 else
8127 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8128 CmdArgs.push_back(LinkLibArg);
8129 continue;
8130 }
8131
8132 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8133 // or -L. Render it, even if MSVC doesn't understand it.
8134 A.renderAsInput(Args, CmdArgs);
8135 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008136
Zachary Turner719f58c2014-12-01 23:06:47 +00008137 // We need to special case some linker paths. In the case of lld, we need to
8138 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8139 // linker, we need to use a special search algorithm.
8140 llvm::SmallString<128> linkPath;
8141 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8142 if (Linker.equals_lower("lld"))
8143 Linker = "lld-link";
8144
8145 if (Linker.equals_lower("link")) {
8146 // If we're using the MSVC linker, it's not sufficient to just use link
8147 // from the program PATH, because other environments like GnuWin32 install
8148 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008149 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008150 C.getDriver().getClangProgramPath());
8151 } else {
8152 linkPath = Linker;
8153 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008154 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008155 }
8156
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008157 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008158 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008159}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008160
8161void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8162 const InputInfo &Output,
8163 const InputInfoList &Inputs,
8164 const ArgList &Args,
8165 const char *LinkingOutput) const {
8166 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8167}
8168
David Blaikiec11bf802014-09-04 16:04:28 +00008169std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8170 Compilation &C, const JobAction &JA, const InputInfo &Output,
8171 const InputInfoList &Inputs, const ArgList &Args,
8172 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008173 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008174 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008175 CmdArgs.push_back("/c"); // Compile only.
8176 CmdArgs.push_back("/W0"); // No warnings.
8177
8178 // The goal is to be able to invoke this tool correctly based on
8179 // any flag accepted by clang-cl.
8180
8181 // These are spelled the same way in clang and cl.exe,.
8182 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8183 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008184
8185 // Optimization level.
8186 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8187 if (A->getOption().getID() == options::OPT_O0) {
8188 CmdArgs.push_back("/Od");
8189 } else {
8190 StringRef OptLevel = A->getValue();
8191 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8192 A->render(Args, CmdArgs);
8193 else if (OptLevel == "3")
8194 CmdArgs.push_back("/Ox");
8195 }
8196 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008197
8198 // Flags for which clang-cl have an alias.
8199 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8200
David Majnemerf6072342014-07-01 22:24:56 +00008201 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8202 /*default=*/false))
8203 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008204 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8205 options::OPT_fno_function_sections))
8206 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8207 ? "/Gy"
8208 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008209 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8210 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008211 CmdArgs.push_back(
8212 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008213 if (Args.hasArg(options::OPT_fsyntax_only))
8214 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008215 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8216 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008217
Hans Wennborg260ff402013-09-27 17:54:18 +00008218 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008219 for (const auto &Include : Includes)
8220 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008221
Hans Wennborg87cfa712013-09-19 20:32:16 +00008222 // Flags that can simply be passed through.
8223 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8224 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008225 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008226
8227 // The order of these flags is relevant, so pick the last one.
8228 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8229 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8230 A->render(Args, CmdArgs);
8231
8232
8233 // Input filename.
8234 assert(Inputs.size() == 1);
8235 const InputInfo &II = Inputs[0];
8236 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8237 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8238 if (II.isFilename())
8239 CmdArgs.push_back(II.getFilename());
8240 else
8241 II.getInputArg().renderAsInput(Args, CmdArgs);
8242
8243 // Output filename.
8244 assert(Output.getType() == types::TY_Object);
8245 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8246 Output.getFilename());
8247 CmdArgs.push_back(Fo);
8248
Hans Wennborg188382e2013-09-20 18:16:35 +00008249 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008250 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8251 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008252 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8253 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008254}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008255
8256
8257/// XCore Tools
8258// We pass assemble and link construction to the xcc tool.
8259
8260void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8261 const InputInfo &Output,
8262 const InputInfoList &Inputs,
8263 const ArgList &Args,
8264 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008265 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008266 ArgStringList CmdArgs;
8267
8268 CmdArgs.push_back("-o");
8269 CmdArgs.push_back(Output.getFilename());
8270
8271 CmdArgs.push_back("-c");
8272
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008273 if (Args.hasArg(options::OPT_v))
8274 CmdArgs.push_back("-v");
8275
Robert Lytton894d25c2014-05-02 09:33:25 +00008276 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8277 if (!A->getOption().matches(options::OPT_g0))
8278 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008279
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008280 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8281 false))
8282 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008283
8284 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8285 options::OPT_Xassembler);
8286
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008287 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008288 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008289
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008290 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008291 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008292}
8293
8294void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8295 const InputInfo &Output,
8296 const InputInfoList &Inputs,
8297 const ArgList &Args,
8298 const char *LinkingOutput) const {
8299 ArgStringList CmdArgs;
8300
8301 if (Output.isFilename()) {
8302 CmdArgs.push_back("-o");
8303 CmdArgs.push_back(Output.getFilename());
8304 } else {
8305 assert(Output.isNothing() && "Invalid output.");
8306 }
8307
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008308 if (Args.hasArg(options::OPT_v))
8309 CmdArgs.push_back("-v");
8310
David Majnemer8de68642014-12-05 08:11:58 +00008311 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008312 CmdArgs.push_back("-fexceptions");
8313
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008314 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8315
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008316 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008317 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008318}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008319
8320void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8321 const InputInfo &Output,
8322 const InputInfoList &Inputs,
8323 const ArgList &Args,
8324 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008325 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008326 const auto &TC =
8327 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8328 ArgStringList CmdArgs;
8329 const char *Exec;
8330
8331 switch (TC.getArch()) {
8332 default: llvm_unreachable("unsupported architecture");
8333 case llvm::Triple::arm:
8334 case llvm::Triple::thumb:
8335 break;
8336 case llvm::Triple::x86:
8337 CmdArgs.push_back("--32");
8338 break;
8339 case llvm::Triple::x86_64:
8340 CmdArgs.push_back("--64");
8341 break;
8342 }
8343
8344 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8345
8346 CmdArgs.push_back("-o");
8347 CmdArgs.push_back(Output.getFilename());
8348
8349 for (const auto &Input : Inputs)
8350 CmdArgs.push_back(Input.getFilename());
8351
8352 const std::string Assembler = TC.GetProgramPath("as");
8353 Exec = Args.MakeArgString(Assembler);
8354
8355 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8356}
8357
8358void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8359 const InputInfo &Output,
8360 const InputInfoList &Inputs,
8361 const ArgList &Args,
8362 const char *LinkingOutput) const {
8363 const auto &TC =
8364 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8365 const llvm::Triple &T = TC.getTriple();
8366 const Driver &D = TC.getDriver();
8367 SmallString<128> EntryPoint;
8368 ArgStringList CmdArgs;
8369 const char *Exec;
8370
8371 // Silence warning for "clang -g foo.o -o foo"
8372 Args.ClaimAllArgs(options::OPT_g_Group);
8373 // and "clang -emit-llvm foo.o -o foo"
8374 Args.ClaimAllArgs(options::OPT_emit_llvm);
8375 // and for "clang -w foo.o -o foo"
8376 Args.ClaimAllArgs(options::OPT_w);
8377 // Other warning options are already handled somewhere else.
8378
8379 if (!D.SysRoot.empty())
8380 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8381
8382 if (Args.hasArg(options::OPT_pie))
8383 CmdArgs.push_back("-pie");
8384 if (Args.hasArg(options::OPT_rdynamic))
8385 CmdArgs.push_back("-export-dynamic");
8386 if (Args.hasArg(options::OPT_s))
8387 CmdArgs.push_back("--strip-all");
8388
8389 CmdArgs.push_back("-m");
8390 switch (TC.getArch()) {
8391 default: llvm_unreachable("unsupported architecture");
8392 case llvm::Triple::arm:
8393 case llvm::Triple::thumb:
8394 // FIXME: this is incorrect for WinCE
8395 CmdArgs.push_back("thumb2pe");
8396 break;
8397 case llvm::Triple::x86:
8398 CmdArgs.push_back("i386pe");
8399 EntryPoint.append("_");
8400 break;
8401 case llvm::Triple::x86_64:
8402 CmdArgs.push_back("i386pep");
8403 break;
8404 }
8405
8406 if (Args.hasArg(options::OPT_shared)) {
8407 switch (T.getArch()) {
8408 default: llvm_unreachable("unsupported architecture");
8409 case llvm::Triple::arm:
8410 case llvm::Triple::thumb:
8411 case llvm::Triple::x86_64:
8412 EntryPoint.append("_DllMainCRTStartup");
8413 break;
8414 case llvm::Triple::x86:
8415 EntryPoint.append("_DllMainCRTStartup@12");
8416 break;
8417 }
8418
8419 CmdArgs.push_back("-shared");
8420 CmdArgs.push_back("-Bdynamic");
8421
8422 CmdArgs.push_back("--enable-auto-image-base");
8423
8424 CmdArgs.push_back("--entry");
8425 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8426 } else {
8427 EntryPoint.append("mainCRTStartup");
8428
8429 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8430 : "-Bdynamic");
8431
8432 if (!Args.hasArg(options::OPT_nostdlib) &&
8433 !Args.hasArg(options::OPT_nostartfiles)) {
8434 CmdArgs.push_back("--entry");
8435 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8436 }
8437
8438 // FIXME: handle subsystem
8439 }
8440
8441 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00008442 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008443
8444 CmdArgs.push_back("-o");
8445 CmdArgs.push_back(Output.getFilename());
8446
8447 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8448 SmallString<261> ImpLib(Output.getFilename());
8449 llvm::sys::path::replace_extension(ImpLib, ".lib");
8450
8451 CmdArgs.push_back("--out-implib");
8452 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8453 }
8454
8455 if (!Args.hasArg(options::OPT_nostdlib) &&
8456 !Args.hasArg(options::OPT_nostartfiles)) {
8457 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8458 const char *CRTBegin;
8459
8460 CRTBegin =
8461 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8462 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8463 }
8464
8465 Args.AddAllArgs(CmdArgs, options::OPT_L);
8466
8467 const auto &Paths = TC.getFilePaths();
8468 for (const auto &Path : Paths)
8469 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8470
8471 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8472
8473 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8474 !Args.hasArg(options::OPT_nodefaultlibs)) {
8475 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
8476 !Args.hasArg(options::OPT_static);
8477 if (StaticCXX)
8478 CmdArgs.push_back("-Bstatic");
8479 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8480 if (StaticCXX)
8481 CmdArgs.push_back("-Bdynamic");
8482 }
8483
8484 if (!Args.hasArg(options::OPT_nostdlib)) {
8485 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8486 // TODO handle /MT[d] /MD[d]
8487 CmdArgs.push_back("-lmsvcrt");
8488 AddRunTimeLibs(TC, D, CmdArgs, Args);
8489 }
8490 }
8491
8492 const std::string Linker = TC.GetProgramPath("ld");
8493 Exec = Args.MakeArgString(Linker);
8494
8495 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8496}