blob: 37fef56b846556ff16924c99eff22652908ebb61 [file] [log] [blame]
Nick Lewyckye3365aa2010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar47ac7d22009-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 Carruth55fc8732012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000012#include "ToolChains.h"
Stephen Hines651f13c2014-04-23 16:59:28 -070013#include "clang/Basic/LangOptions.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000014#include "clang/Basic/ObjCRuntime.h"
Kevin Enderby02341792013-01-17 21:38:06 +000015#include "clang/Basic/Version.h"
Daniel Dunbar1d460332009-03-18 10:01:51 +000016#include "clang/Driver/Action.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000017#include "clang/Driver/Compilation.h"
Daniel Dunbaree848a72009-10-29 02:39:57 +000018#include "clang/Driver/Driver.h"
19#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000020#include "clang/Driver/Job.h"
Daniel Dunbar265e9ef2009-11-19 04:25:22 +000021#include "clang/Driver/Options.h"
Alexey Samsonov1b8f12d2013-08-19 09:14:21 +000022#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000023#include "clang/Driver/ToolChain.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000024#include "clang/Driver/Util.h"
Daniel Dunbar88137642009-09-09 22:32:48 +000025#include "llvm/ADT/SmallString.h"
Hans Wennborgdc40bf92013-09-20 18:16:35 +000026#include "llvm/ADT/StringExtras.h"
Douglas Gregor55d3f7a2009-10-29 00:41:01 +000027#include "llvm/ADT/StringSwitch.h"
Daniel Dunbar5b750fe2009-09-09 22:32:34 +000028#include "llvm/ADT/Twine.h"
Reid Klecknerb1e25a12013-06-14 17:17:23 +000029#include "llvm/Option/Arg.h"
30#include "llvm/Option/ArgList.h"
31#include "llvm/Option/Option.h"
Stephen Hines651f13c2014-04-23 16:59:28 -070032#include "llvm/Support/Compression.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000033#include "llvm/Support/ErrorHandling.h"
Michael J. Spencer32bef4e2011-01-10 02:34:13 +000034#include "llvm/Support/FileSystem.h"
Daniel Dunbar02633b52009-03-26 16:23:12 +000035#include "llvm/Support/Format.h"
Michael J. Spencer03013fa2010-11-29 18:12:39 +000036#include "llvm/Support/Host.h"
Hans Wennborgdc40bf92013-09-20 18:16:35 +000037#include "llvm/Support/Path.h"
Michael J. Spencer03013fa2010-11-29 18:12:39 +000038#include "llvm/Support/Process.h"
Stephen Hines651f13c2014-04-23 16:59:28 -070039#include "llvm/Support/Program.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000040#include "llvm/Support/raw_ostream.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000041
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000042using namespace clang::driver;
43using namespace clang::driver::tools;
Chris Lattner5f9e2722011-07-23 10:55:15 +000044using namespace clang;
Reid Klecknerb1e25a12013-06-14 17:17:23 +000045using namespace llvm::opt;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000046
Stephen Hines651f13c2014-04-23 16:59:28 -070047static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
48 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
49 options::OPT_fpic, options::OPT_fno_pic,
50 options::OPT_fPIE, options::OPT_fno_PIE,
51 options::OPT_fpie, options::OPT_fno_pie);
52 if (!LastPICArg)
53 return;
54 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
55 LastPICArg->getOption().matches(options::OPT_fpic) ||
56 LastPICArg->getOption().matches(options::OPT_fPIE) ||
57 LastPICArg->getOption().matches(options::OPT_fpie)) {
58 CmdArgs.push_back("-KPIC");
59 }
60}
61
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +000062/// CheckPreprocessingOptions - Perform some validation of preprocessing
63/// arguments that is shared with gcc.
64static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Stephen Hinesc568f1e2014-07-21 00:47:37 -070065 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
66 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
67 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner5f9e2722011-07-23 10:55:15 +000068 D.Diag(diag::err_drv_argument_only_allowed_with)
Stephen Hinesc568f1e2014-07-21 00:47:37 -070069 << A->getBaseArg().getAsString(Args)
70 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
71 }
72 }
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +000073}
74
Daniel Dunbare2fd6642009-09-10 01:21:12 +000075/// CheckCodeGenerationOptions - Perform some validation of code generation
76/// arguments that is shared with gcc.
77static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
78 // In gcc, only ARM checks this, but it seems reasonable to check universally.
79 if (Args.hasArg(options::OPT_static))
80 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
81 options::OPT_mdynamic_no_pic))
Chris Lattner5f9e2722011-07-23 10:55:15 +000082 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbare2fd6642009-09-10 01:21:12 +000083 << A->getAsString(Args) << "-static";
84}
85
Chris Lattner3edbeb72010-03-29 17:55:58 +000086// Quote target names for inclusion in GNU Make dependency files.
87// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner5f9e2722011-07-23 10:55:15 +000088static void QuoteTarget(StringRef Target,
89 SmallVectorImpl<char> &Res) {
Chris Lattner3edbeb72010-03-29 17:55:58 +000090 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
91 switch (Target[i]) {
92 case ' ':
93 case '\t':
94 // Escape the preceding backslashes
95 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
96 Res.push_back('\\');
97
98 // Escape the space/tab
99 Res.push_back('\\');
100 break;
101 case '$':
102 Res.push_back('$');
103 break;
104 case '#':
105 Res.push_back('\\');
106 break;
107 default:
108 break;
109 }
110
111 Res.push_back(Target[i]);
112 }
113}
114
Bill Wendling3d717152012-03-12 22:10:06 +0000115static void addDirectoryList(const ArgList &Args,
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000116 ArgStringList &CmdArgs,
117 const char *ArgName,
Bill Wendling3d717152012-03-12 22:10:06 +0000118 const char *EnvVar) {
119 const char *DirList = ::getenv(EnvVar);
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000120 bool CombinedArg = false;
121
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000122 if (!DirList)
123 return; // Nothing to do.
124
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000125 StringRef Name(ArgName);
126 if (Name.equals("-I") || Name.equals("-L"))
127 CombinedArg = true;
128
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000129 StringRef Dirs(DirList);
130 if (Dirs.empty()) // Empty string should not add '.'.
131 return;
132
133 StringRef::size_type Delim;
Rafael Espindola8db7ec02013-06-25 14:29:51 +0000134 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000135 if (Delim == 0) { // Leading colon.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000136 if (CombinedArg) {
137 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
138 } else {
139 CmdArgs.push_back(ArgName);
140 CmdArgs.push_back(".");
141 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000142 } else {
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000143 if (CombinedArg) {
144 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
145 } else {
146 CmdArgs.push_back(ArgName);
147 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
148 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000149 }
Nico Weber09c5c392012-03-19 15:00:03 +0000150 Dirs = Dirs.substr(Delim + 1);
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000151 }
152
153 if (Dirs.empty()) { // Trailing colon.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000154 if (CombinedArg) {
155 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
156 } else {
157 CmdArgs.push_back(ArgName);
158 CmdArgs.push_back(".");
159 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000160 } else { // Add the last path.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000161 if (CombinedArg) {
162 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
163 } else {
164 CmdArgs.push_back(ArgName);
165 CmdArgs.push_back(Args.MakeArgString(Dirs));
166 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000167 }
168}
169
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000170static void AddLinkerInputs(const ToolChain &TC,
171 const InputInfoList &Inputs, const ArgList &Args,
172 ArgStringList &CmdArgs) {
173 const Driver &D = TC.getDriver();
174
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000175 // Add extra linker input arguments which are not treated as inputs
176 // (constructed via -Xarch_).
177 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
178
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700179 for (const auto &II : Inputs) {
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000180 if (!TC.HasNativeLLVMSupport()) {
181 // Don't try to pass LLVM inputs unless we have native support.
182 if (II.getType() == types::TY_LLVM_IR ||
183 II.getType() == types::TY_LTO_IR ||
184 II.getType() == types::TY_LLVM_BC ||
185 II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000186 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000187 << TC.getTripleString();
188 }
189
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000190 // Add filenames immediately.
191 if (II.isFilename()) {
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000192 CmdArgs.push_back(II.getFilename());
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000193 continue;
194 }
195
196 // Otherwise, this is a linker input argument.
197 const Arg &A = II.getInputArg();
198
199 // Handle reserved library options.
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700200 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar132e35d2010-09-17 01:20:05 +0000201 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700202 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Sen7433fed2010-09-17 18:39:08 +0000203 TC.AddCCKextLibArgs(Args, CmdArgs);
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700204 else
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000205 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000206 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000207
208 // LIBRARY_PATH - included following the user specified library paths.
Stephen Hines651f13c2014-04-23 16:59:28 -0700209 // and only supported on native toolchains.
210 if (!TC.isCrossCompiling())
211 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000212}
213
John McCallf85e1932011-06-15 23:02:42 +0000214/// \brief Determine whether Objective-C automated reference counting is
215/// enabled.
216static bool isObjCAutoRefCount(const ArgList &Args) {
217 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
218}
219
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000220/// \brief Determine whether we are linking the ObjC runtime.
221static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilsona7635f12012-08-07 19:58:00 +0000222 if (isObjCAutoRefCount(Args)) {
223 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000224 return true;
Bob Wilsona7635f12012-08-07 19:58:00 +0000225 }
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000226 return Args.hasArg(options::OPT_fobjc_link_runtime);
227}
228
Michael J. Spencer91e06da2012-10-19 22:37:06 +0000229static bool forwardToGCC(const Option &O) {
Reid Kleckner4cd90df2013-06-19 15:09:06 +0000230 // Don't forward inputs from the original command line. They are added from
231 // InputInfoList.
Richard Smithe40bc4b2013-06-20 01:33:59 +0000232 return O.getKind() != Option::InputClass &&
Michael J. Spencer91e06da2012-10-19 22:37:06 +0000233 !O.hasFlag(options::DriverOption) &&
234 !O.hasFlag(options::LinkerInput);
235}
236
Peter Collingbourne54db68b2011-11-06 00:40:05 +0000237void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier9d718632013-01-24 19:14:47 +0000238 const JobAction &JA,
Peter Collingbourne54db68b2011-11-06 00:40:05 +0000239 const Driver &D,
Douglas Gregordf91ef32009-04-18 00:34:01 +0000240 const ArgList &Args,
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000241 ArgStringList &CmdArgs,
242 const InputInfo &Output,
243 const InputInfoList &Inputs) const {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000244 Arg *A;
Daniel Dunbar3a183d32009-06-08 21:48:20 +0000245
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +0000246 CheckPreprocessingOptions(D, Args);
247
248 Args.AddLastArg(CmdArgs, options::OPT_C);
249 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar3a183d32009-06-08 21:48:20 +0000250
251 // Handle dependency file generation.
Daniel Dunbar9eb93b02010-12-08 21:33:40 +0000252 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000253 (A = Args.getLastArg(options::OPT_MD)) ||
254 (A = Args.getLastArg(options::OPT_MMD))) {
255 // Determine the output location.
256 const char *DepFile;
Benjamin Kramer99c72082012-09-26 19:01:49 +0000257 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000258 DepFile = MF->getValue();
Chad Rosier9d718632013-01-24 19:14:47 +0000259 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer99c72082012-09-26 19:01:49 +0000260 } else if (Output.getType() == types::TY_Dependencies) {
261 DepFile = Output.getFilename();
Daniel Dunbarb827a052009-11-19 03:26:40 +0000262 } else if (A->getOption().matches(options::OPT_M) ||
263 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000264 DepFile = "-";
265 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +0000266 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier9d718632013-01-24 19:14:47 +0000267 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000268 }
269 CmdArgs.push_back("-dependency-file");
270 CmdArgs.push_back(DepFile);
271
Chris Lattner3edbeb72010-03-29 17:55:58 +0000272 // Add a default target if one wasn't specified.
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000273 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
274 const char *DepTarget;
275
276 // If user provided -o, that is the dependency target, except
277 // when we are only generating a dependency file.
278 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
279 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000280 DepTarget = OutputOpt->getValue();
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000281 } else {
282 // Otherwise derive from the base input.
283 //
284 // FIXME: This should use the computed output file location.
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000285 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencer472ccff2010-12-18 00:19:12 +0000286 llvm::sys::path::replace_extension(P, "o");
287 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000288 }
289
290 CmdArgs.push_back("-MT");
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000291 SmallString<128> Quoted;
Chris Lattner3edbeb72010-03-29 17:55:58 +0000292 QuoteTarget(DepTarget, Quoted);
293 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000294 }
295
Daniel Dunbarb827a052009-11-19 03:26:40 +0000296 if (A->getOption().matches(options::OPT_M) ||
297 A->getOption().matches(options::OPT_MD))
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000298 CmdArgs.push_back("-sys-header-deps");
Stephen Hines651f13c2014-04-23 16:59:28 -0700299
300 if (isa<PrecompileJobAction>(JA))
301 CmdArgs.push_back("-module-file-deps");
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000302 }
303
Peter Collingbournebb527862011-07-12 19:35:15 +0000304 if (Args.hasArg(options::OPT_MG)) {
305 if (!A || A->getOption().matches(options::OPT_MD) ||
306 A->getOption().matches(options::OPT_MMD))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000307 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbournebb527862011-07-12 19:35:15 +0000308 CmdArgs.push_back("-MG");
309 }
310
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000311 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000312
313 // Convert all -MQ <target> args to -MT <quoted target>
314 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
315 options::OPT_MQ),
316 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000317 const Arg *A = *it;
318 A->claim();
Chris Lattner3edbeb72010-03-29 17:55:58 +0000319
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000320 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattner3edbeb72010-03-29 17:55:58 +0000321 CmdArgs.push_back("-MT");
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000322 SmallString<128> Quoted;
Richard Smith1d489cf2012-11-01 04:30:05 +0000323 QuoteTarget(A->getValue(), Quoted);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000324 CmdArgs.push_back(Args.MakeArgString(Quoted));
325
326 // -MT flag - no change
327 } else {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000328 A->render(Args, CmdArgs);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000329 }
330 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000331
Douglas Gregordf91ef32009-04-18 00:34:01 +0000332 // Add -i* options, and automatically translate to
333 // -include-pch/-include-pth for transparent PCH support. It's
334 // wonky, but we include looking for .gch so we can support seamless
335 // replacement into a build system already set up to be generating
336 // .gch files.
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000337 bool RenderedImplicitInclude = false;
Daniel Dunbarcdd96862009-11-25 11:53:23 +0000338 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
339 ie = Args.filtered_end(); it != ie; ++it) {
340 const Arg *A = it;
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000341
342 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000343 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
344 RenderedImplicitInclude = true;
345
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +0000346 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000347 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000348
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000349 bool FoundPTH = false;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000350 bool FoundPCH = false;
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000351 SmallString<128> P(A->getValue());
352 // We want the files to have a name like foo.h.pch. Add a dummy extension
353 // so that replace_extension does the right thing.
354 P += ".dummy";
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000355 if (UsePCH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000356 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola829e88d2013-06-25 14:48:00 +0000357 if (llvm::sys::fs::exists(P.str()))
Douglas Gregordf91ef32009-04-18 00:34:01 +0000358 FoundPCH = true;
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000359 }
360
Douglas Gregordf91ef32009-04-18 00:34:01 +0000361 if (!FoundPCH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000362 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola829e88d2013-06-25 14:48:00 +0000363 if (llvm::sys::fs::exists(P.str()))
Douglas Gregordf91ef32009-04-18 00:34:01 +0000364 FoundPTH = true;
Mike Stump1eb44332009-09-09 15:08:12 +0000365 }
366
Douglas Gregordf91ef32009-04-18 00:34:01 +0000367 if (!FoundPCH && !FoundPTH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000368 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola829e88d2013-06-25 14:48:00 +0000369 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000370 FoundPCH = UsePCH;
371 FoundPTH = !UsePCH;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000372 }
Douglas Gregordf91ef32009-04-18 00:34:01 +0000373 }
374
375 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000376 if (IsFirstImplicitInclude) {
377 A->claim();
378 if (UsePCH)
379 CmdArgs.push_back("-include-pch");
380 else
381 CmdArgs.push_back("-include-pth");
382 CmdArgs.push_back(Args.MakeArgString(P.str()));
383 continue;
384 } else {
385 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000386 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000387 << P.str() << A->getAsString(Args);
388 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000389 }
390 }
391
392 // Not translated, render as usual.
393 A->claim();
394 A->render(Args, CmdArgs);
395 }
396
397 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor65e02fa2011-07-28 04:45:53 +0000398 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
399 options::OPT_index_header_map);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000400
401 // Add -Wp, and -Xassembler if using the preprocessor.
402
403 // FIXME: There is a very unfortunate problem here, some troubled
404 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
405 // really support that we would have to parse and then translate
406 // those options. :(
407 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
408 options::OPT_Xpreprocessor);
Daniel Dunbar607d7f62009-10-29 01:53:44 +0000409
410 // -I- is a deprecated GCC feature, reject it.
411 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000412 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000413
414 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
415 // -isysroot to the CC1 invocation.
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000416 StringRef sysroot = C.getSysRoot();
417 if (sysroot != "") {
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000418 if (!Args.hasArg(options::OPT_isysroot)) {
419 CmdArgs.push_back("-isysroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000420 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000421 }
422 }
Douglas Gregor2a060852013-02-07 00:21:12 +0000423
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000424 // Parse additional include paths from environment variables.
Chandler Carruthb5870e72011-11-04 07:12:58 +0000425 // FIXME: We should probably sink the logic for handling these from the
426 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000427 // CPATH - included following the user specified includes (but prior to
428 // builtin and standard includes).
Bill Wendling3d717152012-03-12 22:10:06 +0000429 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000430 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendling3d717152012-03-12 22:10:06 +0000431 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000432 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendling3d717152012-03-12 22:10:06 +0000433 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000434 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendling3d717152012-03-12 22:10:06 +0000435 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000436 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendling3d717152012-03-12 22:10:06 +0000437 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth88491fc2011-11-04 07:12:53 +0000438
Chandler Carruth88491fc2011-11-04 07:12:53 +0000439 // Add C++ include arguments, if needed.
Chandler Carrutha4614422011-11-04 07:43:33 +0000440 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth7ffa0322011-11-04 07:34:47 +0000441 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carruth7d7e9f92011-11-05 20:17:13 +0000442
443 // Add system include arguments.
444 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000445}
446
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000447// FIXME: Move to target hook.
448static bool isSignedCharDefault(const llvm::Triple &Triple) {
449 switch (Triple.getArch()) {
450 default:
451 return true;
452
Tim Northoverc264e162013-01-31 12:13:10 +0000453 case llvm::Triple::aarch64:
Stephen Hines651f13c2014-04-23 16:59:28 -0700454 case llvm::Triple::aarch64_be:
455 case llvm::Triple::arm64:
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700456 case llvm::Triple::arm64_be:
Jim Grosbach5b4e7b12011-05-24 15:40:46 +0000457 case llvm::Triple::arm:
Stephen Hines651f13c2014-04-23 16:59:28 -0700458 case llvm::Triple::armeb:
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700459 if (Triple.isOSDarwin() || Triple.isOSWindows())
460 return true;
461 return false;
462
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000463 case llvm::Triple::ppc:
464 case llvm::Triple::ppc64:
Bob Wilson905c45f2011-10-14 05:03:44 +0000465 if (Triple.isOSDarwin())
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000466 return true;
467 return false;
Ulrich Weigandb8409212013-05-06 16:26:41 +0000468
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000469 case llvm::Triple::ppc64le:
Ulrich Weigandb8409212013-05-06 16:26:41 +0000470 case llvm::Triple::systemz:
Robert Lytton5f15f4d2013-08-13 09:43:10 +0000471 case llvm::Triple::xcore:
Ulrich Weigandb8409212013-05-06 16:26:41 +0000472 return false;
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000473 }
474}
475
Robert Lytton5f15f4d2013-08-13 09:43:10 +0000476static bool isNoCommonDefault(const llvm::Triple &Triple) {
477 switch (Triple.getArch()) {
478 default:
479 return false;
480
481 case llvm::Triple::xcore:
482 return true;
483 }
484}
485
Chad Rosier99317272012-04-04 20:51:35 +0000486// Handle -mfpu=.
487//
488// FIXME: Centralize feature selection, defaulting shouldn't be also in the
489// frontend target.
Amara Emersonfe7ed042013-10-01 10:20:54 +0000490static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
491 const ArgList &Args,
492 std::vector<const char *> &Features) {
493 StringRef FPU = A->getValue();
494 if (FPU == "fp-armv8") {
495 Features.push_back("+fp-armv8");
496 } else if (FPU == "neon-fp-armv8") {
497 Features.push_back("+fp-armv8");
498 Features.push_back("+neon");
499 } else if (FPU == "crypto-neon-fp-armv8") {
500 Features.push_back("+fp-armv8");
501 Features.push_back("+neon");
502 Features.push_back("+crypto");
503 } else if (FPU == "neon") {
504 Features.push_back("+neon");
Amara Emersonfe7ed042013-10-01 10:20:54 +0000505 } else
506 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
507}
508
Silviu Baranga1db2e272013-10-21 10:54:53 +0000509// Handle -mhwdiv=.
510static void getARMHWDivFeatures(const Driver &D, const Arg *A,
511 const ArgList &Args,
512 std::vector<const char *> &Features) {
513 StringRef HWDiv = A->getValue();
514 if (HWDiv == "arm") {
515 Features.push_back("+hwdiv-arm");
516 Features.push_back("-hwdiv");
517 } else if (HWDiv == "thumb") {
518 Features.push_back("-hwdiv-arm");
519 Features.push_back("+hwdiv");
520 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
521 Features.push_back("+hwdiv-arm");
522 Features.push_back("+hwdiv");
523 } else if (HWDiv == "none") {
524 Features.push_back("-hwdiv-arm");
525 Features.push_back("-hwdiv");
526 } else
527 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
528}
529
Amara Emersonfe7ed042013-10-01 10:20:54 +0000530// Handle -mfpu=.
531//
532// FIXME: Centralize feature selection, defaulting shouldn't be also in the
533// frontend target.
534static void getARMFPUFeatures(const Driver &D, const Arg *A,
535 const ArgList &Args,
536 std::vector<const char *> &Features) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000537 StringRef FPU = A->getValue();
Chad Rosier99317272012-04-04 20:51:35 +0000538
539 // Set the target features based on the FPU.
540 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
541 // Disable any default FPU support.
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000542 Features.push_back("-vfp2");
543 Features.push_back("-vfp3");
544 Features.push_back("-neon");
Stephen Hines651f13c2014-04-23 16:59:28 -0700545 } else if (FPU == "vfp") {
546 Features.push_back("+vfp2");
547 Features.push_back("-neon");
Chad Rosier99317272012-04-04 20:51:35 +0000548 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000549 Features.push_back("+vfp3");
550 Features.push_back("+d16");
551 Features.push_back("-neon");
Chad Rosier99317272012-04-04 20:51:35 +0000552 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000553 Features.push_back("+vfp3");
554 Features.push_back("-neon");
Stephen Hines651f13c2014-04-23 16:59:28 -0700555 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
556 Features.push_back("+vfp4");
557 Features.push_back("+d16");
558 Features.push_back("-neon");
559 } else if (FPU == "vfp4" || FPU == "vfpv4") {
560 Features.push_back("+vfp4");
561 Features.push_back("-neon");
562 } else if (FPU == "fp4-sp-d16" || FPU == "fpv4-sp-d16") {
563 Features.push_back("+vfp4");
564 Features.push_back("+d16");
565 Features.push_back("+fp-only-sp");
566 Features.push_back("-neon");
Joey Goulycbed3bf2013-06-27 13:19:54 +0000567 } else if (FPU == "fp-armv8") {
Joey Gouly2b33b7e2013-09-13 13:48:33 +0000568 Features.push_back("+fp-armv8");
Bernard Ogdenf779e652013-10-24 18:32:51 +0000569 Features.push_back("-neon");
570 Features.push_back("-crypto");
Joey Goulycbed3bf2013-06-27 13:19:54 +0000571 } else if (FPU == "neon-fp-armv8") {
Joey Gouly2b33b7e2013-09-13 13:48:33 +0000572 Features.push_back("+fp-armv8");
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000573 Features.push_back("+neon");
Bernard Ogdenf779e652013-10-24 18:32:51 +0000574 Features.push_back("-crypto");
Amara Emersoncdc532c2013-09-19 13:54:03 +0000575 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersoncdc532c2013-09-19 13:54:03 +0000576 Features.push_back("+fp-armv8");
Bernard Ogdenf779e652013-10-24 18:32:51 +0000577 Features.push_back("+neon");
578 Features.push_back("+crypto");
Chad Rosier99317272012-04-04 20:51:35 +0000579 } else if (FPU == "neon") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000580 Features.push_back("+neon");
Amara Emersonfe7ed042013-10-01 10:20:54 +0000581 } else if (FPU == "none") {
582 Features.push_back("-vfp2");
583 Features.push_back("-vfp3");
584 Features.push_back("-vfp4");
585 Features.push_back("-fp-armv8");
586 Features.push_back("-crypto");
587 Features.push_back("-neon");
Chad Rosier99317272012-04-04 20:51:35 +0000588 } else
589 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
590}
591
Anton Korobeynikove2571792012-04-09 13:38:30 +0000592// Select the float ABI as determined by -msoft-float, -mhard-float, and
593// -mfloat-abi=.
Stephen Hines651f13c2014-04-23 16:59:28 -0700594StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
595 const llvm::Triple &Triple) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000596 StringRef FloatABI;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000597 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
598 options::OPT_mhard_float,
599 options::OPT_mfloat_abi_EQ)) {
600 if (A->getOption().matches(options::OPT_msoft_float))
601 FloatABI = "soft";
602 else if (A->getOption().matches(options::OPT_mhard_float))
603 FloatABI = "hard";
604 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000605 FloatABI = A->getValue();
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000606 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000607 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000608 << A->getAsString(Args);
609 FloatABI = "soft";
610 }
611 }
612 }
613
614 // If unspecified, choose the default based on the platform.
615 if (FloatABI.empty()) {
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000616 switch (Triple.getOS()) {
Bob Wilson905c45f2011-10-14 05:03:44 +0000617 case llvm::Triple::Darwin:
618 case llvm::Triple::MacOSX:
619 case llvm::Triple::IOS: {
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000620 // Darwin defaults to "softfp" for v6 and v7.
621 //
622 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000623 std::string ArchName =
Stephen Hines651f13c2014-04-23 16:59:28 -0700624 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000625 if (StringRef(ArchName).startswith("v6") ||
626 StringRef(ArchName).startswith("v7"))
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000627 FloatABI = "softfp";
628 else
629 FloatABI = "soft";
630 break;
631 }
632
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700633 // FIXME: this is invalid for WindowsCE
634 case llvm::Triple::Win32:
635 FloatABI = "hard";
636 break;
637
Rafael Espindola27fa2362012-12-13 04:17:14 +0000638 case llvm::Triple::FreeBSD:
Stephen Hines651f13c2014-04-23 16:59:28 -0700639 switch(Triple.getEnvironment()) {
640 case llvm::Triple::GNUEABIHF:
641 FloatABI = "hard";
642 break;
643 default:
644 // FreeBSD defaults to soft float
645 FloatABI = "soft";
646 break;
647 }
Rafael Espindola27fa2362012-12-13 04:17:14 +0000648 break;
649
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000650 default:
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000651 switch(Triple.getEnvironment()) {
Jiangning Liuff104a12012-07-31 08:06:29 +0000652 case llvm::Triple::GNUEABIHF:
653 FloatABI = "hard";
654 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000655 case llvm::Triple::GNUEABI:
656 FloatABI = "softfp";
657 break;
Stephen Hines651f13c2014-04-23 16:59:28 -0700658 case llvm::Triple::EABIHF:
659 FloatABI = "hard";
660 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000661 case llvm::Triple::EABI:
662 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
663 FloatABI = "softfp";
664 break;
Logan Chien94a71422012-09-02 09:30:11 +0000665 case llvm::Triple::Android: {
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000666 std::string ArchName =
Stephen Hines651f13c2014-04-23 16:59:28 -0700667 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000668 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthb43550b2012-01-10 19:47:42 +0000669 FloatABI = "softfp";
670 else
671 FloatABI = "soft";
672 break;
673 }
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000674 default:
675 // Assume "soft", but warn the user we are guessing.
676 FloatABI = "soft";
Stephen Hines651f13c2014-04-23 16:59:28 -0700677 if (Triple.getOS() != llvm::Triple::UnknownOS ||
678 !Triple.isOSBinFormatMachO())
679 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000680 break;
681 }
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000682 }
683 }
684
Anton Korobeynikove2571792012-04-09 13:38:30 +0000685 return FloatABI;
686}
687
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000688static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
689 const ArgList &Args,
Stephen Hines651f13c2014-04-23 16:59:28 -0700690 std::vector<const char *> &Features,
691 bool ForAS) {
692 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
693 if (!ForAS) {
694 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
695 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
696 // stripped out by the ARM target. We should probably pass this a new
697 // -target-option, which is handled by the -cc1/-cc1as invocation.
698 //
699 // FIXME2: For consistency, it would be ideal if we set up the target
700 // machine state the same when using the frontend or the assembler. We don't
701 // currently do that for the assembler, we pass the options directly to the
702 // backend and never even instantiate the frontend TargetInfo. If we did,
703 // and used its handleTargetFeatures hook, then we could ensure the
704 // assembler and the frontend behave the same.
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000705
Stephen Hines651f13c2014-04-23 16:59:28 -0700706 // Use software floating point operations?
707 if (FloatABI == "soft")
708 Features.push_back("+soft-float");
709
710 // Use software floating point argument passing?
711 if (FloatABI != "hard")
712 Features.push_back("+soft-float-abi");
713 }
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000714
715 // Honor -mfpu=.
716 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emersonfe7ed042013-10-01 10:20:54 +0000717 getARMFPUFeatures(D, A, Args, Features);
Silviu Baranga1db2e272013-10-21 10:54:53 +0000718 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
719 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000720
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000721 // Setting -msoft-float effectively disables NEON because of the GCC
722 // implementation, although the same isn't true of VFP or VFP3.
Stephen Hines651f13c2014-04-23 16:59:28 -0700723 if (FloatABI == "soft") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000724 Features.push_back("-neon");
Stephen Hines651f13c2014-04-23 16:59:28 -0700725 // Also need to explicitly disable features which imply NEON.
726 Features.push_back("-crypto");
727 }
Bernard Ogden909f35a2013-10-29 09:47:51 +0000728
729 // En/disable crc
730 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
731 options::OPT_mnocrc)) {
732 if (A->getOption().matches(options::OPT_mcrc))
733 Features.push_back("+crc");
734 else
735 Features.push_back("-crc");
736 }
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000737}
Anton Korobeynikove2571792012-04-09 13:38:30 +0000738
739void Clang::AddARMTargetArgs(const ArgList &Args,
740 ArgStringList &CmdArgs,
741 bool KernelOrKext) const {
742 const Driver &D = getToolChain().getDriver();
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000743 // Get the effective triple, which takes into account the deployment target.
744 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
745 llvm::Triple Triple(TripleStr);
Stephen Hines651f13c2014-04-23 16:59:28 -0700746 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikove2571792012-04-09 13:38:30 +0000747
748 // Select the ABI to use.
749 //
750 // FIXME: Support -meabi.
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700751 const char *ABIName = nullptr;
Anton Korobeynikove2571792012-04-09 13:38:30 +0000752 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000753 ABIName = A->getValue();
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700754 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000755 // The backend is hardwired to assume AAPCS for M-class processors, ensure
756 // the frontend matches that.
Tim Northoverfc1a75b2013-10-03 14:23:28 +0000757 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Stephen Hines651f13c2014-04-23 16:59:28 -0700758 (Triple.getOS() == llvm::Triple::UnknownOS &&
759 Triple.getObjectFormat() == llvm::Triple::MachO) ||
Tim Northoverfc1a75b2013-10-03 14:23:28 +0000760 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000761 ABIName = "aapcs";
762 } else {
763 ABIName = "apcs-gnu";
764 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700765 } else if (Triple.isOSWindows()) {
766 // FIXME: this is invalid for WindowsCE
767 ABIName = "aapcs";
Anton Korobeynikove2571792012-04-09 13:38:30 +0000768 } else {
769 // Select the default based on the platform.
770 switch(Triple.getEnvironment()) {
Logan Chien94a71422012-09-02 09:30:11 +0000771 case llvm::Triple::Android:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000772 case llvm::Triple::GNUEABI:
Jiangning Liuff104a12012-07-31 08:06:29 +0000773 case llvm::Triple::GNUEABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000774 ABIName = "aapcs-linux";
775 break;
Stephen Hines651f13c2014-04-23 16:59:28 -0700776 case llvm::Triple::EABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000777 case llvm::Triple::EABI:
778 ABIName = "aapcs";
779 break;
780 default:
781 ABIName = "apcs-gnu";
782 }
783 }
784 CmdArgs.push_back("-target-abi");
785 CmdArgs.push_back(ABIName);
786
Anton Korobeynikove2571792012-04-09 13:38:30 +0000787 // Determine floating point ABI from the options & target defaults.
Stephen Hines651f13c2014-04-23 16:59:28 -0700788 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000789 if (FloatABI == "soft") {
790 // Floating point operations and argument passing are soft.
791 //
792 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbar3b315262009-11-30 08:42:00 +0000793 CmdArgs.push_back("-msoft-float");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000794 CmdArgs.push_back("-mfloat-abi");
795 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000796 } else if (FloatABI == "softfp") {
797 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000798 CmdArgs.push_back("-mfloat-abi");
799 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000800 } else {
801 // Floating point operations and argument passing are hard.
802 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000803 CmdArgs.push_back("-mfloat-abi");
804 CmdArgs.push_back("hard");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000805 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +0000806
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000807 // Kernel code has more strict alignment requirements.
808 if (KernelOrKext) {
Cameron Esfahani57b1da12013-09-14 01:09:11 +0000809 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000810 CmdArgs.push_back("-backend-option");
811 CmdArgs.push_back("-arm-long-calls");
812 }
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000813
Daniel Dunbar3c66d302011-03-22 16:48:17 +0000814 CmdArgs.push_back("-backend-option");
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000815 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000816
817 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000818 CmdArgs.push_back("-backend-option");
Renato Golinebc313d2013-08-15 20:54:45 +0000819 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000820 }
Chad Rosier1b906052011-08-26 00:26:29 +0000821
822 // Setting -mno-global-merge disables the codegen global merge pass. Setting
823 // -mglobal-merge has no effect as the pass is enabled by default.
824 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
825 options::OPT_mno_global_merge)) {
826 if (A->getOption().matches(options::OPT_mno_global_merge))
827 CmdArgs.push_back("-mno-global-merge");
828 }
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000829
Bob Wilsonf6f77bd2013-04-11 18:53:25 +0000830 if (!Args.hasFlag(options::OPT_mimplicit_float,
831 options::OPT_mno_implicit_float,
832 true))
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000833 CmdArgs.push_back("-no-implicit-float");
Renato Golin45bd2942013-08-24 14:44:35 +0000834
Stephen Hines651f13c2014-04-23 16:59:28 -0700835 // llvm does not support reserving registers in general. There is support
836 // for reserving r9 on ARM though (defined as a platform-specific register
837 // in ARM EABI).
838 if (Args.hasArg(options::OPT_ffixed_r9)) {
839 CmdArgs.push_back("-backend-option");
840 CmdArgs.push_back("-arm-reserve-r9");
841 }
842}
843
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700844/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
845/// targeting.
846static std::string getAArch64TargetCPU(const ArgList &Args) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700847 // If we have -mcpu=, use that.
848 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
849 StringRef MCPU = A->getValue();
850 // Handle -mcpu=native.
851 if (MCPU == "native")
852 return llvm::sys::getHostCPUName();
853 else
854 return MCPU;
855 }
856
857 // At some point, we may need to check -march here, but for now we only
858 // one arm64 architecture.
859
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700860 // Make sure we pick "cyclone" if -arch is used.
861 // FIXME: Should this be picked by checking the target triple instead?
862 if (Args.getLastArg(options::OPT_arch))
863 return "cyclone";
864
865 return "generic";
Stephen Hines651f13c2014-04-23 16:59:28 -0700866}
867
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700868void Clang::AddAArch64TargetArgs(const ArgList &Args,
869 ArgStringList &CmdArgs) const {
Stephen Hines651f13c2014-04-23 16:59:28 -0700870 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
871 llvm::Triple Triple(TripleStr);
872
873 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
874 Args.hasArg(options::OPT_mkernel) ||
875 Args.hasArg(options::OPT_fapple_kext))
876 CmdArgs.push_back("-disable-red-zone");
877
878 if (!Args.hasFlag(options::OPT_mimplicit_float,
879 options::OPT_mno_implicit_float, true))
880 CmdArgs.push_back("-no-implicit-float");
881
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700882 const char *ABIName = nullptr;
Stephen Hines651f13c2014-04-23 16:59:28 -0700883 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
884 ABIName = A->getValue();
885 else if (Triple.isOSDarwin())
886 ABIName = "darwinpcs";
887 else
888 ABIName = "aapcs";
889
890 CmdArgs.push_back("-target-abi");
891 CmdArgs.push_back(ABIName);
892
893 CmdArgs.push_back("-target-cpu");
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700894 CmdArgs.push_back(Args.MakeArgString(getAArch64TargetCPU(Args)));
Stephen Hines651f13c2014-04-23 16:59:28 -0700895
896 if (Args.hasArg(options::OPT_mstrict_align)) {
897 CmdArgs.push_back("-backend-option");
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700898 CmdArgs.push_back("-aarch64-strict-align");
Stephen Hines651f13c2014-04-23 16:59:28 -0700899 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700900
Stephen Hines7fb0af82014-10-17 08:52:15 -0700901 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
902 options::OPT_mno_fix_cortex_a53_835769)) {
903 CmdArgs.push_back("-backend-option");
904 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
905 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
906 else
907 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
908 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
909 // Enabled A53 errata (835769) workaround by default on android
910 CmdArgs.push_back("-backend-option");
911 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
912 }
913
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700914 // Setting -mno-global-merge disables the codegen global merge pass. Setting
915 // -mglobal-merge has no effect as the pass is enabled by default.
916 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
917 options::OPT_mno_global_merge)) {
918 if (A->getOption().matches(options::OPT_mno_global_merge))
919 CmdArgs.push_back("-mno-global-merge");
920 }
Daniel Dunbarb163ef72009-09-10 04:57:17 +0000921}
922
Simon Atanasyana2768be2012-04-07 22:09:23 +0000923// Get CPU and ABI names. They are not independent
924// so we have to calculate them together.
925static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindolab330e402013-08-20 22:12:08 +0000926 const llvm::Triple &Triple,
Simon Atanasyana2768be2012-04-07 22:09:23 +0000927 StringRef &CPUName,
928 StringRef &ABIName) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700929 const char *DefMips32CPU = "mips32r2";
930 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka9f360622011-09-26 21:07:52 +0000931
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700932 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
933 // default for mips64(el)?-img-linux-gnu.
934 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
935 Triple.getEnvironment() == llvm::Triple::GNU) {
936 DefMips32CPU = "mips32r6";
937 DefMips64CPU = "mips64r6";
938 }
939
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000940 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan66751bc2013-10-09 12:12:24 +0000941 options::OPT_mcpu_EQ))
942 CPUName = A->getValue();
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000943
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +0000944 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000945 ABIName = A->getValue();
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +0000946 // Convert a GNU style Mips ABI name to the name
947 // accepted by LLVM Mips backend.
948 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
949 .Case("32", "o32")
950 .Case("64", "n64")
951 .Default(ABIName);
952 }
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000953
954 // Setup default CPU and ABI names.
955 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindolab330e402013-08-20 22:12:08 +0000956 switch (Triple.getArch()) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000957 default:
958 llvm_unreachable("Unexpected triple arch name");
959 case llvm::Triple::mips:
960 case llvm::Triple::mipsel:
961 CPUName = DefMips32CPU;
962 break;
963 case llvm::Triple::mips64:
964 case llvm::Triple::mips64el:
965 CPUName = DefMips64CPU;
966 break;
967 }
968 }
969
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700970 if (ABIName.empty()) {
971 // Deduce ABI name from the target triple.
972 if (Triple.getArch() == llvm::Triple::mips ||
973 Triple.getArch() == llvm::Triple::mipsel)
974 ABIName = "o32";
975 else
976 ABIName = "n64";
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000977 }
978
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700979 if (CPUName.empty()) {
980 // Deduce CPU name from ABI name.
981 CPUName = llvm::StringSwitch<const char *>(ABIName)
982 .Cases("o32", "eabi", DefMips32CPU)
983 .Cases("n32", "n64", DefMips64CPU)
984 .Default("");
985 }
Simon Atanasyana2768be2012-04-07 22:09:23 +0000986}
987
Simon Atanasyane9616a42013-02-27 14:55:49 +0000988// Convert ABI name to the GNU tools acceptable variant.
989static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
990 return llvm::StringSwitch<llvm::StringRef>(ABI)
991 .Case("o32", "32")
992 .Case("n64", "64")
993 .Default(ABI);
994}
995
Simon Atanasyan5e627792012-06-02 15:06:29 +0000996// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
997// and -mfloat-abi=.
998static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000999 StringRef FloatABI;
Eric Christophered734732010-03-02 02:41:08 +00001000 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001001 options::OPT_mhard_float,
1002 options::OPT_mfloat_abi_EQ)) {
Eric Christophered734732010-03-02 02:41:08 +00001003 if (A->getOption().matches(options::OPT_msoft_float))
1004 FloatABI = "soft";
1005 else if (A->getOption().matches(options::OPT_mhard_float))
1006 FloatABI = "hard";
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001007 else {
Richard Smith1d489cf2012-11-01 04:30:05 +00001008 FloatABI = A->getValue();
Simon Atanasyan2ed42b82013-04-14 08:37:15 +00001009 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan5e627792012-06-02 15:06:29 +00001010 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001011 FloatABI = "hard";
1012 }
1013 }
Eric Christophered734732010-03-02 02:41:08 +00001014 }
1015
1016 // If unspecified, choose the default based on the platform.
1017 if (FloatABI.empty()) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001018 // Assume "hard", because it's a default value used by gcc.
1019 // When we start to recognize specific target MIPS processors,
1020 // we will be able to select the default more correctly.
1021 FloatABI = "hard";
Eric Christophered734732010-03-02 02:41:08 +00001022 }
1023
Simon Atanasyan5e627792012-06-02 15:06:29 +00001024 return FloatABI;
1025}
1026
Simon Atanasyandc536f52012-07-05 18:51:43 +00001027static void AddTargetFeature(const ArgList &Args,
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001028 std::vector<const char *> &Features,
1029 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyandc536f52012-07-05 18:51:43 +00001030 StringRef FeatureName) {
1031 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyandc536f52012-07-05 18:51:43 +00001032 if (A->getOption().matches(OnOpt))
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001033 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyandc536f52012-07-05 18:51:43 +00001034 else
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001035 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyandc536f52012-07-05 18:51:43 +00001036 }
1037}
1038
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001039static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
1040 std::vector<const char *> &Features) {
1041 StringRef FloatABI = getMipsFloatABI(D, Args);
Stephen Hines651f13c2014-04-23 16:59:28 -07001042 if (FloatABI == "soft") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001043 // FIXME: Note, this is a hack. We need to pass the selected float
1044 // mode to the MipsTargetInfoBase to define appropriate macros there.
1045 // Now it is the only method.
1046 Features.push_back("+soft-float");
1047 }
1048
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00001049 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001050 StringRef Val = StringRef(A->getValue());
1051 if (Val == "2008")
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00001052 Features.push_back("+nan2008");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001053 else if (Val == "legacy")
1054 Features.push_back("-nan2008");
1055 else
1056 D.Diag(diag::err_drv_unsupported_option_argument)
1057 << A->getOption().getName() << Val;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00001058 }
1059
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001060 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1061 options::OPT_mdouble_float, "single-float");
1062 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1063 "mips16");
1064 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1065 options::OPT_mno_micromips, "micromips");
1066 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1067 "dsp");
1068 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1069 "dspr2");
1070 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1071 "msa");
Daniel Sandersaf7ed9e2013-10-17 14:55:58 +00001072 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
1073 "fp64");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001074 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1075 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001076}
1077
Simon Atanasyan5e627792012-06-02 15:06:29 +00001078void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyana8141612013-04-14 14:07:41 +00001079 ArgStringList &CmdArgs) const {
Simon Atanasyan5e627792012-06-02 15:06:29 +00001080 const Driver &D = getToolChain().getDriver();
1081 StringRef CPUName;
1082 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00001083 const llvm::Triple &Triple = getToolChain().getTriple();
1084 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan5e627792012-06-02 15:06:29 +00001085
1086 CmdArgs.push_back("-target-abi");
1087 CmdArgs.push_back(ABIName.data());
1088
1089 StringRef FloatABI = getMipsFloatABI(D, Args);
1090
Stephen Hines651f13c2014-04-23 16:59:28 -07001091 if (FloatABI == "soft") {
Eric Christophered734732010-03-02 02:41:08 +00001092 // Floating point operations and argument passing are soft.
Eric Christophered734732010-03-02 02:41:08 +00001093 CmdArgs.push_back("-msoft-float");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001094 CmdArgs.push_back("-mfloat-abi");
1095 CmdArgs.push_back("soft");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001096 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001097 else {
1098 // Floating point operations and argument passing are hard.
Eric Christophered734732010-03-02 02:41:08 +00001099 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001100 CmdArgs.push_back("-mfloat-abi");
1101 CmdArgs.push_back("hard");
Eric Christophered734732010-03-02 02:41:08 +00001102 }
Simon Atanasyan0b273ef2012-07-05 14:19:39 +00001103
Simon Atanasyanbda07ac2012-12-01 18:27:21 +00001104 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1105 if (A->getOption().matches(options::OPT_mxgot)) {
1106 CmdArgs.push_back("-mllvm");
1107 CmdArgs.push_back("-mxgot");
1108 }
1109 }
1110
Simon Atanasyan6bdc4c62013-05-11 06:33:44 +00001111 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1112 options::OPT_mno_ldc1_sdc1)) {
1113 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1114 CmdArgs.push_back("-mllvm");
1115 CmdArgs.push_back("-mno-ldc1-sdc1");
1116 }
1117 }
1118
Akira Hatanakacdbc3b32013-07-19 18:58:48 +00001119 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1120 options::OPT_mno_check_zero_division)) {
1121 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1122 CmdArgs.push_back("-mllvm");
1123 CmdArgs.push_back("-mno-check-zero-division");
1124 }
1125 }
1126
Simon Atanasyan9804b762012-08-27 20:55:56 +00001127 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001128 StringRef v = A->getValue();
Simon Atanasyan9804b762012-08-27 20:55:56 +00001129 CmdArgs.push_back("-mllvm");
1130 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1131 A->claim();
1132 }
Eric Christophered734732010-03-02 02:41:08 +00001133}
1134
Hal Finkel02a84272012-06-11 22:35:19 +00001135/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1136static std::string getPPCTargetCPU(const ArgList &Args) {
1137 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001138 StringRef CPUName = A->getValue();
Hal Finkel02a84272012-06-11 22:35:19 +00001139
1140 if (CPUName == "native") {
1141 std::string CPU = llvm::sys::getHostCPUName();
1142 if (!CPU.empty() && CPU != "generic")
1143 return CPU;
1144 else
1145 return "";
1146 }
1147
1148 return llvm::StringSwitch<const char *>(CPUName)
1149 .Case("common", "generic")
1150 .Case("440", "440")
1151 .Case("440fp", "440")
1152 .Case("450", "450")
1153 .Case("601", "601")
1154 .Case("602", "602")
1155 .Case("603", "603")
1156 .Case("603e", "603e")
1157 .Case("603ev", "603ev")
1158 .Case("604", "604")
1159 .Case("604e", "604e")
1160 .Case("620", "620")
Bill Schmidt2821e182013-02-01 20:23:10 +00001161 .Case("630", "pwr3")
Hal Finkel02a84272012-06-11 22:35:19 +00001162 .Case("G3", "g3")
1163 .Case("7400", "7400")
1164 .Case("G4", "g4")
1165 .Case("7450", "7450")
1166 .Case("G4+", "g4+")
1167 .Case("750", "750")
1168 .Case("970", "970")
1169 .Case("G5", "g5")
1170 .Case("a2", "a2")
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001171 .Case("a2q", "a2q")
Hal Finkel7de32962012-09-18 22:25:03 +00001172 .Case("e500mc", "e500mc")
1173 .Case("e5500", "e5500")
Bill Schmidt2821e182013-02-01 20:23:10 +00001174 .Case("power3", "pwr3")
1175 .Case("power4", "pwr4")
1176 .Case("power5", "pwr5")
1177 .Case("power5x", "pwr5x")
Hal Finkel02a84272012-06-11 22:35:19 +00001178 .Case("power6", "pwr6")
Bill Schmidt2821e182013-02-01 20:23:10 +00001179 .Case("power6x", "pwr6x")
Hal Finkel02a84272012-06-11 22:35:19 +00001180 .Case("power7", "pwr7")
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001181 .Case("power8", "pwr8")
Bill Schmidt2821e182013-02-01 20:23:10 +00001182 .Case("pwr3", "pwr3")
1183 .Case("pwr4", "pwr4")
1184 .Case("pwr5", "pwr5")
1185 .Case("pwr5x", "pwr5x")
1186 .Case("pwr6", "pwr6")
1187 .Case("pwr6x", "pwr6x")
1188 .Case("pwr7", "pwr7")
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001189 .Case("pwr8", "pwr8")
Hal Finkel02a84272012-06-11 22:35:19 +00001190 .Case("powerpc", "ppc")
1191 .Case("powerpc64", "ppc64")
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001192 .Case("powerpc64le", "ppc64le")
Hal Finkel02a84272012-06-11 22:35:19 +00001193 .Default("");
1194 }
1195
1196 return "";
1197}
1198
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001199static void getPPCTargetFeatures(const ArgList &Args,
1200 std::vector<const char *> &Features) {
Eric Christopherd5e59fc2013-10-16 20:40:08 +00001201 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1202 ie = Args.filtered_end();
1203 it != ie; ++it) {
1204 StringRef Name = (*it)->getOption().getName();
1205 (*it)->claim();
1206
1207 // Skip over "-m".
1208 assert(Name.startswith("m") && "Invalid feature name.");
1209 Name = Name.substr(1);
1210
1211 bool IsNegative = Name.startswith("no-");
1212 if (IsNegative)
1213 Name = Name.substr(3);
1214
1215 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1216 // pass the correct option to the backend while calling the frontend
1217 // option the same.
1218 // TODO: Change the LLVM backend option maybe?
1219 if (Name == "mfcrf")
1220 Name = "mfocrf";
1221
1222 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1223 }
1224
1225 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001226 AddTargetFeature(Args, Features, options::OPT_faltivec,
1227 options::OPT_fno_altivec, "altivec");
Hal Finkel02a84272012-06-11 22:35:19 +00001228}
1229
Tom Stellarde25d2f62013-04-01 20:56:53 +00001230/// Get the (LLVM) name of the R600 gpu we are targeting.
1231static std::string getR600TargetGPU(const ArgList &Args) {
1232 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001233 const char *GPUName = A->getValue();
Tom Stellarde25d2f62013-04-01 20:56:53 +00001234 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardfd4aa4b2013-05-06 16:12:05 +00001235 .Cases("rv630", "rv635", "r600")
1236 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellarde25d2f62013-04-01 20:56:53 +00001237 .Case("rv740", "rv770")
1238 .Case("palm", "cedar")
Tom Stellardfd4aa4b2013-05-06 16:12:05 +00001239 .Cases("sumo", "sumo2", "sumo")
Tom Stellarde25d2f62013-04-01 20:56:53 +00001240 .Case("hemlock", "cypress")
1241 .Case("aruba", "cayman")
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001242 .Default(GPUName);
Tom Stellarde25d2f62013-04-01 20:56:53 +00001243 }
1244 return "";
1245}
1246
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001247static void getSparcTargetFeatures(const ArgList &Args,
1248 std::vector<const char *> Features) {
1249 bool SoftFloatABI = true;
1250 if (Arg *A =
1251 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1252 if (A->getOption().matches(options::OPT_mhard_float))
1253 SoftFloatABI = false;
1254 }
1255 if (SoftFloatABI)
1256 Features.push_back("+soft-float");
1257}
1258
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001259void Clang::AddSparcTargetArgs(const ArgList &Args,
1260 ArgStringList &CmdArgs) const {
1261 const Driver &D = getToolChain().getDriver();
1262
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001263 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner5f9e2722011-07-23 10:55:15 +00001264 StringRef FloatABI;
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001265 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1266 options::OPT_mhard_float)) {
1267 if (A->getOption().matches(options::OPT_msoft_float))
1268 FloatABI = "soft";
1269 else if (A->getOption().matches(options::OPT_mhard_float))
1270 FloatABI = "hard";
1271 }
1272
1273 // If unspecified, choose the default based on the platform.
1274 if (FloatABI.empty()) {
Aaron Ballmand58915e2013-07-15 13:41:33 +00001275 // Assume "soft", but warn the user we are guessing.
1276 FloatABI = "soft";
1277 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001278 }
1279
1280 if (FloatABI == "soft") {
1281 // Floating point operations and argument passing are soft.
1282 //
1283 // FIXME: This changes CPP defines, we need -target-soft-float.
1284 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001285 } else {
1286 assert(FloatABI == "hard" && "Invalid float abi!");
1287 CmdArgs.push_back("-mhard-float");
1288 }
1289}
1290
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00001291static const char *getSystemZTargetCPU(const ArgList &Args) {
1292 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1293 return A->getValue();
1294 return "z10";
1295}
1296
Chandler Carruth700d4e42013-01-13 11:46:33 +00001297static const char *getX86TargetCPU(const ArgList &Args,
1298 const llvm::Triple &Triple) {
1299 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001300 if (StringRef(A->getValue()) != "native") {
1301 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
1302 return "core-avx2";
1303
Chandler Carruth700d4e42013-01-13 11:46:33 +00001304 return A->getValue();
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001305 }
Chandler Carruth700d4e42013-01-13 11:46:33 +00001306
1307 // FIXME: Reject attempts to use -march=native unless the target matches
1308 // the host.
1309 //
1310 // FIXME: We should also incorporate the detected target features for use
1311 // with -native.
1312 std::string CPU = llvm::sys::getHostCPUName();
1313 if (!CPU.empty() && CPU != "generic")
1314 return Args.MakeArgString(CPU);
1315 }
1316
1317 // Select the default CPU if none was given (or detection failed).
1318
1319 if (Triple.getArch() != llvm::Triple::x86_64 &&
1320 Triple.getArch() != llvm::Triple::x86)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001321 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth700d4e42013-01-13 11:46:33 +00001322
1323 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1324
1325 // FIXME: Need target hooks.
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001326 if (Triple.isOSDarwin()) {
1327 if (Triple.getArchName() == "x86_64h")
1328 return "core-avx2";
Chandler Carruth700d4e42013-01-13 11:46:33 +00001329 return Is64Bit ? "core2" : "yonah";
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001330 }
Chandler Carruth700d4e42013-01-13 11:46:33 +00001331
Stephen Hines651f13c2014-04-23 16:59:28 -07001332 // On Android use targets compatible with gcc
Chandler Carruth700d4e42013-01-13 11:46:33 +00001333 if (Triple.getEnvironment() == llvm::Triple::Android)
Stephen Hines651f13c2014-04-23 16:59:28 -07001334 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth700d4e42013-01-13 11:46:33 +00001335
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001336 // Everything else goes to x86-64 in 64-bit mode.
1337 if (Is64Bit)
1338 return "x86-64";
1339
1340 switch (Triple.getOS()) {
1341 case llvm::Triple::FreeBSD:
1342 case llvm::Triple::NetBSD:
1343 case llvm::Triple::OpenBSD:
1344 return "i486";
1345 case llvm::Triple::Haiku:
1346 return "i586";
1347 case llvm::Triple::Bitrig:
1348 return "i686";
1349 default:
1350 // Fallback to p4.
1351 return "pentium4";
1352 }
Chandler Carruth700d4e42013-01-13 11:46:33 +00001353}
1354
Rafael Espindolab330e402013-08-20 22:12:08 +00001355static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1356 switch(T.getArch()) {
1357 default:
1358 return "";
1359
Amara Emerson3bb1b5c2013-10-31 09:32:33 +00001360 case llvm::Triple::aarch64:
Stephen Hines651f13c2014-04-23 16:59:28 -07001361 case llvm::Triple::aarch64_be:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001362 case llvm::Triple::arm64:
1363 case llvm::Triple::arm64_be:
1364 return getAArch64TargetCPU(Args);
Amara Emerson3bb1b5c2013-10-31 09:32:33 +00001365
Rafael Espindolab330e402013-08-20 22:12:08 +00001366 case llvm::Triple::arm:
Stephen Hines651f13c2014-04-23 16:59:28 -07001367 case llvm::Triple::armeb:
Rafael Espindolab330e402013-08-20 22:12:08 +00001368 case llvm::Triple::thumb:
Stephen Hines651f13c2014-04-23 16:59:28 -07001369 case llvm::Triple::thumbeb:
1370 return arm::getARMTargetCPU(Args, T);
Rafael Espindolab330e402013-08-20 22:12:08 +00001371
1372 case llvm::Triple::mips:
1373 case llvm::Triple::mipsel:
1374 case llvm::Triple::mips64:
1375 case llvm::Triple::mips64el: {
1376 StringRef CPUName;
1377 StringRef ABIName;
1378 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1379 return CPUName;
1380 }
1381
1382 case llvm::Triple::ppc:
1383 case llvm::Triple::ppc64:
1384 case llvm::Triple::ppc64le: {
1385 std::string TargetCPUName = getPPCTargetCPU(Args);
1386 // LLVM may default to generating code for the native CPU,
1387 // but, like gcc, we default to a more generic option for
1388 // each architecture. (except on Darwin)
1389 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1390 if (T.getArch() == llvm::Triple::ppc64)
1391 TargetCPUName = "ppc64";
1392 else if (T.getArch() == llvm::Triple::ppc64le)
1393 TargetCPUName = "ppc64le";
1394 else
1395 TargetCPUName = "ppc";
1396 }
1397 return TargetCPUName;
1398 }
1399
1400 case llvm::Triple::sparc:
Stephen Hines651f13c2014-04-23 16:59:28 -07001401 case llvm::Triple::sparcv9:
1402 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindolab330e402013-08-20 22:12:08 +00001403 return A->getValue();
1404 return "";
1405
1406 case llvm::Triple::x86:
1407 case llvm::Triple::x86_64:
1408 return getX86TargetCPU(Args, T);
1409
1410 case llvm::Triple::hexagon:
1411 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1412
1413 case llvm::Triple::systemz:
1414 return getSystemZTargetCPU(Args);
1415
1416 case llvm::Triple::r600:
1417 return getR600TargetGPU(Args);
1418 }
1419}
1420
Stephen Hines651f13c2014-04-23 16:59:28 -07001421static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1422 ArgStringList &CmdArgs) {
1423 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1424 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1425 // forward.
1426 CmdArgs.push_back("-plugin");
1427 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1428 CmdArgs.push_back(Args.MakeArgString(Plugin));
1429
1430 // Try to pass driver level flags relevant to LTO code generation down to
1431 // the plugin.
1432
1433 // Handle flags for selecting CPU variants.
1434 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1435 if (!CPU.empty())
1436 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1437}
1438
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001439static void getX86TargetFeatures(const llvm::Triple &Triple,
1440 const ArgList &Args,
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001441 std::vector<const char *> &Features) {
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001442 if (Triple.getArchName() == "x86_64h") {
1443 // x86_64h implies quite a few of the more modern subtarget features
1444 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1445 Features.push_back("-rdrnd");
1446 Features.push_back("-aes");
1447 Features.push_back("-pclmul");
1448 Features.push_back("-rtm");
1449 Features.push_back("-hle");
1450 Features.push_back("-fsgsbase");
1451 }
1452
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001453 // Add features to comply with gcc on Android
Stephen Hines651f13c2014-04-23 16:59:28 -07001454 if (Triple.getEnvironment() == llvm::Triple::Android) {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001455 if (Triple.getArch() == llvm::Triple::x86_64) {
1456 Features.push_back("+sse4.2");
1457 Features.push_back("+popcnt");
1458 } else
1459 Features.push_back("+ssse3");
Stephen Hines651f13c2014-04-23 16:59:28 -07001460 }
1461
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001462 // Now add any that the user explicitly requested on the command line,
1463 // which may override the defaults.
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001464 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1465 ie = Args.filtered_end();
1466 it != ie; ++it) {
1467 StringRef Name = (*it)->getOption().getName();
1468 (*it)->claim();
1469
1470 // Skip over "-m".
1471 assert(Name.startswith("m") && "Invalid feature name.");
1472 Name = Name.substr(1);
1473
1474 bool IsNegative = Name.startswith("no-");
1475 if (IsNegative)
1476 Name = Name.substr(3);
1477
1478 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1479 }
1480}
1481
Daniel Dunbar6acda162009-09-09 22:33:08 +00001482void Clang::AddX86TargetArgs(const ArgList &Args,
1483 ArgStringList &CmdArgs) const {
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001484 if (!Args.hasFlag(options::OPT_mred_zone,
1485 options::OPT_mno_red_zone,
1486 true) ||
1487 Args.hasArg(options::OPT_mkernel) ||
1488 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar66861e02009-11-20 22:21:36 +00001489 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001490
Bob Wilsonf0c54562013-02-10 16:01:41 +00001491 // Default to avoid implicit floating-point for kernel/kext code, but allow
1492 // that to be overridden with -mno-soft-float.
1493 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1494 Args.hasArg(options::OPT_fapple_kext));
1495 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1496 options::OPT_mno_soft_float,
Bob Wilsonf6f77bd2013-04-11 18:53:25 +00001497 options::OPT_mimplicit_float,
Bob Wilsonf0c54562013-02-10 16:01:41 +00001498 options::OPT_mno_implicit_float)) {
1499 const Option &O = A->getOption();
1500 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1501 O.matches(options::OPT_msoft_float));
1502 }
1503 if (NoImplicitFloat)
Daniel Dunbar66861e02009-11-20 22:21:36 +00001504 CmdArgs.push_back("-no-implicit-float");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001505
1506 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1507 StringRef Value = A->getValue();
1508 if (Value == "intel" || Value == "att") {
1509 CmdArgs.push_back("-mllvm");
1510 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1511 } else {
1512 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1513 << A->getOption().getName() << Value;
1514 }
1515 }
Daniel Dunbar6acda162009-09-09 22:33:08 +00001516}
1517
Matthew Curtis33c95f12012-12-06 17:49:03 +00001518static inline bool HasPICArg(const ArgList &Args) {
1519 return Args.hasArg(options::OPT_fPIC)
1520 || Args.hasArg(options::OPT_fpic);
1521}
1522
1523static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1524 return Args.getLastArg(options::OPT_G,
1525 options::OPT_G_EQ,
1526 options::OPT_msmall_data_threshold_EQ);
1527}
1528
1529static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1530 std::string value;
1531 if (HasPICArg(Args))
1532 value = "0";
1533 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1534 value = A->getValue();
1535 A->claim();
1536 }
1537 return value;
1538}
1539
Tony Linthicum96319392011-12-12 21:14:55 +00001540void Clang::AddHexagonTargetArgs(const ArgList &Args,
1541 ArgStringList &CmdArgs) const {
Tony Linthicum96319392011-12-12 21:14:55 +00001542 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis1dbaef52012-12-07 13:52:44 +00001543 CmdArgs.push_back("-mqdsp6-compat");
1544 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum96319392011-12-12 21:14:55 +00001545
Matthew Curtis33c95f12012-12-06 17:49:03 +00001546 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1547 if (!SmallDataThreshold.empty()) {
Tony Linthicum96319392011-12-12 21:14:55 +00001548 CmdArgs.push_back ("-mllvm");
Matthew Curtis33c95f12012-12-06 17:49:03 +00001549 CmdArgs.push_back(Args.MakeArgString(
1550 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00001551 }
1552
Sirish Pande5f9688b2012-05-10 20:19:54 +00001553 if (!Args.hasArg(options::OPT_fno_short_enums))
1554 CmdArgs.push_back("-fshort-enums");
1555 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1556 CmdArgs.push_back ("-mllvm");
1557 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1558 }
Tony Linthicum96319392011-12-12 21:14:55 +00001559 CmdArgs.push_back ("-mllvm");
1560 CmdArgs.push_back ("-machine-sink-split=0");
1561}
1562
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001563static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1564 std::vector<const char *> &Features) {
Tim Northoverb793f0d2013-08-01 09:23:19 +00001565 // Honor -mfpu=.
1566 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emersonfe7ed042013-10-01 10:20:54 +00001567 getAArch64FPUFeatures(D, A, Args, Features);
Stephen Hines651f13c2014-04-23 16:59:28 -07001568 else
1569 Features.push_back("+neon");
1570
1571 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1572 Features.push_back("-fp-armv8");
1573 Features.push_back("-crypto");
1574 Features.push_back("-neon");
1575 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001576
1577 // En/disable crc
1578 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1579 options::OPT_mnocrc)) {
1580 if (A->getOption().matches(options::OPT_mcrc))
1581 Features.push_back("+crc");
1582 else
1583 Features.push_back("-crc");
1584 }
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001585}
1586
1587static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Stephen Hines651f13c2014-04-23 16:59:28 -07001588 const ArgList &Args, ArgStringList &CmdArgs,
1589 bool ForAS) {
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001590 std::vector<const char *> Features;
1591 switch (Triple.getArch()) {
1592 default:
1593 break;
1594 case llvm::Triple::mips:
1595 case llvm::Triple::mipsel:
1596 case llvm::Triple::mips64:
1597 case llvm::Triple::mips64el:
1598 getMIPSTargetFeatures(D, Args, Features);
1599 break;
1600
1601 case llvm::Triple::arm:
Stephen Hines651f13c2014-04-23 16:59:28 -07001602 case llvm::Triple::armeb:
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001603 case llvm::Triple::thumb:
Stephen Hines651f13c2014-04-23 16:59:28 -07001604 case llvm::Triple::thumbeb:
1605 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001606 break;
1607
1608 case llvm::Triple::ppc:
1609 case llvm::Triple::ppc64:
1610 case llvm::Triple::ppc64le:
1611 getPPCTargetFeatures(Args, Features);
1612 break;
1613 case llvm::Triple::sparc:
1614 getSparcTargetFeatures(Args, Features);
1615 break;
1616 case llvm::Triple::aarch64:
Stephen Hines651f13c2014-04-23 16:59:28 -07001617 case llvm::Triple::aarch64_be:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001618 case llvm::Triple::arm64:
1619 case llvm::Triple::arm64_be:
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001620 getAArch64TargetFeatures(D, Args, Features);
1621 break;
1622 case llvm::Triple::x86:
1623 case llvm::Triple::x86_64:
Jim Grosbach32ca73e2013-11-16 00:53:35 +00001624 getX86TargetFeatures(Triple, Args, Features);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001625 break;
1626 }
Rafael Espindolabc1e5452013-08-21 17:34:32 +00001627
1628 // Find the last of each feature.
1629 llvm::StringMap<unsigned> LastOpt;
1630 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1631 const char *Name = Features[I];
1632 assert(Name[0] == '-' || Name[0] == '+');
1633 LastOpt[Name + 1] = I;
1634 }
1635
1636 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1637 // If this feature was overridden, ignore it.
1638 const char *Name = Features[I];
1639 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1640 assert(LastI != LastOpt.end());
1641 unsigned Last = LastI->second;
1642 if (Last != I)
1643 continue;
1644
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001645 CmdArgs.push_back("-target-feature");
Rafael Espindolabc1e5452013-08-21 17:34:32 +00001646 CmdArgs.push_back(Name);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001647 }
Tim Northoverb793f0d2013-08-01 09:23:19 +00001648}
1649
Eric Christopher88b7cf02011-08-19 00:30:14 +00001650static bool
John McCall260611a2012-06-20 06:18:46 +00001651shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson525544d2011-02-28 00:44:51 +00001652 const llvm::Triple &Triple) {
1653 // We use the zero-cost exception tables for Objective-C if the non-fragile
1654 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1655 // later.
John McCall260611a2012-06-20 06:18:46 +00001656 if (runtime.isNonFragile())
Anders Carlsson525544d2011-02-28 00:44:51 +00001657 return true;
1658
Stephen Hines651f13c2014-04-23 16:59:28 -07001659 if (!Triple.isMacOSX())
Anders Carlsson525544d2011-02-28 00:44:51 +00001660 return false;
1661
Eric Christopheraa7333c2011-07-02 00:20:22 +00001662 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson525544d2011-02-28 00:44:51 +00001663 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher88b7cf02011-08-19 00:30:14 +00001664 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson525544d2011-02-28 00:44:51 +00001665}
1666
Stephen Hines651f13c2014-04-23 16:59:28 -07001667namespace {
1668 struct ExceptionSettings {
1669 bool ExceptionsEnabled;
1670 bool ShouldUseExceptionTables;
1671 ExceptionSettings() : ExceptionsEnabled(false),
1672 ShouldUseExceptionTables(false) {}
1673 };
1674} // end anonymous namespace.
1675
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001676// exceptionSettings() exists to share the logic between -cc1 and linker
1677// invocations.
Stephen Hines651f13c2014-04-23 16:59:28 -07001678static ExceptionSettings exceptionSettings(const ArgList &Args,
1679 const llvm::Triple &Triple) {
1680 ExceptionSettings ES;
1681
1682 // Are exceptions enabled by default?
1683 ES.ExceptionsEnabled = (Triple.getArch() != llvm::Triple::xcore);
1684
1685 // This keeps track of whether exceptions were explicitly turned on or off.
1686 bool DidHaveExplicitExceptionFlag = false;
1687
1688 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1689 options::OPT_fno_exceptions)) {
1690 if (A->getOption().matches(options::OPT_fexceptions))
1691 ES.ExceptionsEnabled = true;
1692 else
1693 ES.ExceptionsEnabled = false;
1694
1695 DidHaveExplicitExceptionFlag = true;
1696 }
1697
1698 // Exception tables and cleanups can be enabled with -fexceptions even if the
1699 // language itself doesn't support exceptions.
1700 if (ES.ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1701 ES.ShouldUseExceptionTables = true;
1702
1703 return ES;
1704}
1705
Anders Carlsson15348ae2011-02-28 02:27:16 +00001706/// addExceptionArgs - Adds exception related arguments to the driver command
1707/// arguments. There's a master flag, -fexceptions and also language specific
1708/// flags to enable/disable C++ and Objective-C exceptions.
1709/// This makes it possible to for example disable C++ exceptions but enable
1710/// Objective-C exceptions.
1711static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1712 const llvm::Triple &Triple,
Fariborz Jahanian15b77312012-04-04 18:28:00 +00001713 bool KernelOrKext,
John McCall260611a2012-06-20 06:18:46 +00001714 const ObjCRuntime &objcRuntime,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001715 ArgStringList &CmdArgs) {
Chad Rosierafc4baa2012-03-26 22:04:46 +00001716 if (KernelOrKext) {
1717 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1718 // arguments now to avoid warnings about unused arguments.
1719 Args.ClaimAllArgs(options::OPT_fexceptions);
1720 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1721 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1722 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1723 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1724 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001725 return;
Chad Rosierafc4baa2012-03-26 22:04:46 +00001726 }
Anders Carlsson15348ae2011-02-28 02:27:16 +00001727
Stephen Hines651f13c2014-04-23 16:59:28 -07001728 // Gather the exception settings from the command line arguments.
1729 ExceptionSettings ES = exceptionSettings(Args, Triple);
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001730
Daniel Dunbard47ea692011-03-17 23:28:31 +00001731 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1732 // is not necessarily sensible, but follows GCC.
1733 if (types::isObjC(InputType) &&
Eric Christopher88b7cf02011-08-19 00:30:14 +00001734 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbard47ea692011-03-17 23:28:31 +00001735 options::OPT_fno_objc_exceptions,
1736 true)) {
1737 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlsson15348ae2011-02-28 02:27:16 +00001738
Stephen Hines651f13c2014-04-23 16:59:28 -07001739 ES.ShouldUseExceptionTables |=
John McCall260611a2012-06-20 06:18:46 +00001740 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001741 }
1742
1743 if (types::isCXX(InputType)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07001744 bool CXXExceptionsEnabled = ES.ExceptionsEnabled;
Anders Carlsson15348ae2011-02-28 02:27:16 +00001745
Eric Christopher88b7cf02011-08-19 00:30:14 +00001746 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1747 options::OPT_fno_cxx_exceptions,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001748 options::OPT_fexceptions,
1749 options::OPT_fno_exceptions)) {
1750 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1751 CXXExceptionsEnabled = true;
Chandler Carruth43f220f2011-02-28 07:25:18 +00001752 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001753 CXXExceptionsEnabled = false;
1754 }
1755
1756 if (CXXExceptionsEnabled) {
1757 CmdArgs.push_back("-fcxx-exceptions");
1758
Stephen Hines651f13c2014-04-23 16:59:28 -07001759 ES.ShouldUseExceptionTables = true;
Anders Carlsson15348ae2011-02-28 02:27:16 +00001760 }
1761 }
1762
Stephen Hines651f13c2014-04-23 16:59:28 -07001763 if (ES.ShouldUseExceptionTables)
Anders Carlsson15348ae2011-02-28 02:27:16 +00001764 CmdArgs.push_back("-fexceptions");
Rafael Espindolaf759df02009-10-01 13:33:33 +00001765}
1766
Daniel Dunbarf4910132013-04-16 18:21:19 +00001767static bool ShouldDisableAutolink(const ArgList &Args,
1768 const ToolChain &TC) {
1769 bool Default = true;
1770 if (TC.getTriple().isOSDarwin()) {
1771 // The native darwin assembler doesn't support the linker_option directives,
1772 // so we disable them if we think the .s file will be passed to it.
1773 Default = TC.useIntegratedAs();
1774 }
1775 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1776 Default);
1777}
1778
Ted Kremenekc06fcdf2013-03-12 17:02:12 +00001779static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1780 const ToolChain &TC) {
Nick Lewyckyea523d72011-10-17 23:05:52 +00001781 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1782 options::OPT_fno_dwarf_directory_asm,
Rafael Espindolaaf370e62013-03-18 18:10:27 +00001783 TC.useIntegratedAs());
Nick Lewyckyea523d72011-10-17 23:05:52 +00001784 return !UseDwarfDirectory;
1785}
1786
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001787/// \brief Check whether the given input tree contains any compilation actions.
1788static bool ContainsCompileAction(const Action *A) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001789 if (isa<CompileJobAction>(A))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001790 return true;
1791
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001792 for (const auto &Act : *A)
1793 if (ContainsCompileAction(Act))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001794 return true;
1795
1796 return false;
1797}
1798
1799/// \brief Check if -relax-all should be passed to the internal assembler.
1800/// This is done by default when compiling non-assembler source with -O0.
1801static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1802 bool RelaxDefault = true;
1803
1804 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1805 RelaxDefault = A->getOption().matches(options::OPT_O0);
1806
1807 if (RelaxDefault) {
1808 RelaxDefault = false;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001809 for (const auto &Act : C.getActions()) {
1810 if (ContainsCompileAction(Act)) {
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001811 RelaxDefault = true;
1812 break;
1813 }
1814 }
1815 }
1816
1817 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1818 RelaxDefault);
1819}
1820
David Blaikie73168db2013-07-25 21:19:01 +00001821static void CollectArgsForIntegratedAssembler(Compilation &C,
1822 const ArgList &Args,
1823 ArgStringList &CmdArgs,
1824 const Driver &D) {
1825 if (UseRelaxAll(C, Args))
1826 CmdArgs.push_back("-mrelax-all");
1827
David Peixotto4ca9eae2013-11-14 22:52:58 +00001828 // When passing -I arguments to the assembler we sometimes need to
David Peixotto2317f7b2013-11-14 22:58:17 +00001829 // unconditionally take the next argument. For example, when parsing
David Peixotto4ca9eae2013-11-14 22:52:58 +00001830 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
1831 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
1832 // arg after parsing the '-I' arg.
1833 bool TakeNextArg = false;
1834
David Blaikie73168db2013-07-25 21:19:01 +00001835 // When using an integrated assembler, translate -Wa, and -Xassembler
1836 // options.
Stephen Hines651f13c2014-04-23 16:59:28 -07001837 bool CompressDebugSections = false;
David Blaikie73168db2013-07-25 21:19:01 +00001838 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1839 options::OPT_Xassembler),
1840 ie = Args.filtered_end(); it != ie; ++it) {
1841 const Arg *A = *it;
1842 A->claim();
1843
1844 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1845 StringRef Value = A->getValue(i);
David Peixotto4ca9eae2013-11-14 22:52:58 +00001846 if (TakeNextArg) {
1847 CmdArgs.push_back(Value.data());
1848 TakeNextArg = false;
1849 continue;
1850 }
David Blaikie73168db2013-07-25 21:19:01 +00001851
1852 if (Value == "-force_cpusubtype_ALL") {
1853 // Do nothing, this is the default and we don't support anything else.
1854 } else if (Value == "-L") {
1855 CmdArgs.push_back("-msave-temp-labels");
1856 } else if (Value == "--fatal-warnings") {
1857 CmdArgs.push_back("-mllvm");
1858 CmdArgs.push_back("-fatal-assembler-warnings");
1859 } else if (Value == "--noexecstack") {
1860 CmdArgs.push_back("-mnoexecstack");
Stephen Hines651f13c2014-04-23 16:59:28 -07001861 } else if (Value == "-compress-debug-sections" ||
1862 Value == "--compress-debug-sections") {
1863 CompressDebugSections = true;
1864 } else if (Value == "-nocompress-debug-sections" ||
1865 Value == "--nocompress-debug-sections") {
1866 CompressDebugSections = false;
David Peixotto4ca9eae2013-11-14 22:52:58 +00001867 } else if (Value.startswith("-I")) {
1868 CmdArgs.push_back(Value.data());
1869 // We need to consume the next argument if the current arg is a plain
1870 // -I. The next arg will be the include directory.
1871 if (Value == "-I")
1872 TakeNextArg = true;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001873 } else if (Value.startswith("-gdwarf-")) {
1874 CmdArgs.push_back(Value.data());
David Blaikie73168db2013-07-25 21:19:01 +00001875 } else {
1876 D.Diag(diag::err_drv_unsupported_option_argument)
1877 << A->getOption().getName() << Value;
1878 }
1879 }
1880 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001881 if (CompressDebugSections) {
1882 if (llvm::zlib::isAvailable())
1883 CmdArgs.push_back("-compress-debug-sections");
1884 else
1885 D.Diag(diag::warn_debug_compression_unavailable);
1886 }
David Blaikie73168db2013-07-25 21:19:01 +00001887}
1888
Stephen Hines651f13c2014-04-23 16:59:28 -07001889// Until ARM libraries are build separately, we have them all in one library
1890static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
1891 if (TC.getArch() == llvm::Triple::arm ||
1892 TC.getArch() == llvm::Triple::armeb)
1893 return "arm";
1894 else
1895 return TC.getArchName();
1896}
1897
1898static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
1899 // The runtimes are located in the OS-specific resource directory.
1900 SmallString<128> Res(TC.getDriver().ResourceDir);
1901 const llvm::Triple &Triple = TC.getTriple();
1902 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
1903 StringRef OSLibName = (Triple.getOS() == llvm::Triple::FreeBSD) ?
1904 "freebsd" : TC.getOS();
1905 llvm::sys::path::append(Res, "lib", OSLibName);
1906 return Res;
1907}
1908
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001909// This adds the static libclang_rt.builtins-arch.a directly to the command line
Stephen Hines651f13c2014-04-23 16:59:28 -07001910// FIXME: Make sure we can also emit shared objects if they're requested
1911// and available, check for possible errors, etc.
1912static void addClangRTLinux(
1913 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1914 SmallString<128> LibClangRT = getCompilerRTLibDir(TC);
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001915 llvm::sys::path::append(LibClangRT, Twine("libclang_rt.builtins-") +
1916 getArchNameForCompilerRTLib(TC) +
1917 ".a");
Stephen Hines651f13c2014-04-23 16:59:28 -07001918
1919 CmdArgs.push_back(Args.MakeArgString(LibClangRT));
1920 CmdArgs.push_back("-lgcc_s");
1921 if (TC.getDriver().CCCIsCXX())
1922 CmdArgs.push_back("-lgcc_eh");
1923}
1924
1925static void addProfileRT(
Chandler Carruth9db37cd2013-06-23 11:28:48 +00001926 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1927 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1928 Args.hasArg(options::OPT_fprofile_generate) ||
Stephen Hines651f13c2014-04-23 16:59:28 -07001929 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth9db37cd2013-06-23 11:28:48 +00001930 Args.hasArg(options::OPT_fcreate_profile) ||
1931 Args.hasArg(options::OPT_coverage)))
1932 return;
1933
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001934 // -fprofile-instr-generate requires position-independent code to build with
1935 // shared objects. Link against the right archive.
1936 const char *Lib = "libclang_rt.profile-";
1937 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
1938 Args.hasArg(options::OPT_shared))
1939 Lib = "libclang_rt.profile-pic-";
1940
Stephen Hines651f13c2014-04-23 16:59:28 -07001941 SmallString<128> LibProfile = getCompilerRTLibDir(TC);
1942 llvm::sys::path::append(LibProfile,
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001943 Twine(Lib) + getArchNameForCompilerRTLib(TC) + ".a");
Chandler Carruth9db37cd2013-06-23 11:28:48 +00001944
1945 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1946}
1947
Stephen Hines651f13c2014-04-23 16:59:28 -07001948static SmallString<128> getSanitizerRTLibName(const ToolChain &TC,
1949 const StringRef Sanitizer,
1950 bool Shared) {
1951 // Sanitizer runtime has name "libclang_rt.<Sanitizer>-<ArchName>.{a,so}"
1952 // (or "libclang_rt.<Sanitizer>-<ArchName>-android.so for Android)
1953 const char *EnvSuffix =
1954 TC.getTriple().getEnvironment() == llvm::Triple::Android ? "-android" : "";
1955 SmallString<128> LibSanitizer = getCompilerRTLibDir(TC);
1956 llvm::sys::path::append(LibSanitizer,
1957 Twine("libclang_rt.") + Sanitizer + "-" +
1958 getArchNameForCompilerRTLib(TC) + EnvSuffix +
1959 (Shared ? ".so" : ".a"));
1960 return LibSanitizer;
1961}
1962
1963static void addSanitizerRTLinkFlags(const ToolChain &TC, const ArgList &Args,
1964 ArgStringList &CmdArgs,
1965 const StringRef Sanitizer,
1966 bool BeforeLibStdCXX,
1967 bool ExportSymbols = true,
1968 bool LinkDeps = true) {
1969 SmallString<128> LibSanitizer =
1970 getSanitizerRTLibName(TC, Sanitizer, /*Shared*/ false);
Richard Smith61a574f2013-03-20 23:49:07 +00001971
Alexey Samsonov86143042013-02-27 11:14:55 +00001972 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1973 // etc.) so that the linker picks custom versions of the global 'operator
1974 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournebf548552013-10-20 21:29:13 +00001975 // strategy of inserting it at the front of the link command. It also
1976 // needs to be forced to end up in the executable, so wrap it in
1977 // whole-archive.
Richard Smith61a574f2013-03-20 23:49:07 +00001978 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournebf548552013-10-20 21:29:13 +00001979 LibSanitizerArgs.push_back("-whole-archive");
Richard Smith61a574f2013-03-20 23:49:07 +00001980 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournebf548552013-10-20 21:29:13 +00001981 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smith61a574f2013-03-20 23:49:07 +00001982
1983 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1984 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1985
Stephen Hines651f13c2014-04-23 16:59:28 -07001986 if (LinkDeps) {
1987 // Link sanitizer dependencies explicitly
1988 CmdArgs.push_back("-lpthread");
1989 CmdArgs.push_back("-lrt");
1990 CmdArgs.push_back("-lm");
1991 // There's no libdl on FreeBSD.
1992 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
1993 CmdArgs.push_back("-ldl");
1994 }
Richard Smith76e6e132013-03-23 00:30:08 +00001995
1996 // If possible, use a dynamic symbols file to export the symbols from the
1997 // runtime library. If we can't do so, use -export-dynamic instead to export
1998 // all symbols from the binary.
1999 if (ExportSymbols) {
2000 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
2001 CmdArgs.push_back(
2002 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
2003 else
2004 CmdArgs.push_back("-export-dynamic");
2005 }
Alexey Samsonov86143042013-02-27 11:14:55 +00002006}
2007
Kostya Serebryanydff466c2011-11-30 01:39:16 +00002008/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
2009/// This needs to be called before we add the C run-time (malloc, etc).
Stephen Hines651f13c2014-04-23 16:59:28 -07002010static void addAsanRT(const ToolChain &TC, const ArgList &Args,
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002011 ArgStringList &CmdArgs, bool Shared, bool IsCXX) {
Stephen Hines651f13c2014-04-23 16:59:28 -07002012 if (Shared) {
2013 // Link dynamic runtime if necessary.
2014 SmallString<128> LibSanitizer =
2015 getSanitizerRTLibName(TC, "asan", Shared);
2016 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibSanitizer));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00002017 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002018
2019 // Do not link static runtime to DSOs or if compiling for Android.
2020 if (Args.hasArg(options::OPT_shared) ||
2021 (TC.getTriple().getEnvironment() == llvm::Triple::Android))
2022 return;
2023
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002024 if (Shared) {
2025 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan-preinit",
2026 /*BeforeLibStdCXX*/ true, /*ExportSymbols*/ false,
2027 /*LinkDeps*/ false);
2028 } else {
2029 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan", true);
2030 if (IsCXX)
2031 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan_cxx", true);
2032 }
Kostya Serebryanydff466c2011-11-30 01:39:16 +00002033}
2034
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00002035/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
2036/// This needs to be called before we add the C run-time (malloc, etc).
Stephen Hines651f13c2014-04-23 16:59:28 -07002037static void addTsanRT(const ToolChain &TC, const ArgList &Args,
2038 ArgStringList &CmdArgs) {
Sergey Matveev050309f2013-05-27 11:17:01 +00002039 if (!Args.hasArg(options::OPT_shared))
Stephen Hines651f13c2014-04-23 16:59:28 -07002040 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00002041}
2042
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00002043/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
2044/// This needs to be called before we add the C run-time (malloc, etc).
Stephen Hines651f13c2014-04-23 16:59:28 -07002045static void addMsanRT(const ToolChain &TC, const ArgList &Args,
2046 ArgStringList &CmdArgs) {
Sergey Matveev050309f2013-05-27 11:17:01 +00002047 if (!Args.hasArg(options::OPT_shared))
Stephen Hines651f13c2014-04-23 16:59:28 -07002048 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "msan", true);
Sergey Matveev050309f2013-05-27 11:17:01 +00002049}
2050
2051/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
2052/// This needs to be called before we add the C run-time (malloc, etc).
Stephen Hines651f13c2014-04-23 16:59:28 -07002053static void addLsanRT(const ToolChain &TC, const ArgList &Args,
2054 ArgStringList &CmdArgs) {
Sergey Matveev050309f2013-05-27 11:17:01 +00002055 if (!Args.hasArg(options::OPT_shared))
Stephen Hines651f13c2014-04-23 16:59:28 -07002056 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00002057}
2058
Richard Smith4def70d2012-10-09 19:52:38 +00002059/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
2060/// (Linux).
Stephen Hines651f13c2014-04-23 16:59:28 -07002061static void addUbsanRT(const ToolChain &TC, const ArgList &Args,
2062 ArgStringList &CmdArgs, bool IsCXX,
2063 bool HasOtherSanitizerRt) {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07002064 // Do not link runtime into shared libraries.
2065 if (Args.hasArg(options::OPT_shared))
2066 return;
2067
Nick Lewycky63d29e22013-10-19 00:27:23 +00002068 // Need a copy of sanitizer_common. This could come from another sanitizer
2069 // runtime; if we're not including one, include our own copy.
2070 if (!HasOtherSanitizerRt)
Stephen Hines651f13c2014-04-23 16:59:28 -07002071 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "san", true, false);
Peter Collingbournebf548552013-10-20 21:29:13 +00002072
Stephen Hinesc568f1e2014-07-21 00:47:37 -07002073 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan", false, true);
Peter Collingbournebf548552013-10-20 21:29:13 +00002074
2075 // Only include the bits of the runtime which need a C++ ABI library if
2076 // we're linking in C++ mode.
2077 if (IsCXX)
Stephen Hinesc568f1e2014-07-21 00:47:37 -07002078 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan_cxx", false, true);
Richard Smith4def70d2012-10-09 19:52:38 +00002079}
2080
Stephen Hines651f13c2014-04-23 16:59:28 -07002081static void addDfsanRT(const ToolChain &TC, const ArgList &Args,
2082 ArgStringList &CmdArgs) {
Peter Collingbourne2eeed712013-08-07 22:47:34 +00002083 if (!Args.hasArg(options::OPT_shared))
Stephen Hines651f13c2014-04-23 16:59:28 -07002084 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "dfsan", true);
2085}
2086
2087// Should be called before we add C++ ABI library.
2088static void addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2089 ArgStringList &CmdArgs) {
2090 const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
2091 const Driver &D = TC.getDriver();
2092 if (Sanitize.needsUbsanRt())
2093 addUbsanRT(TC, Args, CmdArgs, D.CCCIsCXX(),
2094 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
2095 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
2096 if (Sanitize.needsAsanRt())
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002097 addAsanRT(TC, Args, CmdArgs, Sanitize.needsSharedAsanRt(), D.CCCIsCXX());
Stephen Hines651f13c2014-04-23 16:59:28 -07002098 if (Sanitize.needsTsanRt())
2099 addTsanRT(TC, Args, CmdArgs);
2100 if (Sanitize.needsMsanRt())
2101 addMsanRT(TC, Args, CmdArgs);
2102 if (Sanitize.needsLsanRt())
2103 addLsanRT(TC, Args, CmdArgs);
2104 if (Sanitize.needsDfsanRt())
2105 addDfsanRT(TC, Args, CmdArgs);
Peter Collingbourne2eeed712013-08-07 22:47:34 +00002106}
2107
Benjamin Kramer5322a552013-10-16 17:42:39 +00002108static bool shouldUseFramePointerForTarget(const ArgList &Args,
2109 const llvm::Triple &Triple) {
2110 switch (Triple.getArch()) {
2111 // Don't use a frame pointer on linux if optimizing for certain targets.
2112 case llvm::Triple::mips64:
2113 case llvm::Triple::mips64el:
2114 case llvm::Triple::mips:
2115 case llvm::Triple::mipsel:
2116 case llvm::Triple::systemz:
2117 case llvm::Triple::x86:
2118 case llvm::Triple::x86_64:
2119 if (Triple.isOSLinux())
2120 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2121 if (!A->getOption().matches(options::OPT_O0))
2122 return false;
2123 return true;
2124 case llvm::Triple::xcore:
2125 return false;
2126 default:
2127 return true;
2128 }
2129}
2130
Rafael Espindola6af27ec2011-12-14 21:02:23 +00002131static bool shouldUseFramePointer(const ArgList &Args,
2132 const llvm::Triple &Triple) {
2133 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2134 options::OPT_fomit_frame_pointer))
2135 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2136
Benjamin Kramer5322a552013-10-16 17:42:39 +00002137 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola6af27ec2011-12-14 21:02:23 +00002138}
2139
Eric Christopherd3e22df2013-04-03 01:58:53 +00002140static bool shouldUseLeafFramePointer(const ArgList &Args,
2141 const llvm::Triple &Triple) {
2142 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2143 options::OPT_momit_leaf_frame_pointer))
2144 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2145
Benjamin Kramer5322a552013-10-16 17:42:39 +00002146 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherd3e22df2013-04-03 01:58:53 +00002147}
2148
Rafael Espindolaa2148242013-08-10 01:40:10 +00002149/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruthd566df62012-12-17 21:40:04 +00002150static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer6089adc2013-04-27 08:12:29 +00002151 SmallString<128> cwd;
2152 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosierb1c81222013-04-26 20:49:50 +00002153 CmdArgs.push_back("-fdebug-compilation-dir");
2154 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruthd566df62012-12-17 21:40:04 +00002155 }
2156}
2157
Eric Christopher80190392013-02-22 20:12:52 +00002158static const char *SplitDebugName(const ArgList &Args,
2159 const InputInfoList &Inputs) {
2160 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2161 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2162 SmallString<128> T(FinalOutput->getValue());
2163 llvm::sys::path::replace_extension(T, "dwo");
2164 return Args.MakeArgString(T);
2165 } else {
2166 // Use the compilation dir.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002167 SmallString<128> T(
2168 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Eric Christopher80190392013-02-22 20:12:52 +00002169 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2170 llvm::sys::path::replace_extension(F, "dwo");
2171 T += F;
2172 return Args.MakeArgString(F);
2173 }
2174}
2175
2176static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2177 const Tool &T, const JobAction &JA,
2178 const ArgList &Args, const InputInfo &Output,
2179 const char *OutFile) {
Eric Christopher59320e72013-02-21 22:35:01 +00002180 ArgStringList ExtractArgs;
2181 ExtractArgs.push_back("--extract-dwo");
2182
2183 ArgStringList StripArgs;
2184 StripArgs.push_back("--strip-dwo");
2185
2186 // Grabbing the output of the earlier compile step.
2187 StripArgs.push_back(Output.getFilename());
2188 ExtractArgs.push_back(Output.getFilename());
Eric Christopher59320e72013-02-21 22:35:01 +00002189 ExtractArgs.push_back(OutFile);
2190
2191 const char *Exec =
Eric Christopher80190392013-02-22 20:12:52 +00002192 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher59320e72013-02-21 22:35:01 +00002193
2194 // First extract the dwo sections.
Eric Christopher80190392013-02-22 20:12:52 +00002195 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00002196
2197 // Then remove them from the original .o file.
Eric Christopher80190392013-02-22 20:12:52 +00002198 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00002199}
2200
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00002201/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002202/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2203static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00002204 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindola55ee1eb2013-08-27 16:58:15 +00002205 if (A->getOption().matches(options::OPT_O4) ||
2206 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00002207 return true;
2208
2209 if (A->getOption().matches(options::OPT_O0))
2210 return false;
2211
2212 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2213
Rafael Espindola168de192013-08-26 14:05:41 +00002214 // Vectorize -Os.
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00002215 StringRef S(A->getValue());
Rafael Espindola168de192013-08-26 14:05:41 +00002216 if (S == "s")
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00002217 return true;
2218
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002219 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00002220 if (S == "z")
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002221 return isSlpVec;
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00002222
2223 unsigned OptLevel = 0;
2224 if (S.getAsInteger(10, OptLevel))
2225 return false;
2226
2227 return OptLevel > 1;
2228 }
2229
2230 return false;
2231}
2232
Stephen Hines651f13c2014-04-23 16:59:28 -07002233/// Add -x lang to \p CmdArgs for \p Input.
2234static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2235 ArgStringList &CmdArgs) {
2236 // When using -verify-pch, we don't want to provide the type
2237 // 'precompiled-header' if it was inferred from the file extension
2238 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2239 return;
2240
2241 CmdArgs.push_back("-x");
2242 if (Args.hasArg(options::OPT_rewrite_objc))
2243 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2244 else
2245 CmdArgs.push_back(types::getTypeName(Input.getType()));
2246}
2247
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00002248void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar871adcf2009-03-18 07:06:02 +00002249 const InputInfo &Output,
Daniel Dunbar62cf6012009-03-18 06:07:59 +00002250 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00002251 const ArgList &Args,
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00002252 const char *LinkingOutput) const {
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002253 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2254 options::OPT_fapple_kext);
Daniel Dunbaree788e72009-12-21 18:54:17 +00002255 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002256 ArgStringList CmdArgs;
2257
Stephen Hines651f13c2014-04-23 16:59:28 -07002258 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002259 bool IsWindowsCygnus =
2260 getToolChain().getTriple().isWindowsCygwinEnvironment();
Stephen Hines651f13c2014-04-23 16:59:28 -07002261 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2262
Daniel Dunbar077ba6a2009-03-31 20:53:55 +00002263 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2264
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00002265 // Invoke ourselves in -cc1 mode.
2266 //
2267 // FIXME: Implement custom jobs for internal actions.
2268 CmdArgs.push_back("-cc1");
2269
Daniel Dunbardd4fe002009-10-30 18:12:20 +00002270 // Add the "effective" target triple.
Daniel Dunbaraf07f932009-03-31 17:35:15 +00002271 CmdArgs.push_back("-triple");
Daniel Dunbar00577ad2010-08-23 22:35:37 +00002272 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbardd4fe002009-10-30 18:12:20 +00002273 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbar728a5122009-09-10 06:49:20 +00002274
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002275 const llvm::Triple TT(TripleStr);
2276 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2277 TT.getArch() == llvm::Triple::thumb)) {
2278 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2279 unsigned Version;
2280 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2281 if (Version < 7)
2282 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2283 << TripleStr;
2284 }
2285
Stephen Hines651f13c2014-04-23 16:59:28 -07002286 // Push all default warning arguments that are specific to
2287 // the given target. These come before user provided warning options
2288 // are provided.
2289 getToolChain().addClangWarningOptions(CmdArgs);
2290
Daniel Dunbardd4fe002009-10-30 18:12:20 +00002291 // Select the appropriate action.
John McCall260611a2012-06-20 06:18:46 +00002292 RewriteKind rewriteKind = RK_None;
Fariborz Jahaniane982cc02012-04-04 18:50:28 +00002293
Daniel Dunbar1d460332009-03-18 10:01:51 +00002294 if (isa<AnalyzeJobAction>(JA)) {
2295 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2296 CmdArgs.push_back("-analyze");
Ted Kremenek30660a82012-03-06 20:06:33 +00002297 } else if (isa<MigrateJobAction>(JA)) {
2298 CmdArgs.push_back("-migrate");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002299 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00002300 if (Output.getType() == types::TY_Dependencies)
2301 CmdArgs.push_back("-Eonly");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00002302 else {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00002303 CmdArgs.push_back("-E");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00002304 if (Args.hasArg(options::OPT_rewrite_objc) &&
2305 !Args.hasArg(options::OPT_g_Group))
2306 CmdArgs.push_back("-P");
2307 }
Daniel Dunbar8767cbc2010-02-03 03:07:56 +00002308 } else if (isa<AssembleJobAction>(JA)) {
2309 CmdArgs.push_back("-emit-obj");
Daniel Dunbar99298002010-05-27 06:18:05 +00002310
David Blaikie73168db2013-07-25 21:19:01 +00002311 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbard02bba82010-11-19 16:23:35 +00002312
2313 // Also ignore explicit -force_cpusubtype_ALL option.
2314 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002315 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +00002316 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00002317 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00002318
Aaron Ballman761322b2012-07-31 01:21:00 +00002319 if (JA.getType() == types::TY_Nothing)
2320 CmdArgs.push_back("-fsyntax-only");
2321 else if (UsePCH)
Douglas Gregordf91ef32009-04-18 00:34:01 +00002322 CmdArgs.push_back("-emit-pch");
2323 else
2324 CmdArgs.push_back("-emit-pth");
Stephen Hines651f13c2014-04-23 16:59:28 -07002325 } else if (isa<VerifyPCHJobAction>(JA)) {
2326 CmdArgs.push_back("-verify-pch");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002327 } else {
2328 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002329
Daniel Dunbar1d460332009-03-18 10:01:51 +00002330 if (JA.getType() == types::TY_Nothing) {
2331 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00002332 } else if (JA.getType() == types::TY_LLVM_IR ||
2333 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002334 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00002335 } else if (JA.getType() == types::TY_LLVM_BC ||
2336 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002337 CmdArgs.push_back("-emit-llvm-bc");
2338 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbare3b8d072009-09-17 00:47:53 +00002339 CmdArgs.push_back("-S");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00002340 } else if (JA.getType() == types::TY_AST) {
2341 CmdArgs.push_back("-emit-pch");
Douglas Gregorc544ba02013-03-27 16:47:18 +00002342 } else if (JA.getType() == types::TY_ModuleFile) {
2343 CmdArgs.push_back("-module-file-info");
Daniel Dunbar64952502010-02-11 03:16:21 +00002344 } else if (JA.getType() == types::TY_RewrittenObjC) {
2345 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00002346 rewriteKind = RK_NonFragile;
Fariborz Jahanian582b3952012-04-02 15:59:19 +00002347 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2348 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00002349 rewriteKind = RK_Fragile;
Daniel Dunbar64952502010-02-11 03:16:21 +00002350 } else {
2351 assert(JA.getType() == types::TY_PP_Asm &&
2352 "Unexpected output type!");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002353 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002354 }
2355
Stephen Hinesc568f1e2014-07-21 00:47:37 -07002356 // We normally speed up the clang process a bit by skipping destructors at
2357 // exit, but when we're generating diagnostics we can rely on some of the
2358 // cleanup.
2359 if (!C.isForDiagnostics())
2360 CmdArgs.push_back("-disable-free");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002361
John McCallb689afb2010-02-13 03:50:24 +00002362 // Disable the verification pass in -asserts builds.
2363#ifdef NDEBUG
2364 CmdArgs.push_back("-disable-llvm-verifier");
2365#endif
2366
Daniel Dunbarc9abc042009-04-08 05:11:16 +00002367 // Set the main file name, so that debug info works even with
2368 // -save-temps.
2369 CmdArgs.push_back("-main-file-name");
Bob Wilson66b8a662012-11-23 06:14:39 +00002370 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbarc9abc042009-04-08 05:11:16 +00002371
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00002372 // Some flags which affect the language (via preprocessor
Bob Wilson66b8a662012-11-23 06:14:39 +00002373 // defines).
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00002374 if (Args.hasArg(options::OPT_static))
2375 CmdArgs.push_back("-static-define");
2376
Daniel Dunbar1d460332009-03-18 10:01:51 +00002377 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenekb8bb3e72009-09-25 05:55:59 +00002378 // Enable region store model by default.
2379 CmdArgs.push_back("-analyzer-store=region");
2380
Ted Kremenekb40d06d2009-12-07 22:26:14 +00002381 // Treat blocks as analysis entry points.
2382 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2383
Ted Kremenek51885072011-03-24 00:28:47 +00002384 CmdArgs.push_back("-analyzer-eagerly-assume");
2385
Daniel Dunbar1d460332009-03-18 10:01:51 +00002386 // Add default argument set.
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002387 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002388 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek51885072011-03-24 00:28:47 +00002389
Stephen Hines651f13c2014-04-23 16:59:28 -07002390 if (!IsWindowsMSVC)
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002391 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek51885072011-03-24 00:28:47 +00002392
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002393 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek51885072011-03-24 00:28:47 +00002394 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremeneka8180e52012-01-20 06:00:17 +00002395
2396 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek8dc05062012-01-26 02:27:38 +00002397
Jordan Rosee449edc2013-04-05 17:55:07 +00002398 if (types::isCXX(Inputs[0].getType()))
2399 CmdArgs.push_back("-analyzer-checker=cplusplus");
2400
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002401 // Enable the following experimental checkers for testing.
2402 CmdArgs.push_back(
2403 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek8dc05062012-01-26 02:27:38 +00002404 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2405 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2406 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2407 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2408 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002409 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002410
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002411 // Set the output format. The default is plist, for (lame) historical
2412 // reasons.
2413 CmdArgs.push_back("-analyzer-output");
2414 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smith1d489cf2012-11-01 04:30:05 +00002415 CmdArgs.push_back(A->getValue());
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002416 else
2417 CmdArgs.push_back("plist");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002418
Ted Kremenek0647a7b2010-03-22 22:32:05 +00002419 // Disable the presentation of standard compiler warnings when
2420 // using --analyze. We only want to show static analyzer diagnostics
2421 // or frontend errors.
2422 CmdArgs.push_back("-w");
2423
Daniel Dunbar1d460332009-03-18 10:01:51 +00002424 // Add -Xanalyzer arguments when running as analyzer.
2425 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump1eb44332009-09-09 15:08:12 +00002426 }
2427
Daniel Dunbare2fd6642009-09-10 01:21:12 +00002428 CheckCodeGenerationOptions(D, Args);
2429
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002430 bool PIE = getToolChain().isPIEDefault();
2431 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002432 bool IsPICLevelTwo = PIC;
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002433
Stephen Hines651f13c2014-04-23 16:59:28 -07002434 // Android-specific defaults for PIC/PIE
2435 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2436 switch (getToolChain().getTriple().getArch()) {
2437 case llvm::Triple::arm:
2438 case llvm::Triple::armeb:
2439 case llvm::Triple::thumb:
2440 case llvm::Triple::thumbeb:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002441 case llvm::Triple::aarch64:
2442 case llvm::Triple::arm64:
Stephen Hines651f13c2014-04-23 16:59:28 -07002443 case llvm::Triple::mips:
2444 case llvm::Triple::mipsel:
2445 case llvm::Triple::mips64:
2446 case llvm::Triple::mips64el:
2447 PIC = true; // "-fpic"
2448 break;
2449
2450 case llvm::Triple::x86:
2451 case llvm::Triple::x86_64:
2452 PIC = true; // "-fPIC"
2453 IsPICLevelTwo = true;
2454 break;
2455
2456 default:
2457 break;
2458 }
2459 }
2460
Stephen Hinesc568f1e2014-07-21 00:47:37 -07002461 // OpenBSD-specific defaults for PIE
2462 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2463 switch (getToolChain().getTriple().getArch()) {
2464 case llvm::Triple::mips64:
2465 case llvm::Triple::mips64el:
2466 case llvm::Triple::sparc:
2467 case llvm::Triple::x86:
2468 case llvm::Triple::x86_64:
2469 IsPICLevelTwo = false; // "-fpie"
2470 break;
2471
2472 case llvm::Triple::ppc:
2473 case llvm::Triple::sparcv9:
2474 IsPICLevelTwo = true; // "-fPIE"
2475 break;
2476
2477 default:
2478 break;
2479 }
2480 }
2481
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002482 // For the PIC and PIE flag options, this logic is different from the
2483 // legacy logic in very old versions of GCC, as that logic was just
2484 // a bug no one had ever fixed. This logic is both more rational and
2485 // consistent with GCC's new logic now that the bugs are fixed. The last
2486 // argument relating to either PIC or PIE wins, and no other argument is
2487 // used. If the last argument is any flavor of the '-fno-...' arguments,
2488 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2489 // at the same level.
2490 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2491 options::OPT_fpic, options::OPT_fno_pic,
2492 options::OPT_fPIE, options::OPT_fno_PIE,
2493 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002494 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2495 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002496 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002497 if (LastPICArg) {
2498 Option O = LastPICArg->getOption();
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002499 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2500 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2501 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2502 PIC = PIE || O.matches(options::OPT_fPIC) ||
2503 O.matches(options::OPT_fpic);
2504 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2505 O.matches(options::OPT_fPIC);
2506 } else {
2507 PIE = PIC = false;
2508 }
2509 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002510 }
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002511
Nick Lewyckyd4705682013-10-11 03:33:53 +00002512 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002513 // specified while enabling PIC enabled level 1 PIC, just force it back to
2514 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2515 // informal testing).
2516 if (PIC && getToolChain().getTriple().isOSDarwin())
2517 IsPICLevelTwo |= getToolChain().isPICDefault();
2518
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002519 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2520 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00002521 llvm::Triple Triple(TripleStr);
Stephen Hines651f13c2014-04-23 16:59:28 -07002522 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6) ||
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002523 Triple.getArch() == llvm::Triple::arm64 ||
2524 Triple.getArch() == llvm::Triple::aarch64))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002525 PIC = PIE = false;
Simon Atanasyanc0e83642013-10-04 11:46:54 +00002526 if (Args.hasArg(options::OPT_static))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002527 PIC = PIE = false;
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002528
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002529 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2530 // This is a very special mode. It trumps the other modes, almost no one
2531 // uses it, and it isn't even valid on any OS but Darwin.
2532 if (!getToolChain().getTriple().isOSDarwin())
2533 D.Diag(diag::err_drv_unsupported_opt_for_target)
2534 << A->getSpelling() << getToolChain().getTriple().str();
2535
2536 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2537
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002538 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002539 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002540
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002541 // Only a forced PIC mode can cause the actual compile to have PIC defines
2542 // etc., no flags are sufficient. This behavior was selected to closely
2543 // match that of llvm-gcc and Apple GCC before that.
2544 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2545 CmdArgs.push_back("-pic-level");
2546 CmdArgs.push_back("2");
2547 }
2548 } else {
2549 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2550 // handled in Clang's IRGen by the -pie-level flag.
2551 CmdArgs.push_back("-mrelocation-model");
2552 CmdArgs.push_back(PIC ? "pic" : "static");
2553
2554 if (PIC) {
2555 CmdArgs.push_back("-pic-level");
2556 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2557 if (PIE) {
2558 CmdArgs.push_back("-pie-level");
2559 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2560 }
2561 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002562 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002563
Tanya Lattner59876c22009-11-04 01:18:09 +00002564 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2565 options::OPT_fno_merge_all_constants))
Chris Lattnerf44a1a02011-04-08 18:06:54 +00002566 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002567
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002568 // LLVM Code Generator Options.
2569
Stephen Hinesc568f1e2014-07-21 00:47:37 -07002570 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2571 StringRef v = A->getValue();
2572 CmdArgs.push_back("-mllvm");
2573 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2574 A->claim();
2575 }
2576
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002577 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2578 CmdArgs.push_back("-mregparm");
Richard Smith1d489cf2012-11-01 04:30:05 +00002579 CmdArgs.push_back(A->getValue());
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002580 }
2581
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00002582 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2583 options::OPT_freg_struct_return)) {
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002584 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCallb8b52972013-06-18 02:46:29 +00002585 D.Diag(diag::err_drv_unsupported_opt_for_target)
2586 << A->getSpelling() << getToolChain().getTriple().str();
2587 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2588 CmdArgs.push_back("-fpcc-struct-return");
2589 } else {
2590 assert(A->getOption().matches(options::OPT_freg_struct_return));
2591 CmdArgs.push_back("-freg-struct-return");
2592 }
2593 }
2594
Roman Divackycfe9af22011-03-01 17:40:53 +00002595 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2596 CmdArgs.push_back("-mrtd");
2597
Rafael Espindola6af27ec2011-12-14 21:02:23 +00002598 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002599 CmdArgs.push_back("-mdisable-fp-elim");
2600 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2601 options::OPT_fno_zero_initialized_in_bss))
2602 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb82e1172013-04-24 18:09:54 +00002603
2604 bool OFastEnabled = isOptimizationLevelFast(Args);
2605 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2606 // enabled. This alias option is being used to simplify the hasFlag logic.
2607 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2608 options::OPT_fstrict_aliasing;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002609 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2610 // doesn't do any TBAA.
2611 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb82e1172013-04-24 18:09:54 +00002612 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002613 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman4d5625e2010-10-14 22:36:56 +00002614 CmdArgs.push_back("-relaxed-aliasing");
Manman Ren96d6c452013-10-11 20:48:38 +00002615 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2616 options::OPT_fno_struct_path_tbaa))
2617 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth82fe6ae2012-03-27 23:58:37 +00002618 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2619 false))
2620 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1db772b2012-01-23 08:29:12 +00002621 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2622 options::OPT_fno_optimize_sibling_calls))
2623 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002624
Eric Christopher31056272013-04-04 06:29:47 +00002625 // Handle segmented stacks.
2626 if (Args.hasArg(options::OPT_fsplit_stack))
2627 CmdArgs.push_back("-split-stacks");
Chad Rosierb82e1172013-04-24 18:09:54 +00002628
2629 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2630 // This alias option is being used to simplify the getLastArg logic.
2631 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2632 options::OPT_ffast_math;
Eric Christopher31056272013-04-04 06:29:47 +00002633
Chandler Carruthabf07a72012-01-02 14:19:45 +00002634 // Handle various floating point optimization flags, mapping them to the
2635 // appropriate LLVM code generation flags. The pattern for all of these is to
2636 // default off the codegen optimizations, and if any flag enables them and no
2637 // flag disables them after the flag enabling them, enable the codegen
2638 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb82e1172013-04-24 18:09:54 +00002639 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002640 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002641 options::OPT_ffinite_math_only,
2642 options::OPT_fno_finite_math_only,
2643 options::OPT_fhonor_infinities,
2644 options::OPT_fno_honor_infinities))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002645 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2646 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002647 A->getOption().getID() != options::OPT_fhonor_infinities)
2648 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb82e1172013-04-24 18:09:54 +00002649 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002650 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002651 options::OPT_ffinite_math_only,
2652 options::OPT_fno_finite_math_only,
2653 options::OPT_fhonor_nans,
2654 options::OPT_fno_honor_nans))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002655 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2656 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002657 A->getOption().getID() != options::OPT_fhonor_nans)
2658 CmdArgs.push_back("-menable-no-nans");
2659
Benjamin Kramer769aa2d2012-05-02 14:55:48 +00002660 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2661 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb82e1172013-04-24 18:09:54 +00002662 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002663 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002664 options::OPT_fmath_errno,
Chandler Carruthb69557e2013-05-18 20:47:36 +00002665 options::OPT_fno_math_errno)) {
2666 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2667 // However, turning *off* -ffast_math merely restores the toolchain default
2668 // (which may be false).
2669 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2670 A->getOption().getID() == options::OPT_ffast_math ||
2671 A->getOption().getID() == options::OPT_Ofast)
2672 MathErrno = false;
2673 else if (A->getOption().getID() == options::OPT_fmath_errno)
2674 MathErrno = true;
2675 }
Chandler Carruth4f50c502012-04-26 02:10:51 +00002676 if (MathErrno)
2677 CmdArgs.push_back("-fmath-errno");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002678
2679 // There are several flags which require disabling very specific
2680 // optimizations. Any of these being disabled forces us to turn off the
2681 // entire set of LLVM optimizations, so collect them through all the flag
2682 // madness.
2683 bool AssociativeMath = false;
Chad Rosierb82e1172013-04-24 18:09:54 +00002684 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002685 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002686 options::OPT_funsafe_math_optimizations,
2687 options::OPT_fno_unsafe_math_optimizations,
2688 options::OPT_fassociative_math,
2689 options::OPT_fno_associative_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002690 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2691 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002692 A->getOption().getID() != options::OPT_fno_associative_math)
2693 AssociativeMath = true;
2694 bool ReciprocalMath = false;
Chad Rosierb82e1172013-04-24 18:09:54 +00002695 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002696 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002697 options::OPT_funsafe_math_optimizations,
2698 options::OPT_fno_unsafe_math_optimizations,
2699 options::OPT_freciprocal_math,
2700 options::OPT_fno_reciprocal_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002701 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2702 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002703 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2704 ReciprocalMath = true;
2705 bool SignedZeros = true;
Chad Rosierb82e1172013-04-24 18:09:54 +00002706 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002707 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002708 options::OPT_funsafe_math_optimizations,
2709 options::OPT_fno_unsafe_math_optimizations,
2710 options::OPT_fsigned_zeros,
2711 options::OPT_fno_signed_zeros))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002712 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2713 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002714 A->getOption().getID() != options::OPT_fsigned_zeros)
2715 SignedZeros = false;
2716 bool TrappingMath = true;
Chad Rosierb82e1172013-04-24 18:09:54 +00002717 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002718 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002719 options::OPT_funsafe_math_optimizations,
2720 options::OPT_fno_unsafe_math_optimizations,
2721 options::OPT_ftrapping_math,
2722 options::OPT_fno_trapping_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002723 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2724 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002725 A->getOption().getID() != options::OPT_ftrapping_math)
2726 TrappingMath = false;
2727 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2728 !TrappingMath)
2729 CmdArgs.push_back("-menable-unsafe-fp-math");
2730
Lang Hamesc9686712012-07-06 00:59:19 +00002731
2732 // Validate and pass through -fp-contract option.
Chad Rosierb82e1172013-04-24 18:09:54 +00002733 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002734 options::OPT_fno_fast_math,
Lang Hamesc9686712012-07-06 00:59:19 +00002735 options::OPT_ffp_contract)) {
2736 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002737 StringRef Val = A->getValue();
Lang Hamesc9686712012-07-06 00:59:19 +00002738 if (Val == "fast" || Val == "on" || Val == "off") {
2739 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2740 } else {
2741 D.Diag(diag::err_drv_unsupported_option_argument)
2742 << A->getOption().getName() << Val;
2743 }
Chad Rosierb82e1172013-04-24 18:09:54 +00002744 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2745 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesc9686712012-07-06 00:59:19 +00002746 // If fast-math is set then set the fp-contract mode to fast.
2747 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2748 }
2749 }
2750
Bob Wilson455e72e2012-07-19 03:52:53 +00002751 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2752 // and if we find them, tell the frontend to provide the appropriate
2753 // preprocessor macros. This is distinct from enabling any optimizations as
2754 // these options induce language changes which must survive serialization
2755 // and deserialization, etc.
Chad Rosierb82e1172013-04-24 18:09:54 +00002756 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2757 options::OPT_fno_fast_math))
2758 if (!A->getOption().matches(options::OPT_fno_fast_math))
2759 CmdArgs.push_back("-ffast-math");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002760 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
2761 options::OPT_fno_fast_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002762 if (A->getOption().matches(options::OPT_ffinite_math_only))
2763 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002764
Daniel Dunbar1b718482010-05-14 22:00:22 +00002765 // Decide whether to use verbose asm. Verbose assembly is the default on
2766 // toolchains which have the integrated assembler on by default.
Stephen Hines651f13c2014-04-23 16:59:28 -07002767 bool IsIntegratedAssemblerDefault =
2768 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar1b718482010-05-14 22:00:22 +00002769 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Stephen Hines651f13c2014-04-23 16:59:28 -07002770 IsIntegratedAssemblerDefault) ||
Daniel Dunbar1b718482010-05-14 22:00:22 +00002771 Args.hasArg(options::OPT_dA))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002772 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002773
Stephen Hines651f13c2014-04-23 16:59:28 -07002774 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
2775 IsIntegratedAssemblerDefault))
2776 CmdArgs.push_back("-no-integrated-as");
2777
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002778 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2779 CmdArgs.push_back("-mdebug-pass");
2780 CmdArgs.push_back("Structure");
2781 }
2782 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2783 CmdArgs.push_back("-mdebug-pass");
2784 CmdArgs.push_back("Arguments");
2785 }
2786
John McCalld0c2ec42010-02-19 02:45:38 +00002787 // Enable -mconstructor-aliases except on darwin, where we have to
2788 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson905c45f2011-10-14 05:03:44 +00002789 if (!getToolChain().getTriple().isOSDarwin())
John McCalld0c2ec42010-02-19 02:45:38 +00002790 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00002791
John McCall32096692011-03-18 02:56:14 +00002792 // Darwin's kernel doesn't support guard variables; just die if we
2793 // try to use them.
Bob Wilson905c45f2011-10-14 05:03:44 +00002794 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall32096692011-03-18 02:56:14 +00002795 CmdArgs.push_back("-fforbid-guard-variables");
2796
Douglas Gregor6f755502011-02-01 15:15:22 +00002797 if (Args.hasArg(options::OPT_mms_bitfields)) {
2798 CmdArgs.push_back("-mms-bitfields");
2799 }
John McCalld0c2ec42010-02-19 02:45:38 +00002800
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002801 // This is a coarse approximation of what llvm-gcc actually does, both
2802 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2803 // complicated ways.
2804 bool AsynchronousUnwindTables =
Stephen Hines651f13c2014-04-23 16:59:28 -07002805 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2806 options::OPT_fno_asynchronous_unwind_tables,
2807 (getToolChain().IsUnwindTablesDefault() ||
2808 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
2809 !KernelOrKext);
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002810 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2811 AsynchronousUnwindTables))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002812 CmdArgs.push_back("-munwind-tables");
2813
Chandler Carrutha6b25812012-11-21 23:40:23 +00002814 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola8af669f2012-06-19 01:26:10 +00002815
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002816 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2817 CmdArgs.push_back("-mlimit-float-precision");
Richard Smith1d489cf2012-11-01 04:30:05 +00002818 CmdArgs.push_back(A->getValue());
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002819 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002820
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002821 // FIXME: Handle -mtune=.
2822 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002823
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002824 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002825 CmdArgs.push_back("-mcode-model");
Richard Smith1d489cf2012-11-01 04:30:05 +00002826 CmdArgs.push_back(A->getValue());
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002827 }
2828
Rafael Espindolab330e402013-08-20 22:12:08 +00002829 // Add the target cpu
2830 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2831 llvm::Triple ETriple(ETripleStr);
2832 std::string CPU = getCPUName(Args, ETriple);
2833 if (!CPU.empty()) {
2834 CmdArgs.push_back("-target-cpu");
2835 CmdArgs.push_back(Args.MakeArgString(CPU));
2836 }
2837
Rafael Espindola5389b842013-08-21 21:59:03 +00002838 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2839 CmdArgs.push_back("-mfpmath");
2840 CmdArgs.push_back(A->getValue());
2841 }
2842
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002843 // Add the target features
Stephen Hines651f13c2014-04-23 16:59:28 -07002844 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002845
Rafael Espindolab330e402013-08-20 22:12:08 +00002846 // Add target specific flags.
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002847 switch(getToolChain().getArch()) {
Daniel Dunbar6acda162009-09-09 22:33:08 +00002848 default:
2849 break;
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002850
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002851 case llvm::Triple::arm:
Stephen Hines651f13c2014-04-23 16:59:28 -07002852 case llvm::Triple::armeb:
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002853 case llvm::Triple::thumb:
Stephen Hines651f13c2014-04-23 16:59:28 -07002854 case llvm::Triple::thumbeb:
Daniel Dunbarfa41d692011-03-17 17:10:06 +00002855 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002856 break;
2857
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002858 case llvm::Triple::aarch64:
2859 case llvm::Triple::aarch64_be:
Stephen Hines651f13c2014-04-23 16:59:28 -07002860 case llvm::Triple::arm64:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002861 case llvm::Triple::arm64_be:
2862 AddAArch64TargetArgs(Args, CmdArgs);
Stephen Hines651f13c2014-04-23 16:59:28 -07002863 break;
2864
Eric Christophered734732010-03-02 02:41:08 +00002865 case llvm::Triple::mips:
2866 case llvm::Triple::mipsel:
Akira Hatanaka7ec02582011-09-21 02:13:07 +00002867 case llvm::Triple::mips64:
2868 case llvm::Triple::mips64el:
Eric Christophered734732010-03-02 02:41:08 +00002869 AddMIPSTargetArgs(Args, CmdArgs);
2870 break;
2871
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002872 case llvm::Triple::sparc:
2873 AddSparcTargetArgs(Args, CmdArgs);
2874 break;
2875
Daniel Dunbar6acda162009-09-09 22:33:08 +00002876 case llvm::Triple::x86:
2877 case llvm::Triple::x86_64:
2878 AddX86TargetArgs(Args, CmdArgs);
2879 break;
Tony Linthicum96319392011-12-12 21:14:55 +00002880
2881 case llvm::Triple::hexagon:
2882 AddHexagonTargetArgs(Args, CmdArgs);
2883 break;
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002884 }
2885
Hans Wennborgb3574792013-08-08 00:17:41 +00002886 // Add clang-cl arguments.
2887 if (getToolChain().getDriver().IsCLMode())
2888 AddClangCLArgs(Args, CmdArgs);
2889
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002890 // Pass the linker version in use.
2891 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2892 CmdArgs.push_back("-target-linker-version");
Richard Smith1d489cf2012-11-01 04:30:05 +00002893 CmdArgs.push_back(A->getValue());
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002894 }
2895
Eric Christopherd3e22df2013-04-03 01:58:53 +00002896 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbar1ad66482010-07-01 01:31:45 +00002897 CmdArgs.push_back("-momit-leaf-frame-pointer");
2898
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002899 // Explicitly error on some things we know we don't support and can't just
2900 // ignore.
2901 types::ID InputType = Inputs[0].getType();
Daniel Dunbare94db472010-09-24 19:39:37 +00002902 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2903 Arg *Unsupported;
Daniel Dunbare94db472010-09-24 19:39:37 +00002904 if (types::isCXX(InputType) &&
Bob Wilson905c45f2011-10-14 05:03:44 +00002905 getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002906 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilsona544aee2011-08-13 23:48:55 +00002907 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2908 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002909 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbare94db472010-09-24 19:39:37 +00002910 << Unsupported->getOption().getName();
2911 }
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002912 }
2913
Daniel Dunbar1d460332009-03-18 10:01:51 +00002914 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbarf7c16d92010-08-24 22:44:13 +00002915 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosier2b819102011-08-02 17:58:04 +00002916 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbar322c29f2011-02-02 21:11:35 +00002917 CmdArgs.push_back("-header-include-file");
2918 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2919 D.CCPrintHeadersFilename : "-");
2920 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002921 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump1eb44332009-09-09 15:08:12 +00002922 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002923
Chad Rosier2b819102011-08-02 17:58:04 +00002924 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00002925 CmdArgs.push_back("-diagnostic-log-file");
2926 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2927 D.CCLogDiagnosticsFilename : "-");
2928 }
2929
Stephen Hines651f13c2014-04-23 16:59:28 -07002930 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
2931 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola18f36d92010-03-07 04:46:18 +00002932 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002933 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07002934 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2935 // FIXME: we should support specifying dwarf version with
2936 // -gline-tables-only.
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002937 CmdArgs.push_back("-gline-tables-only");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07002938 // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
2939 const llvm::Triple &Triple = getToolChain().getTriple();
2940 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
2941 Triple.getOS() == llvm::Triple::FreeBSD)
Stephen Hines651f13c2014-04-23 16:59:28 -07002942 CmdArgs.push_back("-gdwarf-2");
2943 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Renfc0f91c2013-06-19 01:46:49 +00002944 CmdArgs.push_back("-gdwarf-2");
2945 else if (A->getOption().matches(options::OPT_gdwarf_3))
2946 CmdArgs.push_back("-gdwarf-3");
2947 else if (A->getOption().matches(options::OPT_gdwarf_4))
2948 CmdArgs.push_back("-gdwarf-4");
Eric Christopherc706c8e2013-02-05 07:29:57 +00002949 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren8ed38d82013-07-02 23:15:25 +00002950 !A->getOption().matches(options::OPT_ggdb0)) {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07002951 // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
2952 const llvm::Triple &Triple = getToolChain().getTriple();
2953 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
2954 Triple.getOS() == llvm::Triple::FreeBSD)
Manman Ren8ed38d82013-07-02 23:15:25 +00002955 CmdArgs.push_back("-gdwarf-2");
2956 else
2957 CmdArgs.push_back("-g");
2958 }
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002959 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002960
Alexey Samsonov7f326072012-06-21 08:22:39 +00002961 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2962 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christopherda3301e2012-10-18 21:52:18 +00002963 if (Args.hasArg(options::OPT_gcolumn_info))
2964 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonov7f326072012-06-21 08:22:39 +00002965
Eric Christopher0f43a6d2013-09-13 22:37:55 +00002966 // FIXME: Move backend command line options to the module.
Eric Christopherc706c8e2013-02-05 07:29:57 +00002967 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2968 // splitting and extraction.
Eric Christopherf870e122013-02-21 22:35:05 +00002969 // FIXME: Currently only works on Linux.
Cameron Esfahani57b1da12013-09-14 01:09:11 +00002970 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherf870e122013-02-21 22:35:05 +00002971 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopherc706c8e2013-02-05 07:29:57 +00002972 CmdArgs.push_back("-g");
2973 CmdArgs.push_back("-backend-option");
2974 CmdArgs.push_back("-split-dwarf=Enable");
2975 }
2976
Eric Christopher0f43a6d2013-09-13 22:37:55 +00002977 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2978 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2979 CmdArgs.push_back("-backend-option");
2980 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2981 }
Eric Christopher3e8ac1b2013-06-18 00:03:50 +00002982
Stephen Hines651f13c2014-04-23 16:59:28 -07002983 // -gdwarf-aranges turns on the emission of the aranges section in the
2984 // backend.
2985 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
2986 CmdArgs.push_back("-backend-option");
2987 CmdArgs.push_back("-generate-arange-section");
2988 }
Eric Christopher3e8ac1b2013-06-18 00:03:50 +00002989
Stephen Hines651f13c2014-04-23 16:59:28 -07002990 if (Args.hasFlag(options::OPT_fdebug_types_section,
2991 options::OPT_fno_debug_types_section, false)) {
2992 CmdArgs.push_back("-backend-option");
2993 CmdArgs.push_back("-generate-type-units");
2994 }
2995
2996 if (Args.hasFlag(options::OPT_ffunction_sections,
2997 options::OPT_fno_function_sections, false)) {
2998 CmdArgs.push_back("-ffunction-sections");
2999 }
3000
3001 if (Args.hasFlag(options::OPT_fdata_sections,
3002 options::OPT_fno_data_sections, false)) {
3003 CmdArgs.push_back("-fdata-sections");
3004 }
Rafael Espindola9cf933a2010-05-06 21:06:04 +00003005
Chris Lattner7255a2d2010-06-22 00:03:40 +00003006 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3007
Stephen Hines651f13c2014-04-23 16:59:28 -07003008 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
3009 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3010 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3011 D.Diag(diag::err_drv_argument_not_allowed_with)
3012 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3013
3014 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3015
3016 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3017 A->render(Args, CmdArgs);
3018 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3019 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3020
Nick Lewyckye8ba8d72011-04-21 23:44:07 +00003021 if (Args.hasArg(options::OPT_ftest_coverage) ||
3022 Args.hasArg(options::OPT_coverage))
3023 CmdArgs.push_back("-femit-coverage-notes");
3024 if (Args.hasArg(options::OPT_fprofile_arcs) ||
3025 Args.hasArg(options::OPT_coverage))
3026 CmdArgs.push_back("-femit-coverage-data");
3027
Nick Lewycky5ea4f442011-05-04 20:46:58 +00003028 if (C.getArgs().hasArg(options::OPT_c) ||
3029 C.getArgs().hasArg(options::OPT_S)) {
3030 if (Output.isFilename()) {
Nick Lewycky3dc05412011-05-05 00:08:20 +00003031 CmdArgs.push_back("-coverage-file");
Eric Christopher025b3d42013-02-22 00:24:40 +00003032 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky0f815f12013-03-07 08:28:53 +00003033 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolaa2148242013-08-10 01:40:10 +00003034 SmallString<128> Pwd;
3035 if (!llvm::sys::fs::current_path(Pwd)) {
3036 llvm::sys::path::append(Pwd, CoverageFilename.str());
3037 CoverageFilename.swap(Pwd);
Nick Lewycky0f815f12013-03-07 08:28:53 +00003038 }
3039 }
Eric Christopher025b3d42013-02-22 00:24:40 +00003040 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky5ea4f442011-05-04 20:46:58 +00003041 }
3042 }
3043
Daniel Dunbara268fc02011-10-11 18:20:10 +00003044 // Pass options for controlling the default header search paths.
3045 if (Args.hasArg(options::OPT_nostdinc)) {
3046 CmdArgs.push_back("-nostdsysteminc");
3047 CmdArgs.push_back("-nobuiltininc");
3048 } else {
Daniel Dunbar92d6d402011-10-11 18:20:16 +00003049 if (Args.hasArg(options::OPT_nostdlibinc))
3050 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbara268fc02011-10-11 18:20:10 +00003051 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3052 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3053 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003054
Daniel Dunbar5f122322009-12-15 01:02:52 +00003055 // Pass the path to compiler resource files.
Daniel Dunbar5f122322009-12-15 01:02:52 +00003056 CmdArgs.push_back("-resource-dir");
Daniel Dunbar225c4172010-01-20 02:35:16 +00003057 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar2ac9fc22009-04-07 21:42:00 +00003058
Argyrios Kyrtzidis389db162010-11-03 22:45:23 +00003059 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3060
Ted Kremenek30660a82012-03-06 20:06:33 +00003061 bool ARCMTEnabled = false;
Argyrios Kyrtzidisdce3ce32013-09-17 19:14:29 +00003062 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00003063 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00003064 options::OPT_ccc_arcmt_modify,
3065 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00003066 ARCMTEnabled = true;
John McCall8f0e8d22011-06-15 23:25:17 +00003067 switch (A->getOption().getID()) {
3068 default:
3069 llvm_unreachable("missed a case");
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00003070 case options::OPT_ccc_arcmt_check:
John McCall8f0e8d22011-06-15 23:25:17 +00003071 CmdArgs.push_back("-arcmt-check");
3072 break;
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00003073 case options::OPT_ccc_arcmt_modify:
John McCall8f0e8d22011-06-15 23:25:17 +00003074 CmdArgs.push_back("-arcmt-modify");
3075 break;
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00003076 case options::OPT_ccc_arcmt_migrate:
3077 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenek30660a82012-03-06 20:06:33 +00003078 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00003079 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidis7ee20492011-07-19 17:20:03 +00003080
3081 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3082 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00003083 break;
John McCall8f0e8d22011-06-15 23:25:17 +00003084 }
3085 }
Argyrios Kyrtzidisf75ece42013-06-24 19:01:18 +00003086 } else {
3087 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3088 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3089 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCall8f0e8d22011-06-15 23:25:17 +00003090 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00003091
Ted Kremenek30660a82012-03-06 20:06:33 +00003092 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3093 if (ARCMTEnabled) {
3094 D.Diag(diag::err_drv_argument_not_allowed_with)
3095 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3096 }
3097 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00003098 CmdArgs.push_back(A->getValue());
Ted Kremenek30660a82012-03-06 20:06:33 +00003099
3100 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand4129992013-07-09 16:59:14 +00003101 options::OPT_objcmt_migrate_subscripting,
3102 options::OPT_objcmt_migrate_property)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00003103 // None specified, means enable them all.
3104 CmdArgs.push_back("-objcmt-migrate-literals");
3105 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand4129992013-07-09 16:59:14 +00003106 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenek30660a82012-03-06 20:06:33 +00003107 } else {
3108 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3109 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand4129992013-07-09 16:59:14 +00003110 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenek30660a82012-03-06 20:06:33 +00003111 }
Argyrios Kyrtzidis17c384c2013-11-13 23:38:20 +00003112 } else {
3113 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3114 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3115 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3116 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3117 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3118 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
3119 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3120 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3121 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3122 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3123 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3124 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3125 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Stephen Hines651f13c2014-04-23 16:59:28 -07003126 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
3127 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenek30660a82012-03-06 20:06:33 +00003128 }
3129
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003130 // Add preprocessing options like -I, -D, etc. if we are using the
3131 // preprocessor.
3132 //
3133 // FIXME: Support -fpreprocessed
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003134 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier9d718632013-01-24 19:14:47 +00003135 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00003136
Rafael Espindola19d9d2e2011-07-21 23:40:37 +00003137 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3138 // that "The compiler can only warn and ignore the option if not recognized".
3139 // When building with ccache, it will pass -D options to clang even on
3140 // preprocessed inputs and configure concludes that -fPIC is not supported.
3141 Args.ClaimAllArgs(options::OPT_D);
3142
Alp Tokere22017e2013-11-15 20:40:58 +00003143 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindola55ee1eb2013-08-27 16:58:15 +00003144 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3145 if (A->getOption().matches(options::OPT_O4)) {
3146 CmdArgs.push_back("-O3");
3147 D.Diag(diag::warn_O4_is_O3);
3148 } else {
3149 A->render(Args, CmdArgs);
3150 }
3151 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003152
Chad Rosierb2c08872012-12-12 20:06:31 +00003153 // Don't warn about unused -flto. This can happen when we're preprocessing or
3154 // precompiling.
3155 Args.ClaimAllArgs(options::OPT_flto);
3156
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00003157 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremeneke8cf7d12012-07-07 05:53:30 +00003158 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3159 CmdArgs.push_back("-pedantic");
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00003160 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbar1d460332009-03-18 10:01:51 +00003161 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard573d262009-04-07 22:13:21 +00003162
3163 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgadbb4552013-07-31 16:57:56 +00003164 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbard573d262009-04-07 22:13:21 +00003165 //
3166 // If a std is supplied, only add -trigraphs if it follows the
3167 // option.
3168 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3169 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes528365d2009-10-16 14:28:06 +00003170 if (types::isCXX(InputType))
Daniel Dunbar294691e2009-11-04 06:24:38 +00003171 CmdArgs.push_back("-std=c++98");
Nuno Lopes528365d2009-10-16 14:28:06 +00003172 else
Daniel Dunbar294691e2009-11-04 06:24:38 +00003173 CmdArgs.push_back("-std=c89");
Daniel Dunbard573d262009-04-07 22:13:21 +00003174 else
3175 Std->render(Args, CmdArgs);
3176
Daniel Dunbar0e100312010-06-14 21:23:08 +00003177 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
3178 options::OPT_trigraphs))
3179 if (A != Std)
Daniel Dunbard573d262009-04-07 22:13:21 +00003180 A->render(Args, CmdArgs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00003181 } else {
3182 // Honor -std-default.
Daniel Dunbar4a5290e2010-01-29 21:03:02 +00003183 //
3184 // FIXME: Clang doesn't correctly handle -std= when the input language
3185 // doesn't match. For the time being just ignore this for C++ inputs;
3186 // eventually we want to do all the standard defaulting here instead of
3187 // splitting it between the driver and clang -cc1.
3188 if (!types::isCXX(InputType))
Nico Weber50f88b92012-08-30 02:08:31 +00003189 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3190 "-std=", /*Joined=*/true);
Stephen Hines651f13c2014-04-23 16:59:28 -07003191 else if (IsWindowsMSVC)
Nico Weber50f88b92012-08-30 02:08:31 +00003192 CmdArgs.push_back("-std=c++11");
3193
Daniel Dunbard573d262009-04-07 22:13:21 +00003194 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00003195 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003196
Richard Smithe9813b32013-09-04 22:50:31 +00003197 // GCC's behavior for -Wwrite-strings is a bit strange:
3198 // * In C, this "warning flag" changes the types of string literals from
3199 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3200 // for the discarded qualifier.
3201 // * In C++, this is just a normal warning flag.
3202 //
3203 // Implementing this warning correctly in C is hard, so we follow GCC's
3204 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3205 // a non-const char* in C, rather than using this crude hack.
3206 if (!types::isCXX(InputType)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07003207 // FIXME: This should behave just like a warning flag, and thus should also
3208 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3209 Arg *WriteStrings =
3210 Args.getLastArg(options::OPT_Wwrite_strings,
3211 options::OPT_Wno_write_strings, options::OPT_w);
3212 if (WriteStrings &&
3213 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smithe9813b32013-09-04 22:50:31 +00003214 CmdArgs.push_back("-fconst-strings");
Chandler Carruth50465d12011-04-23 06:30:43 +00003215 }
3216
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00003217 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruthf8c247d2011-04-23 19:48:40 +00003218 // during C++ compilation, which it is by default. GCC keeps this define even
3219 // in the presence of '-w', match this behavior bug-for-bug.
3220 if (types::isCXX(InputType) &&
3221 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3222 true)) {
3223 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00003224 }
3225
Chandler Carruthc304ba32010-05-22 02:21:53 +00003226 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3227 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3228 if (Asm->getOption().matches(options::OPT_fasm))
3229 CmdArgs.push_back("-fgnu-keywords");
3230 else
3231 CmdArgs.push_back("-fno-gnu-keywords");
3232 }
3233
Nick Lewyckyea523d72011-10-17 23:05:52 +00003234 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3235 CmdArgs.push_back("-fno-dwarf-directory-asm");
3236
Daniel Dunbarf4910132013-04-16 18:21:19 +00003237 if (ShouldDisableAutolink(Args, getToolChain()))
3238 CmdArgs.push_back("-fno-autolink");
3239
Chandler Carruthd566df62012-12-17 21:40:04 +00003240 // Add in -fdebug-compilation-dir if necessary.
3241 addDebugCompDirArg(Args, CmdArgs);
Nick Lewycky7c4fd912011-10-21 02:32:14 +00003242
Richard Smithc18c4232011-11-21 19:36:32 +00003243 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3244 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00003245 CmdArgs.push_back("-ftemplate-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00003246 CmdArgs.push_back(A->getValue());
Daniel Dunbar1d460332009-03-18 10:01:51 +00003247 }
3248
Richard Smith195dd7c2013-11-06 19:31:51 +00003249 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3250 CmdArgs.push_back("-foperator-arrow-depth");
3251 CmdArgs.push_back(A->getValue());
3252 }
3253
Richard Smithc18c4232011-11-21 19:36:32 +00003254 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3255 CmdArgs.push_back("-fconstexpr-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00003256 CmdArgs.push_back(A->getValue());
Richard Smithc18c4232011-11-21 19:36:32 +00003257 }
3258
Richard Smithe7565632013-05-08 02:12:03 +00003259 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3260 CmdArgs.push_back("-fconstexpr-steps");
3261 CmdArgs.push_back(A->getValue());
3262 }
3263
Richard Smith9e738cc2013-02-22 01:59:51 +00003264 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3265 CmdArgs.push_back("-fbracket-depth");
3266 CmdArgs.push_back(A->getValue());
3267 }
3268
Argyrios Kyrtzidis1380a142010-11-18 00:20:36 +00003269 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3270 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00003271 if (A->getNumValues()) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003272 StringRef bytes = A->getValue();
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00003273 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3274 } else
3275 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidis3532fdd2010-11-17 23:11:54 +00003276 }
3277
Nuno Lopesb3198a82012-05-08 22:10:46 +00003278
Michael J. Spencerc6357102012-10-22 22:13:48 +00003279 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar66861e02009-11-20 22:21:36 +00003280 CmdArgs.push_back("-relocatable-pch");
Mike Stump1eb44332009-09-09 15:08:12 +00003281
Daniel Dunbar294691e2009-11-04 06:24:38 +00003282 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3283 CmdArgs.push_back("-fconstant-string-class");
Richard Smith1d489cf2012-11-01 04:30:05 +00003284 CmdArgs.push_back(A->getValue());
Daniel Dunbar294691e2009-11-04 06:24:38 +00003285 }
David Chisnall8a5a9aa2009-08-31 16:41:57 +00003286
Chris Lattner124fca52010-01-09 21:54:33 +00003287 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3288 CmdArgs.push_back("-ftabstop");
Richard Smith1d489cf2012-11-01 04:30:05 +00003289 CmdArgs.push_back(A->getValue());
Chris Lattner124fca52010-01-09 21:54:33 +00003290 }
3291
Chris Lattner0f0c9632010-04-07 20:49:23 +00003292 CmdArgs.push_back("-ferror-limit");
3293 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smith1d489cf2012-11-01 04:30:05 +00003294 CmdArgs.push_back(A->getValue());
Chris Lattner0f0c9632010-04-07 20:49:23 +00003295 else
3296 CmdArgs.push_back("19");
Douglas Gregor575cf372010-04-20 07:18:24 +00003297
Chandler Carruthc40f73c2010-05-06 04:55:18 +00003298 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3299 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00003300 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00003301 }
3302
3303 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3304 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00003305 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00003306 }
3307
Richard Smith08d6e032011-12-16 19:06:07 +00003308 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3309 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00003310 CmdArgs.push_back(A->getValue());
Richard Smith08d6e032011-12-16 19:06:07 +00003311 }
3312
Daniel Dunbar55efe142009-11-04 06:24:47 +00003313 // Pass -fmessage-length=.
Daniel Dunbara28690e2009-11-30 08:40:54 +00003314 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar55efe142009-11-04 06:24:47 +00003315 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003316 CmdArgs.push_back(A->getValue());
Daniel Dunbar55efe142009-11-04 06:24:47 +00003317 } else {
3318 // If -fmessage-length=N was not specified, determine whether this is a
3319 // terminal and, if so, implicitly define -fmessage-length appropriately.
3320 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner5f9e2722011-07-23 10:55:15 +00003321 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar55efe142009-11-04 06:24:47 +00003322 }
3323
John McCalla880b192013-02-19 01:57:35 +00003324 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3325 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3326 options::OPT_fvisibility_ms_compat)) {
3327 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3328 CmdArgs.push_back("-fvisibility");
3329 CmdArgs.push_back(A->getValue());
3330 } else {
3331 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3332 CmdArgs.push_back("-fvisibility");
3333 CmdArgs.push_back("hidden");
3334 CmdArgs.push_back("-ftype-visibility");
3335 CmdArgs.push_back("default");
3336 }
Daniel Dunbarba8d8612009-12-03 18:42:11 +00003337 }
3338
Douglas Gregor7cf84d62010-06-15 17:05:35 +00003339 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer20249a12010-10-21 03:16:25 +00003340
Hans Wennborgde981f32012-06-28 08:01:44 +00003341 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3342
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00003343 // -fhosted is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00003344 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3345 KernelOrKext)
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00003346 CmdArgs.push_back("-ffreestanding");
3347
Daniel Dunbarba8d8612009-12-03 18:42:11 +00003348 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00003349 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00003350 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Stephen Hines651f13c2014-04-23 16:59:28 -07003351 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3352 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christophere88c4512011-10-25 07:13:06 +00003353 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidt9e0b6472013-07-03 15:36:02 +00003354 // AltiVec language extensions aren't relevant for assembling.
3355 if (!isa<PreprocessJobAction>(JA) ||
3356 Output.getType() != types::TY_PP_Asm)
3357 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu246b6aa2012-06-26 18:18:47 +00003358 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3359 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier4574c3d2012-03-13 23:45:51 +00003360
Peter Collingbournec6911a22013-11-01 18:16:25 +00003361 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3362 Sanitize.addArgs(Args, CmdArgs);
Richard Smithc4dabad2012-11-05 22:04:41 +00003363
Will Dietz2d382d12012-12-30 20:53:28 +00003364 if (!Args.hasFlag(options::OPT_fsanitize_recover,
3365 options::OPT_fno_sanitize_recover,
3366 true))
3367 CmdArgs.push_back("-fno-sanitize-recover");
3368
Stephen Hines651f13c2014-04-23 16:59:28 -07003369 if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
Chad Rosier78d85b12013-01-29 23:31:22 +00003370 options::OPT_fno_sanitize_undefined_trap_on_error, false))
3371 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
3372
Eric Christopher98654c92013-02-19 06:16:53 +00003373 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier4574c3d2012-03-13 23:45:51 +00003374 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003375 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00003376 getToolChain().getArch() == llvm::Triple::ppc64 ||
3377 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier4574c3d2012-03-13 23:45:51 +00003378 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00003379 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier4574c3d2012-03-13 23:45:51 +00003380
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00003381 if (getToolChain().SupportsProfiling())
3382 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00003383
3384 // -flax-vector-conversions is default.
3385 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3386 options::OPT_fno_lax_vector_conversions))
3387 CmdArgs.push_back("-fno-lax-vector-conversions");
3388
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003389 if (Args.getLastArg(options::OPT_fapple_kext))
3390 CmdArgs.push_back("-fapple-kext");
3391
Fariborz Jahanian34e65772009-05-22 20:17:16 +00003392 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner182e0922009-04-21 05:34:31 +00003393 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregor4786c152010-08-19 20:24:43 +00003394 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00003395 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3396 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnall7f18e672010-09-17 18:29:54 +00003397
3398 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3399 CmdArgs.push_back("-ftrapv-handler");
Richard Smith1d489cf2012-11-01 04:30:05 +00003400 CmdArgs.push_back(A->getValue());
David Chisnall7f18e672010-09-17 18:29:54 +00003401 }
3402
Bob Wilson71fd6cc2012-02-03 06:27:22 +00003403 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng49af1f32011-04-08 21:37:45 +00003404
Chandler Carruth5adb5a82011-03-27 00:04:55 +00003405 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3406 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3407 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3408 options::OPT_fno_wrapv)) {
3409 if (A->getOption().matches(options::OPT_fwrapv))
3410 CmdArgs.push_back("-fwrapv");
3411 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3412 options::OPT_fno_strict_overflow)) {
3413 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3414 CmdArgs.push_back("-fwrapv");
3415 }
Hal Finkelce5b5f12013-11-17 16:03:29 +00003416
3417 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3418 options::OPT_fno_reroll_loops))
3419 if (A->getOption().matches(options::OPT_freroll_loops))
3420 CmdArgs.push_back("-freroll-loops");
3421
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00003422 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruthb26404a2013-08-08 08:34:35 +00003423 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3424 options::OPT_fno_unroll_loops);
Daniel Dunbar1d460332009-03-18 10:01:51 +00003425
Daniel Dunbar5345c392009-09-03 04:54:28 +00003426 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3427
Mahesha Sf3b52312012-10-27 07:47:56 +00003428
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003429 // -stack-protector=0 is default.
3430 unsigned StackProtectorLevel = 0;
Bill Wendling45483f72009-06-28 07:36:13 +00003431 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3432 options::OPT_fstack_protector_all,
Stephen Hines651f13c2014-04-23 16:59:28 -07003433 options::OPT_fstack_protector_strong,
Bill Wendling45483f72009-06-28 07:36:13 +00003434 options::OPT_fstack_protector)) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003435 if (A->getOption().matches(options::OPT_fstack_protector)) {
3436 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3437 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3438 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Stephen Hines651f13c2014-04-23 16:59:28 -07003439 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003440 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Stephen Hines651f13c2014-04-23 16:59:28 -07003441 StackProtectorLevel = LangOptions::SSPReq;
Nico Weber2fef1112011-08-23 07:38:27 +00003442 } else {
3443 StackProtectorLevel =
3444 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3445 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003446 if (StackProtectorLevel) {
3447 CmdArgs.push_back("-stack-protector");
Chris Lattner5f9e2722011-07-23 10:55:15 +00003448 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003449 }
Chad Rosiera7afeb02012-08-21 16:16:06 +00003450
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003451 // --param ssp-buffer-size=
3452 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3453 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003454 StringRef Str((*it)->getValue());
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003455 if (Str.startswith("ssp-buffer-size=")) {
3456 if (StackProtectorLevel) {
Chad Rosiera7afeb02012-08-21 16:16:06 +00003457 CmdArgs.push_back("-stack-protector-buffer-size");
3458 // FIXME: Verify the argument is a valid integer.
3459 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosiera7afeb02012-08-21 16:16:06 +00003460 }
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003461 (*it)->claim();
Chad Rosiera7afeb02012-08-21 16:16:06 +00003462 }
Bill Wendling45483f72009-06-28 07:36:13 +00003463 }
3464
Nick Lewycky4e785c92011-12-06 03:33:03 +00003465 // Translate -mstackrealign
3466 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3467 false)) {
3468 CmdArgs.push_back("-backend-option");
3469 CmdArgs.push_back("-force-align-stack");
3470 }
3471 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3472 false)) {
3473 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3474 }
3475
Joerg Sonnenbergere9d11db2011-12-05 23:05:23 +00003476 if (Args.hasArg(options::OPT_mstack_alignment)) {
3477 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3478 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopher1a584022011-05-02 21:18:22 +00003479 }
Chad Rosier586a0612012-11-29 00:42:06 +00003480 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golin02ab7d32013-08-24 14:44:41 +00003481 if (!KernelOrKext) {
Renato Golinb69f9e02013-08-28 23:56:07 +00003482 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3483 options::OPT_munaligned_access)) {
3484 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3485 CmdArgs.push_back("-backend-option");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003486 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3487 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be ||
3488 getToolChain().getTriple().getArch() == llvm::Triple::arm64 ||
3489 getToolChain().getTriple().getArch() == llvm::Triple::arm64_be)
3490 CmdArgs.push_back("-aarch64-strict-align");
3491 else
3492 CmdArgs.push_back("-arm-strict-align");
Renato Golinb69f9e02013-08-28 23:56:07 +00003493 } else {
3494 CmdArgs.push_back("-backend-option");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003495 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3496 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be ||
3497 getToolChain().getTriple().getArch() == llvm::Triple::arm64 ||
3498 getToolChain().getTriple().getArch() == llvm::Triple::arm64_be)
3499 CmdArgs.push_back("-aarch64-no-strict-align");
3500 else
3501 CmdArgs.push_back("-arm-no-strict-align");
Renato Golinb69f9e02013-08-28 23:56:07 +00003502 }
Renato Golin02ab7d32013-08-24 14:44:41 +00003503 }
Chad Rosier7e293272012-11-09 17:29:19 +00003504 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00003505
Weiming Zhao7792fde2013-11-13 18:31:23 +00003506 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3507 options::OPT_mno_restrict_it)) {
3508 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3509 CmdArgs.push_back("-backend-option");
3510 CmdArgs.push_back("-arm-restrict-it");
3511 } else {
3512 CmdArgs.push_back("-backend-option");
3513 CmdArgs.push_back("-arm-no-restrict-it");
3514 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003515 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3516 TT.getArch() == llvm::Triple::thumb)) {
3517 // Windows on ARM expects restricted IT blocks
3518 CmdArgs.push_back("-backend-option");
3519 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao7792fde2013-11-13 18:31:23 +00003520 }
3521
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003522 if (TT.getArch() == llvm::Triple::arm ||
3523 TT.getArch() == llvm::Triple::thumb) {
3524 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3525 options::OPT_mno_long_calls)) {
3526 if (A->getOption().matches(options::OPT_mlong_calls)) {
3527 CmdArgs.push_back("-backend-option");
3528 CmdArgs.push_back("-arm-long-calls");
3529 }
3530 }
3531 }
3532
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003533 // Forward -f options with positive and negative forms; we translate
3534 // these by hand.
Diego Novillob85a9ec2013-11-13 12:22:39 +00003535 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3536 StringRef fname = A->getValue();
3537 if (!llvm::sys::fs::exists(fname))
3538 D.Diag(diag::err_drv_no_such_file) << fname;
3539 else
3540 A->render(Args, CmdArgs);
3541 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003542
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003543 if (Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
3544 A->render(Args, CmdArgs);
3545
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003546 if (Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
3547 A->render(Args, CmdArgs);
3548
3549 if (Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
3550 A->render(Args, CmdArgs);
3551
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003552 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar2843c192011-02-04 17:24:47 +00003553 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003554 CmdArgs.push_back("-fapple-kext");
3555 if (!Args.hasArg(options::OPT_fbuiltin))
3556 CmdArgs.push_back("-fno-builtin");
Chad Rosier3d265502012-03-26 21:29:17 +00003557 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003558 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003559 // -fbuiltin is default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003560 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar53e84842009-11-19 04:55:23 +00003561 CmdArgs.push_back("-fno-builtin");
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003562
Nuno Lopesfc284482009-12-16 16:59:22 +00003563 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3564 options::OPT_fno_assume_sane_operator_new))
3565 CmdArgs.push_back("-fno-assume-sane-operator-new");
3566
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003567 // -fblocks=0 is default.
3568 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnalle6533ff2011-02-28 17:11:43 +00003569 getToolChain().IsBlocksDefault()) ||
3570 (Args.hasArg(options::OPT_fgnu_runtime) &&
3571 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3572 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003573 CmdArgs.push_back("-fblocks");
John McCall13db5cf2011-09-09 20:41:01 +00003574
3575 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3576 !getToolChain().hasBlocksRuntime())
3577 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall5e530af2009-11-17 19:33:30 +00003578 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003579
Douglas Gregor64554ba2012-01-18 15:19:58 +00003580 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3581 // users must also pass -fcxx-modules. The latter flag will disappear once the
3582 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorf43b7212013-01-16 01:23:41 +00003583 bool HaveModules = false;
Douglas Gregor64554ba2012-01-18 15:19:58 +00003584 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3585 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3586 options::OPT_fno_cxx_modules,
3587 false);
Douglas Gregorf43b7212013-01-16 01:23:41 +00003588 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor64554ba2012-01-18 15:19:58 +00003589 CmdArgs.push_back("-fmodules");
Douglas Gregorf43b7212013-01-16 01:23:41 +00003590 HaveModules = true;
3591 }
3592 }
3593
Daniel Jasper056ec122013-08-05 20:26:17 +00003594 // -fmodule-maps enables module map processing (off by default) for header
3595 // checking. It is implied by -fmodules.
3596 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3597 false)) {
3598 CmdArgs.push_back("-fmodule-maps");
3599 }
3600
Daniel Jasper95411412013-10-21 06:34:34 +00003601 // -fmodules-decluse checks that modules used are declared so (off by
3602 // default).
Daniel Jasperddd2dfc2013-09-24 09:14:14 +00003603 if (Args.hasFlag(options::OPT_fmodules_decluse,
3604 options::OPT_fno_modules_decluse,
3605 false)) {
Daniel Jasper097595a2013-09-29 12:40:54 +00003606 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperddd2dfc2013-09-24 09:14:14 +00003607 }
3608
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003609 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3610 // all #included headers are part of modules.
3611 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3612 options::OPT_fno_modules_strict_decluse,
3613 false)) {
3614 CmdArgs.push_back("-fmodules-strict-decluse");
3615 }
3616
Daniel Jasper95411412013-10-21 06:34:34 +00003617 // -fmodule-name specifies the module that is currently being built (or
3618 // used for header checking by -fmodule-maps).
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003619 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name))
Daniel Jasper95411412013-10-21 06:34:34 +00003620 A->render(Args, CmdArgs);
Daniel Jasper95411412013-10-21 06:34:34 +00003621
3622 // -fmodule-map-file can be used to specify a file containing module
3623 // definitions.
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003624 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file))
Daniel Jasper95411412013-10-21 06:34:34 +00003625 A->render(Args, CmdArgs);
Daniel Jasper95411412013-10-21 06:34:34 +00003626
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003627 // -fmodule-cache-path specifies where our module files should be written.
3628 SmallString<128> ModuleCachePath;
3629 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
3630 ModuleCachePath = A->getValue();
3631 if (HaveModules) {
3632 if (C.isForDiagnostics()) {
3633 // When generating crash reports, we want to emit the modules along with
3634 // the reproduction sources, so we ignore any provided module path.
3635 ModuleCachePath = Output.getFilename();
3636 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
3637 llvm::sys::path::append(ModuleCachePath, "modules");
3638 } else if (ModuleCachePath.empty()) {
3639 // No module path was provided: use the default.
3640 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3641 ModuleCachePath);
3642 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang");
3643 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
Douglas Gregor953a61f2013-02-07 19:01:24 +00003644 }
Douglas Gregor250172a2013-02-07 22:59:12 +00003645 const char Arg[] = "-fmodules-cache-path=";
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003646 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
3647 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
Douglas Gregor953a61f2013-02-07 19:01:24 +00003648 }
3649
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003650 // When building modules and generating crashdumps, we need to dump a module
3651 // dependency VFS alongside the output.
3652 if (HaveModules && C.isForDiagnostics()) {
3653 SmallString<128> VFSDir(Output.getFilename());
3654 llvm::sys::path::replace_extension(VFSDir, ".cache");
3655 llvm::sys::path::append(VFSDir, "vfs");
3656 CmdArgs.push_back("-module-dependency-dir");
3657 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Stephen Hines651f13c2014-04-23 16:59:28 -07003658 }
3659
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003660 if (Arg *A = Args.getLastArg(options::OPT_fmodules_user_build_path))
3661 if (HaveModules)
3662 A->render(Args, CmdArgs);
3663
Douglas Gregor953a61f2013-02-07 19:01:24 +00003664 // Pass through all -fmodules-ignore-macro arguments.
3665 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregord44d2872013-03-25 21:19:16 +00003666 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3667 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor953a61f2013-02-07 19:01:24 +00003668
Stephen Hines651f13c2014-04-23 16:59:28 -07003669 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3670
3671 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
3672 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp))
3673 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
3674
3675 Args.AddLastArg(CmdArgs,
3676 options::OPT_fmodules_validate_once_per_build_session);
3677 }
3678
3679 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
3680
John McCall32579cf2010-04-09 19:12:06 +00003681 // -faccess-control is default.
John McCall7002f4c2010-04-09 19:03:51 +00003682 if (Args.hasFlag(options::OPT_fno_access_control,
3683 options::OPT_faccess_control,
John McCall32579cf2010-04-09 19:12:06 +00003684 false))
John McCall7002f4c2010-04-09 19:03:51 +00003685 CmdArgs.push_back("-fno-access-control");
John McCall3ddd6e02010-03-17 01:32:13 +00003686
Anders Carlssona4c24752010-11-21 00:09:52 +00003687 // -felide-constructors is the default.
3688 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3689 options::OPT_felide_constructors,
3690 false))
3691 CmdArgs.push_back("-fno-elide-constructors");
3692
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003693 // -frtti is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00003694 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smithc4dabad2012-11-05 22:04:41 +00003695 KernelOrKext) {
Daniel Dunbar53e84842009-11-19 04:55:23 +00003696 CmdArgs.push_back("-fno-rtti");
Mike Stump738f8c22009-07-31 23:15:31 +00003697
Richard Smithc4dabad2012-11-05 22:04:41 +00003698 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonovbb1071c2012-11-06 15:09:03 +00003699 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumi03c60762012-11-06 22:02:00 +00003700 std::string NoRttiArg =
Richard Smithc4dabad2012-11-05 22:04:41 +00003701 Args.getLastArg(options::OPT_mkernel,
3702 options::OPT_fapple_kext,
Richard Smith04fd3822012-11-06 01:12:02 +00003703 options::OPT_fno_rtti)->getAsString(Args);
Richard Smithc4dabad2012-11-05 22:04:41 +00003704 D.Diag(diag::err_drv_argument_not_allowed_with)
3705 << "-fsanitize=vptr" << NoRttiArg;
3706 }
3707 }
3708
Tony Linthicum96319392011-12-12 21:14:55 +00003709 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00003710 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum96319392011-12-12 21:14:55 +00003711 options::OPT_fno_short_enums,
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003712 getToolChain().getArch() ==
Tony Linthicum96319392011-12-12 21:14:55 +00003713 llvm::Triple::hexagon))
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00003714 CmdArgs.push_back("-fshort-enums");
3715
Daniel Dunbar1f95e652009-11-17 06:37:03 +00003716 // -fsigned-char is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00003717 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbar1f95e652009-11-17 06:37:03 +00003718 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar76743522009-11-29 02:39:08 +00003719 CmdArgs.push_back("-fno-signed-char");
Eli Friedman5a779732009-06-05 07:21:14 +00003720
Anders Carlssona508b7d2010-02-06 23:23:06 +00003721 // -fthreadsafe-static is default.
Michael J. Spencer20249a12010-10-21 03:16:25 +00003722 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssona508b7d2010-02-06 23:23:06 +00003723 options::OPT_fno_threadsafe_statics))
3724 CmdArgs.push_back("-fno-threadsafe-statics");
3725
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00003726 // -fuse-cxa-atexit is default.
Stephen Hines651f13c2014-04-23 16:59:28 -07003727 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3728 options::OPT_fno_use_cxa_atexit,
3729 !IsWindowsCygnus && !IsWindowsGNU &&
3730 getToolChain().getArch() != llvm::Triple::hexagon &&
3731 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosierafc4baa2012-03-26 22:04:46 +00003732 KernelOrKext)
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00003733 CmdArgs.push_back("-fno-use-cxa-atexit");
3734
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003735 // -fms-extensions=0 is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00003736 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Stephen Hines651f13c2014-04-23 16:59:28 -07003737 IsWindowsMSVC))
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003738 CmdArgs.push_back("-fms-extensions");
3739
Francois Pichetae556082011-09-17 04:32:15 +00003740 // -fms-compatibility=0 is default.
Douglas Gregorba97b6e2011-10-24 15:49:38 +00003741 if (Args.hasFlag(options::OPT_fms_compatibility,
3742 options::OPT_fno_ms_compatibility,
Stephen Hines651f13c2014-04-23 16:59:28 -07003743 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
3744 options::OPT_fno_ms_extensions,
3745 true))))
Francois Pichetae556082011-09-17 04:32:15 +00003746 CmdArgs.push_back("-fms-compatibility");
3747
Reid Kleckner8c64c182013-09-18 00:33:59 +00003748 // -fmsc-version=1700 is default.
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003749 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Stephen Hines651f13c2014-04-23 16:59:28 -07003750 IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00003751 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003752 if (msc_ver.empty())
Reid Kleckner8c64c182013-09-18 00:33:59 +00003753 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003754 else
3755 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3756 }
3757
3758
Eric Christophercfc01e42013-02-18 00:38:31 +00003759 // -fno-borland-extensions is default.
Dawn Perchik400b6072010-09-02 23:59:25 +00003760 if (Args.hasFlag(options::OPT_fborland_extensions,
3761 options::OPT_fno_borland_extensions, false))
3762 CmdArgs.push_back("-fborland-extensions");
3763
Francois Pichet8efcc012011-09-01 16:38:08 +00003764 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3765 // needs it.
Francois Pichet8387e2a2011-04-22 22:18:13 +00003766 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Stephen Hines651f13c2014-04-23 16:59:28 -07003767 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet805bc1f2011-08-26 00:22:34 +00003768 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet8387e2a2011-04-22 22:18:13 +00003769
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00003770 // -fgnu-keywords default varies depending on language; only pass if
3771 // specified.
3772 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbar40788d92010-04-24 17:56:39 +00003773 options::OPT_fno_gnu_keywords))
3774 A->render(Args, CmdArgs);
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00003775
Rafael Espindola01ba8542011-06-02 17:30:53 +00003776 if (Args.hasFlag(options::OPT_fgnu89_inline,
3777 options::OPT_fno_gnu89_inline,
3778 false))
Rafael Espindolafb3f4aa2011-06-02 16:13:27 +00003779 CmdArgs.push_back("-fgnu89-inline");
3780
Chad Rosierfc055f92012-03-15 22:31:42 +00003781 if (Args.hasArg(options::OPT_fno_inline))
3782 CmdArgs.push_back("-fno-inline");
3783
Chad Rosier634a4b12012-03-06 21:17:19 +00003784 if (Args.hasArg(options::OPT_fno_inline_functions))
3785 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier250008b2012-03-06 18:49:20 +00003786
John McCall260611a2012-06-20 06:18:46 +00003787 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall9f084a32011-07-06 00:26:06 +00003788
John McCall260611a2012-06-20 06:18:46 +00003789 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Stephen Hines651f13c2014-04-23 16:59:28 -07003790 // legacy is the default. Except for deployment taget of 10.5,
3791 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
3792 // gets ignored silently.
3793 if (objcRuntime.isNonFragile()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003794 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3795 options::OPT_fno_objc_legacy_dispatch,
David Chisnall2c7886d2012-07-04 11:52:24 +00003796 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003797 getToolChain().getArch()))) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003798 if (getToolChain().UseObjCMixedDispatch())
3799 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3800 else
3801 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3802 }
3803 }
Rafael Espindola669496b2013-11-12 04:33:56 +00003804
Fariborz Jahanian5d5058c2013-11-12 17:08:46 +00003805 // When ObjectiveC legacy runtime is in effect on MacOSX,
3806 // turn on the option to do Array/Dictionary subscripting
3807 // by default.
Fariborz Jahanian08d86e92013-11-12 20:50:26 +00003808 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
3809 getToolChain().getTriple().isMacOSX() &&
3810 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
3811 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanian5d5058c2013-11-12 17:08:46 +00003812 objcRuntime.isNeXTFamily())
3813 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
3814
Fariborz Jahanian3d145f62012-11-15 19:02:45 +00003815 // -fencode-extended-block-signature=1 is default.
3816 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3817 CmdArgs.push_back("-fencode-extended-block-signature");
3818 }
3819
John McCall9f084a32011-07-06 00:26:06 +00003820 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3821 // NOTE: This logic is duplicated in ToolChains.cpp.
3822 bool ARC = isObjCAutoRefCount(Args);
3823 if (ARC) {
John McCall0a7dd782012-08-21 02:47:43 +00003824 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis5840dd92012-02-29 03:43:52 +00003825
John McCall9f084a32011-07-06 00:26:06 +00003826 CmdArgs.push_back("-fobjc-arc");
3827
Chandler Carruth7ffa0322011-11-04 07:34:47 +00003828 // FIXME: It seems like this entire block, and several around it should be
3829 // wrapped in isObjC, but for now we just use it here as this is where it
3830 // was being used previously.
3831 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3832 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3833 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3834 else
3835 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3836 }
3837
John McCall9f084a32011-07-06 00:26:06 +00003838 // Allow the user to enable full exceptions code emission.
3839 // We define off for Objective-CC, on for Objective-C++.
3840 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3841 options::OPT_fno_objc_arc_exceptions,
3842 /*default*/ types::isCXX(InputType)))
3843 CmdArgs.push_back("-fobjc-arc-exceptions");
3844 }
3845
3846 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3847 // rewriter.
John McCall260611a2012-06-20 06:18:46 +00003848 if (rewriteKind != RK_None)
John McCall9f084a32011-07-06 00:26:06 +00003849 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003850
John McCall9f084a32011-07-06 00:26:06 +00003851 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3852 // takes precedence.
3853 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3854 if (!GCArg)
3855 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3856 if (GCArg) {
3857 if (ARC) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00003858 D.Diag(diag::err_drv_objc_gc_arr)
John McCall9f084a32011-07-06 00:26:06 +00003859 << GCArg->getAsString(Args);
3860 } else if (getToolChain().SupportsObjCGC()) {
3861 GCArg->render(Args, CmdArgs);
3862 } else {
3863 // FIXME: We should move this to a hard error.
Chris Lattner5f9e2722011-07-23 10:55:15 +00003864 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall9f084a32011-07-06 00:26:06 +00003865 << GCArg->getAsString(Args);
3866 }
3867 }
3868
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003869 // Handle GCC-style exception args.
3870 if (!C.getDriver().IsCLMode())
3871 addExceptionArgs(Args, InputType, getToolChain().getTriple(), KernelOrKext,
3872 objcRuntime, CmdArgs);
John McCalld71315c2011-06-22 00:53:57 +00003873
3874 if (getToolChain().UseSjLjExceptions())
3875 CmdArgs.push_back("-fsjlj-exceptions");
3876
3877 // C++ "sane" operator new.
Daniel Dunbar984eb862010-02-01 21:07:25 +00003878 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3879 options::OPT_fno_assume_sane_operator_new))
3880 CmdArgs.push_back("-fno-assume-sane-operator-new");
3881
Daniel Dunbarf35f14d2010-04-27 15:34:57 +00003882 // -fconstant-cfstrings is default, and may be subject to argument translation
3883 // on Darwin.
3884 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3885 options::OPT_fno_constant_cfstrings) ||
3886 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3887 options::OPT_mno_constant_cfstrings))
3888 CmdArgs.push_back("-fno-constant-cfstrings");
3889
John Thompsona6fda122009-11-05 20:14:16 +00003890 // -fshort-wchar default varies depending on platform; only
3891 // pass if specified.
Stephen Hines651f13c2014-04-23 16:59:28 -07003892 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
3893 options::OPT_fno_short_wchar))
Daniel Dunbar1744a352010-04-27 15:35:03 +00003894 A->render(Args, CmdArgs);
John Thompsona6fda122009-11-05 20:14:16 +00003895
Hans Wennborgb087a5d2013-07-31 23:39:13 +00003896 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003897 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00003898 options::OPT_fno_pascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00003899 false))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003900 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00003901
Daniel Dunbar88934e82011-10-05 21:04:55 +00003902 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3903 // -fno-pack-struct doesn't apply to -fpack-struct=.
3904 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloy8049c442012-05-02 07:56:14 +00003905 std::string PackStructStr = "-fpack-struct=";
Richard Smith1d489cf2012-11-01 04:30:05 +00003906 PackStructStr += A->getValue();
James Molloy8049c442012-05-02 07:56:14 +00003907 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar88934e82011-10-05 21:04:55 +00003908 } else if (Args.hasFlag(options::OPT_fpack_struct,
3909 options::OPT_fno_pack_struct, false)) {
James Molloy8049c442012-05-02 07:56:14 +00003910 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar88934e82011-10-05 21:04:55 +00003911 }
3912
Robert Lytton5f15f4d2013-08-13 09:43:10 +00003913 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003914 if (!Args.hasArg(options::OPT_fcommon))
3915 CmdArgs.push_back("-fno-common");
Chad Rosierec09b3e2012-03-26 21:35:40 +00003916 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003917 }
Daniel Dunbar88934e82011-10-05 21:04:55 +00003918
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003919 // -fcommon is default, only pass non-default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003920 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003921 CmdArgs.push_back("-fno-common");
3922
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003923 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003924 // -funsigned-bitfields.
Mike Stump1eb44332009-09-09 15:08:12 +00003925 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003926 options::OPT_funsigned_bitfields))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003927 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003928 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3929
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003930 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3931 if (!Args.hasFlag(options::OPT_ffor_scope,
3932 options::OPT_fno_for_scope))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003933 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003934 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3935
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003936 // -finput_charset=UTF-8 is default. Reject others
3937 if (Arg *inputCharset = Args.getLastArg(
3938 options::OPT_finput_charset_EQ)) {
3939 StringRef value = inputCharset->getValue();
3940 if (value != "UTF-8")
3941 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
3942 }
3943
Jeffrey Yasskin0ea22fd2010-06-08 04:56:20 +00003944 // -fcaret-diagnostics is default.
3945 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3946 options::OPT_fno_caret_diagnostics, true))
3947 CmdArgs.push_back("-fno-caret-diagnostics");
3948
Daniel Dunbar49138fc2009-04-19 21:09:34 +00003949 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump1eb44332009-09-09 15:08:12 +00003950 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar49138fc2009-04-19 21:09:34 +00003951 options::OPT_fno_diagnostics_fixit_info))
3952 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003953
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003954 // Enable -fdiagnostics-show-option by default.
Mike Stump1eb44332009-09-09 15:08:12 +00003955 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003956 options::OPT_fno_diagnostics_show_option))
3957 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar838be482009-11-04 06:24:57 +00003958
Chris Lattner6fbe8392010-05-04 21:55:25 +00003959 if (const Arg *A =
3960 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3961 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smith1d489cf2012-11-01 04:30:05 +00003962 CmdArgs.push_back(A->getValue());
Chris Lattner6fbe8392010-05-04 21:55:25 +00003963 }
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003964
Douglas Gregorc9471b02011-05-21 17:07:29 +00003965 if (const Arg *A =
3966 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3967 CmdArgs.push_back("-fdiagnostics-format");
Richard Smith1d489cf2012-11-01 04:30:05 +00003968 CmdArgs.push_back(A->getValue());
Douglas Gregorc9471b02011-05-21 17:07:29 +00003969 }
3970
Chandler Carruthabaca7a2011-03-27 01:50:55 +00003971 if (Arg *A = Args.getLastArg(
3972 options::OPT_fdiagnostics_show_note_include_stack,
3973 options::OPT_fno_diagnostics_show_note_include_stack)) {
3974 if (A->getOption().matches(
3975 options::OPT_fdiagnostics_show_note_include_stack))
3976 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3977 else
3978 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3979 }
3980
Daniel Dunbar838be482009-11-04 06:24:57 +00003981 // Color diagnostics are the default, unless the terminal doesn't support
3982 // them.
Nico Weber9753d462013-04-17 21:52:44 +00003983 // Support both clang's -f[no-]color-diagnostics and gcc's
3984 // -f[no-]diagnostics-colors[=never|always|auto].
3985 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003986 for (const auto &Arg : Args) {
3987 const Option &O = Arg->getOption();
Nico Weber9753d462013-04-17 21:52:44 +00003988 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3989 !O.matches(options::OPT_fdiagnostics_color) &&
3990 !O.matches(options::OPT_fno_color_diagnostics) &&
3991 !O.matches(options::OPT_fno_diagnostics_color) &&
3992 !O.matches(options::OPT_fdiagnostics_color_EQ))
3993 continue;
3994
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003995 Arg->claim();
Nico Weber9753d462013-04-17 21:52:44 +00003996 if (O.matches(options::OPT_fcolor_diagnostics) ||
3997 O.matches(options::OPT_fdiagnostics_color)) {
3998 ShowColors = Colors_On;
3999 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4000 O.matches(options::OPT_fno_diagnostics_color)) {
4001 ShowColors = Colors_Off;
4002 } else {
4003 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004004 StringRef value(Arg->getValue());
Nico Weber9753d462013-04-17 21:52:44 +00004005 if (value == "always")
4006 ShowColors = Colors_On;
4007 else if (value == "never")
4008 ShowColors = Colors_Off;
4009 else if (value == "auto")
4010 ShowColors = Colors_Auto;
4011 else
4012 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4013 << ("-fdiagnostics-color=" + value).str();
4014 }
4015 }
4016 if (ShowColors == Colors_On ||
4017 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar838be482009-11-04 06:24:57 +00004018 CmdArgs.push_back("-fcolor-diagnostics");
4019
Nico Rieck2956ef42013-09-11 00:38:02 +00004020 if (Args.hasArg(options::OPT_fansi_escape_codes))
4021 CmdArgs.push_back("-fansi-escape-codes");
4022
Daniel Dunbar75eb1d62009-06-08 21:13:54 +00004023 if (!Args.hasFlag(options::OPT_fshow_source_location,
4024 options::OPT_fno_show_source_location))
4025 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00004026
Douglas Gregorc9471b02011-05-21 17:07:29 +00004027 if (!Args.hasFlag(options::OPT_fshow_column,
4028 options::OPT_fno_show_column,
4029 true))
4030 CmdArgs.push_back("-fno-show-column");
4031
Douglas Gregora0068fc2010-07-09 17:35:33 +00004032 if (!Args.hasFlag(options::OPT_fspell_checking,
4033 options::OPT_fno_spell_checking))
4034 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00004035
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00004036
Chad Rosier15490fd2012-12-05 21:08:21 +00004037 // -fno-asm-blocks is default.
4038 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4039 false))
4040 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00004041
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00004042 // Enable vectorization per default according to the optimization level
4043 // selected. For optimization levels that want vectorization we use the alias
4044 // option to simplify the hasFlag logic.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004045 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00004046 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier31422792013-04-24 18:29:59 +00004047 options::OPT_fvectorize;
Chad Rosier31422792013-04-24 18:29:59 +00004048 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkelcf5691e2013-08-28 05:21:45 +00004049 options::OPT_fno_vectorize, EnableVec))
Chad Rosierc04d0932012-12-11 17:12:28 +00004050 CmdArgs.push_back("-vectorize-loops");
Chad Rosierc04d0932012-12-11 17:12:28 +00004051
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004052 // -fslp-vectorize is enabled based on the optimization level selected.
4053 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4054 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
4055 options::OPT_fslp_vectorize;
4056 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
4057 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem50ea9632013-04-15 04:57:18 +00004058 CmdArgs.push_back("-vectorize-slp");
Hal Finkel443c9992012-12-11 19:59:32 +00004059
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00004060 // -fno-slp-vectorize-aggressive is default.
4061 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00004062 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00004063 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00004064
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00004065 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4066 A->render(Args, CmdArgs);
4067
Daniel Dunbar7695fba2009-04-19 21:20:32 +00004068 // -fdollars-in-identifiers default varies depending on platform and
4069 // language; only pass if specified.
Mike Stump1eb44332009-09-09 15:08:12 +00004070 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbar7695fba2009-04-19 21:20:32 +00004071 options::OPT_fno_dollars_in_identifiers)) {
4072 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar8663b182009-12-16 20:10:18 +00004073 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00004074 else
Daniel Dunbar8663b182009-12-16 20:10:18 +00004075 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00004076 }
4077
Daniel Dunbare027a4b2009-05-22 19:02:20 +00004078 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4079 // practical purposes.
Mike Stump1eb44332009-09-09 15:08:12 +00004080 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbare027a4b2009-05-22 19:02:20 +00004081 options::OPT_fno_unit_at_a_time)) {
4082 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004083 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbare027a4b2009-05-22 19:02:20 +00004084 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00004085
Eli Friedman19bda3a2011-11-02 01:53:16 +00004086 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4087 options::OPT_fno_apple_pragma_pack, false))
4088 CmdArgs.push_back("-fapple-pragma-pack");
4089
Eli Benderskyf3ecf892013-07-24 18:20:14 +00004090 // le32-specific flags:
4091 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4092 // by default.
4093 if (getToolChain().getArch() == llvm::Triple::le32) {
4094 CmdArgs.push_back("-fno-math-builtin");
4095 }
4096
Daniel Dunbar2ba91572009-09-10 03:37:02 +00004097 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00004098 //
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00004099 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00004100#if 0
Bob Wilson905c45f2011-10-14 05:03:44 +00004101 if (getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00004102 (getToolChain().getArch() == llvm::Triple::arm ||
4103 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ba91572009-09-10 03:37:02 +00004104 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4105 CmdArgs.push_back("-fno-builtin-strcat");
4106 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4107 CmdArgs.push_back("-fno-builtin-strcpy");
4108 }
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00004109#endif
Daniel Dunbar2ba91572009-09-10 03:37:02 +00004110
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004111 // Enable rewrite includes if the user's asked for it or if we're generating
4112 // diagnostics.
4113 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4114 // nice to enable this when doing a crashdump for modules as well.
4115 if (Args.hasFlag(options::OPT_frewrite_includes,
4116 options::OPT_fno_rewrite_includes, false) ||
4117 (C.isForDiagnostics() && !HaveModules))
4118 CmdArgs.push_back("-frewrite-includes");
4119
Daniel Dunbard98750f2011-03-18 21:23:40 +00004120 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump1eb44332009-09-09 15:08:12 +00004121 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbard98750f2011-03-18 21:23:40 +00004122 options::OPT_traditional_cpp)) {
4123 if (isa<PreprocessJobAction>(JA))
4124 CmdArgs.push_back("-traditional-cpp");
Eric Christopher88b7cf02011-08-19 00:30:14 +00004125 else
Chris Lattner5f9e2722011-07-23 10:55:15 +00004126 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbard98750f2011-03-18 21:23:40 +00004127 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00004128
Daniel Dunbar1d460332009-03-18 10:01:51 +00004129 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnerd82df3a2009-04-12 01:56:53 +00004130 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremenek36f6e302011-11-11 00:07:43 +00004131
4132 // Handle serialized diagnostics.
4133 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4134 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smith1d489cf2012-11-01 04:30:05 +00004135 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremenek36f6e302011-11-11 00:07:43 +00004136 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00004137
Ted Kremenek127ff2e2012-09-13 06:41:18 +00004138 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4139 CmdArgs.push_back("-fretain-comments-from-system-headers");
4140
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00004141 // Forward -fcomment-block-commands to -cc1.
4142 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenko6fd7d302013-04-10 15:35:17 +00004143 // Forward -fparse-all-comments to -cc1.
4144 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00004145
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00004146 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4147 // parser.
Daniel Dunbar1d460332009-03-18 10:01:51 +00004148 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00004149 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4150 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00004151 (*it)->claim();
Daniel Dunbarfb36d212010-04-17 06:10:00 +00004152
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00004153 // We translate this by hand to the -cc1 argument, since nightly test uses
4154 // it and developers have been trained to spell it with -mllvm.
Richard Smith1d489cf2012-11-01 04:30:05 +00004155 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00004156 CmdArgs.push_back("-disable-llvm-optzns");
4157 else
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00004158 (*it)->render(Args, CmdArgs);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00004159 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00004160
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00004161 if (Output.getType() == types::TY_Dependencies) {
4162 // Handled with other dependency code.
Daniel Dunbar115a7922009-03-19 07:29:38 +00004163 } else if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004164 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00004165 CmdArgs.push_back(Output.getFilename());
4166 } else {
4167 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004168 }
4169
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004170 for (const auto &II : Inputs) {
Stephen Hines651f13c2014-04-23 16:59:28 -07004171 addDashXForInput(Args, II, CmdArgs);
4172
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004173 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00004174 CmdArgs.push_back(II.getFilename());
Daniel Dunbar1d460332009-03-18 10:01:51 +00004175 else
Daniel Dunbar115a7922009-03-19 07:29:38 +00004176 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00004177 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004178
Chris Lattnere6113de2009-11-03 19:50:27 +00004179 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4180
Daniel Dunbara001c1c2010-07-18 21:16:15 +00004181 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00004182
4183 // Optionally embed the -cc1 level arguments into the debug info, for build
4184 // analysis.
4185 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar6e900472010-06-04 18:47:06 +00004186 ArgStringList OriginalArgs;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004187 for (const auto &Arg : Args)
4188 Arg->render(Args, OriginalArgs);
Daniel Dunbarca0e0542010-08-24 16:47:49 +00004189
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00004190 SmallString<256> Flags;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00004191 Flags += Exec;
Daniel Dunbar6e900472010-06-04 18:47:06 +00004192 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00004193 Flags += " ";
Daniel Dunbar6e900472010-06-04 18:47:06 +00004194 Flags += OriginalArgs[i];
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00004195 }
4196 CmdArgs.push_back("-dwarf-debug-flags");
4197 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4198 }
4199
Eric Christopher80190392013-02-22 20:12:52 +00004200 // Add the split debug info name to the command lines here so we
4201 // can propagate it to the backend.
4202 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00004203 getToolChain().getTriple().isOSLinux() &&
Eric Christopherff971d72013-02-22 23:50:16 +00004204 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopher80190392013-02-22 20:12:52 +00004205 const char *SplitDwarfOut;
4206 if (SplitDwarf) {
4207 CmdArgs.push_back("-split-dwarf-file");
4208 SplitDwarfOut = SplitDebugName(Args, Inputs);
4209 CmdArgs.push_back(SplitDwarfOut);
4210 }
4211
4212 // Finally add the compile command to the compilation.
Stephen Hines651f13c2014-04-23 16:59:28 -07004213 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004214 Output.getType() == types::TY_Object &&
4215 (InputType == types::TY_C || InputType == types::TY_CXX)) {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004216 Command *CLCommand = getCLFallback()->GetCommand(C, JA, Output, Inputs,
4217 Args, LinkingOutput);
4218 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00004219 } else {
4220 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4221 }
4222
Daniel Dunbara880db02009-03-23 19:03:36 +00004223
Eric Christopherff971d72013-02-22 23:50:16 +00004224 // Handle the debug info splitting at object creation time if we're
4225 // creating an object.
Eric Christopher59320e72013-02-21 22:35:01 +00004226 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherff971d72013-02-22 23:50:16 +00004227 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopher80190392013-02-22 20:12:52 +00004228 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher59320e72013-02-21 22:35:01 +00004229
Roman Divackybe4c8702011-02-10 16:52:03 +00004230 if (Arg *A = Args.getLastArg(options::OPT_pg))
4231 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004232 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divackybe4c8702011-02-10 16:52:03 +00004233 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer20249a12010-10-21 03:16:25 +00004234
Daniel Dunbar68fb4692009-04-03 20:51:31 +00004235 // Claim some arguments which clang supports automatically.
4236
Daniel Dunbarf4046862010-04-15 06:18:42 +00004237 // -fpch-preprocess is used with gcc to add a special marker in the output to
4238 // include the PCH file. Clang's PTH solution is completely transparent, so we
4239 // do not need to deal with it at all.
Daniel Dunbar68fb4692009-04-03 20:51:31 +00004240 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004241
Daniel Dunbara880db02009-03-23 19:03:36 +00004242 // Claim some arguments which clang doesn't support, but we don't
4243 // care to warn the user about.
Daniel Dunbarcdd96862009-11-25 11:53:23 +00004244 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4245 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola035ff0c2011-02-28 23:29:45 +00004246
Rafael Espindola6155fbe2013-09-04 19:37:35 +00004247 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindola9c094fb2011-03-01 05:25:27 +00004248 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004249}
4250
John McCall260611a2012-06-20 06:18:46 +00004251/// Add options related to the Objective-C runtime/ABI.
4252///
4253/// Returns true if the runtime is non-fragile.
4254ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4255 ArgStringList &cmdArgs,
4256 RewriteKind rewriteKind) const {
4257 // Look for the controlling runtime option.
4258 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4259 options::OPT_fgnu_runtime,
4260 options::OPT_fobjc_runtime_EQ);
4261
4262 // Just forward -fobjc-runtime= to the frontend. This supercedes
4263 // options about fragility.
4264 if (runtimeArg &&
4265 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4266 ObjCRuntime runtime;
Richard Smith1d489cf2012-11-01 04:30:05 +00004267 StringRef value = runtimeArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00004268 if (runtime.tryParse(value)) {
4269 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4270 << value;
4271 }
4272
4273 runtimeArg->render(args, cmdArgs);
4274 return runtime;
4275 }
4276
4277 // Otherwise, we'll need the ABI "version". Version numbers are
4278 // slightly confusing for historical reasons:
4279 // 1 - Traditional "fragile" ABI
4280 // 2 - Non-fragile ABI, version 1
4281 // 3 - Non-fragile ABI, version 2
4282 unsigned objcABIVersion = 1;
4283 // If -fobjc-abi-version= is present, use that to set the version.
4284 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00004285 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00004286 if (value == "1")
4287 objcABIVersion = 1;
4288 else if (value == "2")
4289 objcABIVersion = 2;
4290 else if (value == "3")
4291 objcABIVersion = 3;
4292 else
4293 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4294 << value;
4295 } else {
4296 // Otherwise, determine if we are using the non-fragile ABI.
4297 bool nonFragileABIIsDefault =
4298 (rewriteKind == RK_NonFragile ||
4299 (rewriteKind == RK_None &&
4300 getToolChain().IsObjCNonFragileABIDefault()));
4301 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4302 options::OPT_fno_objc_nonfragile_abi,
4303 nonFragileABIIsDefault)) {
4304 // Determine the non-fragile ABI version to use.
4305#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4306 unsigned nonFragileABIVersion = 1;
4307#else
4308 unsigned nonFragileABIVersion = 2;
4309#endif
4310
4311 if (Arg *abiArg = args.getLastArg(
4312 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00004313 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00004314 if (value == "1")
4315 nonFragileABIVersion = 1;
4316 else if (value == "2")
4317 nonFragileABIVersion = 2;
4318 else
4319 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4320 << value;
4321 }
4322
4323 objcABIVersion = 1 + nonFragileABIVersion;
4324 } else {
4325 objcABIVersion = 1;
4326 }
4327 }
4328
4329 // We don't actually care about the ABI version other than whether
4330 // it's non-fragile.
4331 bool isNonFragile = objcABIVersion != 1;
4332
4333 // If we have no runtime argument, ask the toolchain for its default runtime.
4334 // However, the rewriter only really supports the Mac runtime, so assume that.
4335 ObjCRuntime runtime;
4336 if (!runtimeArg) {
4337 switch (rewriteKind) {
4338 case RK_None:
4339 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4340 break;
4341 case RK_Fragile:
4342 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4343 break;
4344 case RK_NonFragile:
4345 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4346 break;
4347 }
4348
4349 // -fnext-runtime
4350 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4351 // On Darwin, make this use the default behavior for the toolchain.
4352 if (getToolChain().getTriple().isOSDarwin()) {
4353 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4354
4355 // Otherwise, build for a generic macosx port.
4356 } else {
4357 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4358 }
4359
4360 // -fgnu-runtime
4361 } else {
4362 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnalla422cd02012-07-04 10:37:03 +00004363 // Legacy behaviour is to target the gnustep runtime if we are i
4364 // non-fragile mode or the GCC runtime in fragile mode.
4365 if (isNonFragile)
David Chisnall891dac72012-10-16 15:11:55 +00004366 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnalla422cd02012-07-04 10:37:03 +00004367 else
4368 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall260611a2012-06-20 06:18:46 +00004369 }
4370
4371 cmdArgs.push_back(args.MakeArgString(
4372 "-fobjc-runtime=" + runtime.getAsString()));
4373 return runtime;
4374}
4375
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004376static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4377 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4378 I += HaveDash;
4379 return !HaveDash;
4380}
4381
4382struct EHFlags {
4383 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4384 bool Synch;
4385 bool Asynch;
4386 bool NoExceptC;
4387};
4388
4389/// /EH controls whether to run destructor cleanups when exceptions are
4390/// thrown. There are three modifiers:
4391/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4392/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4393/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4394/// - c: Assume that extern "C" functions are implicitly noexcept. This
4395/// modifier is an optimization, so we ignore it for now.
4396/// The default is /EHs-c-, meaning cleanups are disabled.
4397static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4398 EHFlags EH;
4399 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4400 for (auto EHVal : EHArgs) {
4401 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4402 switch (EHVal[I]) {
4403 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4404 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4405 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4406 default: break;
4407 }
4408 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4409 break;
4410 }
4411 }
4412 return EH;
4413}
4414
Hans Wennborgb3574792013-08-08 00:17:41 +00004415void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4416 unsigned RTOptionID = options::OPT__SLASH_MT;
4417
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00004418 if (Args.hasArg(options::OPT__SLASH_LDd))
4419 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4420 // but defining _DEBUG is sticky.
4421 RTOptionID = options::OPT__SLASH_MTd;
4422
Hans Wennborg76da1782013-09-18 22:26:39 +00004423 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborgb3574792013-08-08 00:17:41 +00004424 RTOptionID = A->getOption().getID();
Hans Wennborg42ade492013-09-11 16:38:41 +00004425
Hans Wennborgb3574792013-08-08 00:17:41 +00004426 switch(RTOptionID) {
4427 case options::OPT__SLASH_MD:
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00004428 if (Args.hasArg(options::OPT__SLASH_LDd))
4429 CmdArgs.push_back("-D_DEBUG");
Hans Wennborgb3574792013-08-08 00:17:41 +00004430 CmdArgs.push_back("-D_MT");
4431 CmdArgs.push_back("-D_DLL");
4432 CmdArgs.push_back("--dependent-lib=msvcrt");
4433 break;
4434 case options::OPT__SLASH_MDd:
4435 CmdArgs.push_back("-D_DEBUG");
4436 CmdArgs.push_back("-D_MT");
4437 CmdArgs.push_back("-D_DLL");
4438 CmdArgs.push_back("--dependent-lib=msvcrtd");
4439 break;
4440 case options::OPT__SLASH_MT:
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00004441 if (Args.hasArg(options::OPT__SLASH_LDd))
4442 CmdArgs.push_back("-D_DEBUG");
Hans Wennborgb3574792013-08-08 00:17:41 +00004443 CmdArgs.push_back("-D_MT");
4444 CmdArgs.push_back("--dependent-lib=libcmt");
4445 break;
4446 case options::OPT__SLASH_MTd:
4447 CmdArgs.push_back("-D_DEBUG");
4448 CmdArgs.push_back("-D_MT");
4449 CmdArgs.push_back("--dependent-lib=libcmtd");
4450 break;
4451 default:
4452 llvm_unreachable("Unexpected option ID.");
4453 }
4454
Reid Klecknera32c5232013-08-08 19:33:10 +00004455 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4456 // users want. The /Za flag to cl.exe turns this off, but it's not
4457 // implemented in clang.
4458 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborgf0f98912013-08-08 19:54:30 +00004459
Hans Wennborg708002e2013-08-09 00:32:23 +00004460 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4461 A->render(Args, CmdArgs);
Hans Wennborgb6475522013-09-10 01:07:07 +00004462
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004463 // This controls whether or not we emit RTTI data for polymorphic types.
4464 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4465 /*default=*/false))
4466 CmdArgs.push_back("-fno-rtti-data");
Stephen Hines651f13c2014-04-23 16:59:28 -07004467
Stephen Hines651f13c2014-04-23 16:59:28 -07004468 const Driver &D = getToolChain().getDriver();
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004469 EHFlags EH = parseClangCLEHFlags(D, Args);
4470 // FIXME: Do something with NoExceptC.
4471 if (EH.Synch || EH.Asynch) {
4472 CmdArgs.push_back("-fexceptions");
4473 CmdArgs.push_back("-fcxx-exceptions");
4474 }
4475
4476 // /EP should expand to -E -P.
4477 if (Args.hasArg(options::OPT__SLASH_EP)) {
4478 CmdArgs.push_back("-E");
4479 CmdArgs.push_back("-P");
4480 }
4481
Stephen Hines651f13c2014-04-23 16:59:28 -07004482 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4483 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4484 if (MostGeneralArg && BestCaseArg)
4485 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4486 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4487
4488 if (MostGeneralArg) {
4489 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4490 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4491 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4492
4493 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4494 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4495 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4496 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4497 << FirstConflict->getAsString(Args)
4498 << SecondConflict->getAsString(Args);
4499
4500 if (SingleArg)
4501 CmdArgs.push_back("-fms-memptr-rep=single");
4502 else if (MultipleArg)
4503 CmdArgs.push_back("-fms-memptr-rep=multiple");
4504 else
4505 CmdArgs.push_back("-fms-memptr-rep=virtual");
4506 }
4507
4508 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4509 A->render(Args, CmdArgs);
4510
Hans Wennborgb6475522013-09-10 01:07:07 +00004511 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4512 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborg89e32742013-09-24 00:08:55 +00004513 if (Args.hasArg(options::OPT__SLASH_fallback))
4514 CmdArgs.push_back("msvc-fallback");
4515 else
4516 CmdArgs.push_back("msvc");
Hans Wennborgb6475522013-09-10 01:07:07 +00004517 }
Hans Wennborgb3574792013-08-08 00:17:41 +00004518}
4519
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004520visualstudio::Compile *Clang::getCLFallback() const {
4521 if (!CLFallback)
4522 CLFallback.reset(new visualstudio::Compile(getToolChain()));
4523 return CLFallback.get();
4524}
4525
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00004526void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00004527 const InputInfo &Output,
4528 const InputInfoList &Inputs,
4529 const ArgList &Args,
4530 const char *LinkingOutput) const {
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00004531 ArgStringList CmdArgs;
4532
4533 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4534 const InputInfo &Input = Inputs[0];
4535
Rafael Espindoladbe80d92010-11-17 22:13:25 +00004536 // Don't warn about "clang -w -c foo.s"
4537 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00004538 // and "clang -emit-llvm -c foo.s"
4539 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindoladbe80d92010-11-17 22:13:25 +00004540
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00004541 // Invoke ourselves in -cc1as mode.
4542 //
4543 // FIXME: Implement custom jobs for internal actions.
4544 CmdArgs.push_back("-cc1as");
4545
4546 // Add the "effective" target triple.
4547 CmdArgs.push_back("-triple");
Chad Rosier61ab80a2011-09-20 20:44:06 +00004548 std::string TripleStr =
4549 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00004550 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4551
4552 // Set the output mode, we currently only expect to be used as a real
4553 // assembler.
4554 CmdArgs.push_back("-filetype");
4555 CmdArgs.push_back("obj");
4556
Eric Christopher27e2b982012-12-18 00:31:10 +00004557 // Set the main file name, so that debug info works even with
4558 // -save-temps or preprocessed assembly.
4559 CmdArgs.push_back("-main-file-name");
4560 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4561
Rafael Espindolab330e402013-08-20 22:12:08 +00004562 // Add the target cpu
Rafael Espindola146dbbf2013-08-21 16:39:20 +00004563 const llvm::Triple &Triple = getToolChain().getTriple();
4564 std::string CPU = getCPUName(Args, Triple);
Rafael Espindolab330e402013-08-20 22:12:08 +00004565 if (!CPU.empty()) {
4566 CmdArgs.push_back("-target-cpu");
4567 CmdArgs.push_back(Args.MakeArgString(CPU));
4568 }
4569
Rafael Espindola146dbbf2013-08-21 16:39:20 +00004570 // Add the target features
4571 const Driver &D = getToolChain().getDriver();
Stephen Hines651f13c2014-04-23 16:59:28 -07004572 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbachfc308292012-02-10 20:37:10 +00004573
Daniel Dunbar7f6f8c82011-03-17 17:37:29 +00004574 // Ignore explicit -force_cpusubtype_ALL option.
4575 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00004576
Eric Christopher8f0a4032012-01-10 00:38:01 +00004577 // Determine the original source input.
4578 const Action *SourceAction = &JA;
4579 while (SourceAction->getKind() != Action::InputClass) {
4580 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4581 SourceAction = SourceAction->getInputs()[0];
4582 }
4583
Chandler Carruthd566df62012-12-17 21:40:04 +00004584 // Forward -g and handle debug info related flags, assuming we are dealing
4585 // with an actual assembly file.
Eric Christopher8f0a4032012-01-10 00:38:01 +00004586 if (SourceAction->getType() == types::TY_Asm ||
4587 SourceAction->getType() == types::TY_PP_Asm) {
4588 Args.ClaimAllArgs(options::OPT_g_Group);
4589 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4590 if (!A->getOption().matches(options::OPT_g0))
4591 CmdArgs.push_back("-g");
Chandler Carruthd566df62012-12-17 21:40:04 +00004592
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004593 if (Args.hasArg(options::OPT_gdwarf_2))
4594 CmdArgs.push_back("-gdwarf-2");
4595 if (Args.hasArg(options::OPT_gdwarf_3))
4596 CmdArgs.push_back("-gdwarf-3");
4597 if (Args.hasArg(options::OPT_gdwarf_4))
4598 CmdArgs.push_back("-gdwarf-4");
4599
Chandler Carruthd566df62012-12-17 21:40:04 +00004600 // Add the -fdebug-compilation-dir flag if needed.
4601 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderby02341792013-01-17 21:38:06 +00004602
4603 // Set the AT_producer to the clang version when using the integrated
4604 // assembler on assembly source files.
4605 CmdArgs.push_back("-dwarf-debug-producer");
4606 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopher8f0a4032012-01-10 00:38:01 +00004607 }
Kevin Enderby567003e2011-12-22 19:31:58 +00004608
4609 // Optionally embed the -cc1as level arguments into the debug info, for build
4610 // analysis.
4611 if (getToolChain().UseDwarfDebugFlags()) {
4612 ArgStringList OriginalArgs;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004613 for (const auto &Arg : Args)
4614 Arg->render(Args, OriginalArgs);
Kevin Enderby567003e2011-12-22 19:31:58 +00004615
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00004616 SmallString<256> Flags;
Kevin Enderby567003e2011-12-22 19:31:58 +00004617 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4618 Flags += Exec;
4619 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4620 Flags += " ";
4621 Flags += OriginalArgs[i];
4622 }
4623 CmdArgs.push_back("-dwarf-debug-flags");
4624 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4625 }
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00004626
4627 // FIXME: Add -static support, once we have it.
4628
Stephen Hines651f13c2014-04-23 16:59:28 -07004629 // Consume all the warning flags. Usually this would be handled more
4630 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
4631 // doesn't handle that so rather than warning about unused flags that are
4632 // actually used, we'll lie by omission instead.
4633 // FIXME: Stop lying and consume only the appropriate driver flags
4634 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
4635 ie = Args.filtered_end();
4636 it != ie; ++it)
4637 (*it)->claim();
4638
David Blaikie73168db2013-07-25 21:19:01 +00004639 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4640 getToolChain().getDriver());
4641
Daniel Dunbar3df23252011-04-29 17:53:18 +00004642 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00004643
4644 assert(Output.isFilename() && "Unexpected lipo output.");
4645 CmdArgs.push_back("-o");
4646 CmdArgs.push_back(Output.getFilename());
4647
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004648 assert(Input.isFilename() && "Invalid input.");
4649 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00004650
Daniel Dunbara001c1c2010-07-18 21:16:15 +00004651 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004652 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher708d72a2013-04-10 21:30:40 +00004653
4654 // Handle the debug info splitting at object creation time if we're
4655 // creating an object.
4656 // TODO: Currently only works on linux with newer objcopy.
4657 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00004658 getToolChain().getTriple().isOSLinux())
Eric Christopher708d72a2013-04-10 21:30:40 +00004659 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4660 SplitDebugName(Args, Inputs));
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00004661}
4662
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004663void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004664 const InputInfo &Output,
4665 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00004666 const ArgList &Args,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004667 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004668 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004669 ArgStringList CmdArgs;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004670
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004671 for (const auto &A : Args) {
Michael J. Spencer91e06da2012-10-19 22:37:06 +00004672 if (forwardToGCC(A->getOption())) {
Daniel Dunbar2dffe2d2010-08-03 16:14:14 +00004673 // Don't forward any -g arguments to assembly steps.
4674 if (isa<AssembleJobAction>(JA) &&
4675 A->getOption().matches(options::OPT_g_Group))
4676 continue;
4677
NAKAMURA Takumi3c6c8222013-08-19 11:51:51 +00004678 // Don't forward any -W arguments to assembly and link steps.
4679 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4680 A->getOption().matches(options::OPT_W_Group))
4681 continue;
4682
Daniel Dunbar75877192009-03-19 07:55:12 +00004683 // It is unfortunate that we have to claim here, as this means
4684 // we will basically never report anything interesting for
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004685 // platforms using a generic gcc, even if we are just using gcc
4686 // to get to the assembler.
Daniel Dunbar75877192009-03-19 07:55:12 +00004687 A->claim();
Daniel Dunbar1d460332009-03-18 10:01:51 +00004688 A->render(Args, CmdArgs);
Daniel Dunbar75877192009-03-19 07:55:12 +00004689 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004690 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004691
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004692 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004693
4694 // If using a driver driver, force the arch.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004695 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson905c45f2011-10-14 05:03:44 +00004696 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004697 CmdArgs.push_back("-arch");
Daniel Dunbarbf54a062009-04-01 20:33:11 +00004698
4699 // FIXME: Remove these special cases.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004700 if (Arch == llvm::Triple::ppc)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004701 CmdArgs.push_back("ppc");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004702 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004703 CmdArgs.push_back("ppc64");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00004704 else if (Arch == llvm::Triple::ppc64le)
4705 CmdArgs.push_back("ppc64le");
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004706 else
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004707 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004708 }
4709
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004710 // Try to force gcc to match the tool chain we want, if we recognize
4711 // the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004712 //
4713 // FIXME: The triple class should directly provide the information we want
4714 // here.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004715 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004716 CmdArgs.push_back("-m32");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00004717 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4718 Arch == llvm::Triple::ppc64le)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004719 CmdArgs.push_back("-m64");
4720
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004721 if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004722 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00004723 CmdArgs.push_back(Output.getFilename());
4724 } else {
4725 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004726 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar115a7922009-03-19 07:29:38 +00004727 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004728
Tony Linthicum96319392011-12-12 21:14:55 +00004729 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4730 options::OPT_Xassembler);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004731
4732 // Only pass -x if gcc will understand it; otherwise hope gcc
4733 // understands the suffix correctly. The main use case this would go
4734 // wrong in is for linker inputs if they happened to have an odd
4735 // suffix; really the only way to get this to happen is a command
4736 // like '-x foobar a.c' which will treat a.c like a linker input.
4737 //
4738 // FIXME: For the linker case specifically, can we safely convert
4739 // inputs into '-Wl,' options?
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004740 for (const auto &II : Inputs) {
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004741 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00004742 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4743 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004744 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004745 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004746 else if (II.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004747 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004748 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00004749 else if (II.getType() == types::TY_ModuleFile)
4750 D.Diag(diag::err_drv_no_module_support)
4751 << getToolChain().getTripleString();
Daniel Dunbara8304f62009-05-02 20:14:53 +00004752
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004753 if (types::canTypeBeUserSpecified(II.getType())) {
4754 CmdArgs.push_back("-x");
4755 CmdArgs.push_back(types::getTypeName(II.getType()));
4756 }
4757
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004758 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00004759 CmdArgs.push_back(II.getFilename());
Daniel Dunbar48f99942010-09-25 18:10:05 +00004760 else {
4761 const Arg &A = II.getInputArg();
4762
4763 // Reverse translate some rewritten options.
4764 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4765 CmdArgs.push_back("-lstdc++");
4766 continue;
4767 }
4768
Daniel Dunbar115a7922009-03-19 07:29:38 +00004769 // Don't render as input, we need gcc to do the translations.
Daniel Dunbar48f99942010-09-25 18:10:05 +00004770 A.render(Args, CmdArgs);
4771 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004772 }
4773
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00004774 const std::string customGCCName = D.getCCCGenericGCCName();
4775 const char *GCCName;
4776 if (!customGCCName.empty())
4777 GCCName = customGCCName.c_str();
Hans Wennborg76b86c22013-07-18 20:29:38 +00004778 else if (D.CCCIsCXX()) {
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00004779 GCCName = "g++";
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00004780 } else
4781 GCCName = "gcc";
4782
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004783 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004784 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004785 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004786}
4787
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004788void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4789 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004790 CmdArgs.push_back("-E");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004791}
4792
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004793void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4794 ArgStringList &CmdArgs) const {
Daniel Dunbar64952502010-02-11 03:16:21 +00004795 const Driver &D = getToolChain().getDriver();
4796
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004797 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00004798 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4799 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004800 CmdArgs.push_back("-c");
Daniel Dunbar64952502010-02-11 03:16:21 +00004801 else {
4802 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004803 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00004804 << getTypeName(JA.getType());
Michael J. Spencer20249a12010-10-21 03:16:25 +00004805
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004806 CmdArgs.push_back("-S");
Daniel Dunbar64952502010-02-11 03:16:21 +00004807 }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004808}
4809
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004810void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4811 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004812 // The types are (hopefully) good enough.
4813}
4814
Tony Linthicum96319392011-12-12 21:14:55 +00004815// Hexagon tools start.
4816void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4817 ArgStringList &CmdArgs) const {
4818
4819}
4820void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4821 const InputInfo &Output,
4822 const InputInfoList &Inputs,
4823 const ArgList &Args,
4824 const char *LinkingOutput) const {
4825
4826 const Driver &D = getToolChain().getDriver();
4827 ArgStringList CmdArgs;
4828
4829 std::string MarchString = "-march=";
Matthew Curtis67814152012-12-06 14:16:43 +00004830 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum96319392011-12-12 21:14:55 +00004831 CmdArgs.push_back(Args.MakeArgString(MarchString));
4832
4833 RenderExtraToolArgs(JA, CmdArgs);
4834
4835 if (Output.isFilename()) {
4836 CmdArgs.push_back("-o");
4837 CmdArgs.push_back(Output.getFilename());
4838 } else {
4839 assert(Output.isNothing() && "Unexpected output");
4840 CmdArgs.push_back("-fsyntax-only");
4841 }
4842
Matthew Curtis33c95f12012-12-06 17:49:03 +00004843 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4844 if (!SmallDataThreshold.empty())
4845 CmdArgs.push_back(
4846 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00004847
Matthew Curtis3d8d4222012-12-07 17:23:04 +00004848 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4849 options::OPT_Xassembler);
4850
Tony Linthicum96319392011-12-12 21:14:55 +00004851 // Only pass -x if gcc will understand it; otherwise hope gcc
4852 // understands the suffix correctly. The main use case this would go
4853 // wrong in is for linker inputs if they happened to have an odd
4854 // suffix; really the only way to get this to happen is a command
4855 // like '-x foobar a.c' which will treat a.c like a linker input.
4856 //
4857 // FIXME: For the linker case specifically, can we safely convert
4858 // inputs into '-Wl,' options?
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004859 for (const auto &II : Inputs) {
Tony Linthicum96319392011-12-12 21:14:55 +00004860 // Don't try to pass LLVM or AST inputs to a generic gcc.
4861 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4862 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4863 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4864 << getToolChain().getTripleString();
4865 else if (II.getType() == types::TY_AST)
4866 D.Diag(clang::diag::err_drv_no_ast_support)
4867 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00004868 else if (II.getType() == types::TY_ModuleFile)
4869 D.Diag(diag::err_drv_no_module_support)
4870 << getToolChain().getTripleString();
Tony Linthicum96319392011-12-12 21:14:55 +00004871
4872 if (II.isFilename())
4873 CmdArgs.push_back(II.getFilename());
4874 else
4875 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4876 II.getInputArg().render(Args, CmdArgs);
4877 }
4878
4879 const char *GCCName = "hexagon-as";
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004880 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Tony Linthicum96319392011-12-12 21:14:55 +00004881 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Tony Linthicum96319392011-12-12 21:14:55 +00004882}
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004883
Tony Linthicum96319392011-12-12 21:14:55 +00004884void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4885 ArgStringList &CmdArgs) const {
4886 // The types are (hopefully) good enough.
4887}
4888
4889void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4890 const InputInfo &Output,
4891 const InputInfoList &Inputs,
4892 const ArgList &Args,
4893 const char *LinkingOutput) const {
4894
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004895 const toolchains::Hexagon_TC& ToolChain =
4896 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4897 const Driver &D = ToolChain.getDriver();
4898
Tony Linthicum96319392011-12-12 21:14:55 +00004899 ArgStringList CmdArgs;
4900
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004901 //----------------------------------------------------------------------------
4902 //
4903 //----------------------------------------------------------------------------
4904 bool hasStaticArg = Args.hasArg(options::OPT_static);
4905 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtis33c95f12012-12-06 17:49:03 +00004906 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004907 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4908 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4909 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4910 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum96319392011-12-12 21:14:55 +00004911
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004912 //----------------------------------------------------------------------------
4913 // Silence warnings for various options
4914 //----------------------------------------------------------------------------
Tony Linthicum96319392011-12-12 21:14:55 +00004915
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004916 Args.ClaimAllArgs(options::OPT_g_Group);
4917 Args.ClaimAllArgs(options::OPT_emit_llvm);
4918 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4919 // handled somewhere else.
4920 Args.ClaimAllArgs(options::OPT_static_libgcc);
4921
4922 //----------------------------------------------------------------------------
4923 //
4924 //----------------------------------------------------------------------------
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004925 for (const auto &Opt : ToolChain.ExtraOpts)
4926 CmdArgs.push_back(Opt.c_str());
Tony Linthicum96319392011-12-12 21:14:55 +00004927
Matthew Curtis67814152012-12-06 14:16:43 +00004928 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4929 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop43115d42012-01-13 20:37:10 +00004930
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004931 if (buildingLib) {
4932 CmdArgs.push_back("-shared");
4933 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4934 // hexagon-gcc does
Tony Linthicum96319392011-12-12 21:14:55 +00004935 }
4936
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004937 if (hasStaticArg)
4938 CmdArgs.push_back("-static");
Tony Linthicum96319392011-12-12 21:14:55 +00004939
Matthew Curtis33c95f12012-12-06 17:49:03 +00004940 if (buildPIE && !buildingLib)
4941 CmdArgs.push_back("-pie");
4942
4943 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4944 if (!SmallDataThreshold.empty()) {
4945 CmdArgs.push_back(
4946 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4947 }
4948
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004949 //----------------------------------------------------------------------------
4950 //
4951 //----------------------------------------------------------------------------
4952 CmdArgs.push_back("-o");
4953 CmdArgs.push_back(Output.getFilename());
Tony Linthicum96319392011-12-12 21:14:55 +00004954
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004955 const std::string MarchSuffix = "/" + MarchString;
4956 const std::string G0Suffix = "/G0";
4957 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4958 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4959 + "/";
4960 const std::string StartFilesDir = RootDir
4961 + "hexagon/lib"
4962 + (buildingLib
4963 ? MarchG0Suffix : MarchSuffix);
4964
4965 //----------------------------------------------------------------------------
4966 // moslib
4967 //----------------------------------------------------------------------------
4968 std::vector<std::string> oslibs;
4969 bool hasStandalone= false;
4970
4971 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4972 ie = Args.filtered_end(); it != ie; ++it) {
4973 (*it)->claim();
4974 oslibs.push_back((*it)->getValue());
4975 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum96319392011-12-12 21:14:55 +00004976 }
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004977 if (oslibs.empty()) {
4978 oslibs.push_back("standalone");
4979 hasStandalone = true;
4980 }
Tony Linthicum96319392011-12-12 21:14:55 +00004981
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004982 //----------------------------------------------------------------------------
4983 // Start Files
4984 //----------------------------------------------------------------------------
4985 if (incStdLib && incStartFiles) {
4986
4987 if (!buildingLib) {
4988 if (hasStandalone) {
4989 CmdArgs.push_back(
4990 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4991 }
4992 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4993 }
4994 std::string initObj = useShared ? "/initS.o" : "/init.o";
4995 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4996 }
4997
4998 //----------------------------------------------------------------------------
4999 // Library Search Paths
5000 //----------------------------------------------------------------------------
5001 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005002 for (const auto &LibPath : LibPaths)
5003 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtis5fdf3502012-12-06 15:46:07 +00005004
5005 //----------------------------------------------------------------------------
5006 //
5007 //----------------------------------------------------------------------------
5008 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5009 Args.AddAllArgs(CmdArgs, options::OPT_e);
5010 Args.AddAllArgs(CmdArgs, options::OPT_s);
5011 Args.AddAllArgs(CmdArgs, options::OPT_t);
5012 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5013
5014 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5015
5016 //----------------------------------------------------------------------------
5017 // Libraries
5018 //----------------------------------------------------------------------------
5019 if (incStdLib && incDefLibs) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005020 if (D.CCCIsCXX()) {
Matthew Curtis5fdf3502012-12-06 15:46:07 +00005021 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5022 CmdArgs.push_back("-lm");
5023 }
5024
5025 CmdArgs.push_back("--start-group");
5026
5027 if (!buildingLib) {
5028 for(std::vector<std::string>::iterator i = oslibs.begin(),
5029 e = oslibs.end(); i != e; ++i)
5030 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5031 CmdArgs.push_back("-lc");
5032 }
5033 CmdArgs.push_back("-lgcc");
5034
5035 CmdArgs.push_back("--end-group");
5036 }
5037
5038 //----------------------------------------------------------------------------
5039 // End files
5040 //----------------------------------------------------------------------------
5041 if (incStdLib && incStartFiles) {
5042 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5043 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5044 }
5045
5046 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00005047 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum96319392011-12-12 21:14:55 +00005048}
5049// Hexagon tools end.
5050
Stephen Hines651f13c2014-04-23 16:59:28 -07005051const char *arm::getARMCPUForMArch(const ArgList &Args,
5052 const llvm::Triple &Triple) {
5053 StringRef MArch;
5054 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5055 // Otherwise, if we have -march= choose the base CPU for that arch.
5056 MArch = A->getValue();
5057 } else {
5058 // Otherwise, use the Arch from the triple.
5059 MArch = Triple.getArchName();
5060 }
5061
5062 // Handle -march=native.
5063 if (MArch == "native") {
5064 std::string CPU = llvm::sys::getHostCPUName();
5065 if (CPU != "generic") {
5066 // Translate the native cpu into the architecture. The switch below will
5067 // then chose the minimum cpu for that arch.
5068 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
5069 }
5070 }
5071
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005072 return driver::getARMCPUForMArch(MArch, Triple);
5073}
5074
5075/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
5076//
5077// FIXME: tblgen this.
5078const char *driver::getARMCPUForMArch(StringRef MArch,
5079 const llvm::Triple &Triple) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005080 switch (Triple.getOS()) {
5081 case llvm::Triple::NetBSD:
Stephen Hines651f13c2014-04-23 16:59:28 -07005082 if (MArch == "armv6")
5083 return "arm1176jzf-s";
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005084 break;
5085 case llvm::Triple::Win32:
5086 // FIXME: this is invalid for WindowsCE
5087 return "cortex-a9";
5088 default:
5089 break;
Stephen Hines651f13c2014-04-23 16:59:28 -07005090 }
5091
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005092 const char *result = nullptr;
5093 size_t offset = StringRef::npos;
5094 if (MArch.startswith("arm"))
5095 offset = 3;
5096 if (MArch.startswith("thumb"))
5097 offset = 5;
5098 if (offset != StringRef::npos && MArch.substr(offset, 2) == "eb")
5099 offset += 2;
5100 if (offset != StringRef::npos)
5101 result = llvm::StringSwitch<const char *>(MArch.substr(offset))
5102 .Cases("v2", "v2a", "arm2")
5103 .Case("v3", "arm6")
5104 .Case("v3m", "arm7m")
5105 .Case("v4", "strongarm")
5106 .Case("v4t", "arm7tdmi")
5107 .Cases("v5", "v5t", "arm10tdmi")
5108 .Cases("v5e", "v5te", "arm1022e")
5109 .Case("v5tej", "arm926ej-s")
5110 .Cases("v6", "v6k", "arm1136jf-s")
5111 .Case("v6j", "arm1136j-s")
5112 .Cases("v6z", "v6zk", "arm1176jzf-s")
5113 .Case("v6t2", "arm1156t2-s")
5114 .Cases("v6m", "v6-m", "cortex-m0")
5115 .Cases("v7", "v7a", "v7-a", "v7l", "v7-l", "cortex-a8")
5116 .Cases("v7s", "v7-s", "swift")
5117 .Cases("v7r", "v7-r", "cortex-r4")
5118 .Cases("v7m", "v7-m", "cortex-m3")
5119 .Cases("v7em", "v7e-m", "cortex-m4")
5120 .Cases("v8", "v8a", "v8-a", "cortex-a53")
5121 .Default(nullptr);
5122 else
5123 result = llvm::StringSwitch<const char *>(MArch)
5124 .Case("ep9312", "ep9312")
5125 .Case("iwmmxt", "iwmmxt")
5126 .Case("xscale", "xscale")
5127 .Default(nullptr);
Stephen Hines651f13c2014-04-23 16:59:28 -07005128
5129 if (result)
5130 return result;
5131
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005132 // If all else failed, return the most base CPU with thumb interworking
5133 // supported by LLVM.
5134 // FIXME: Should warn once that we're falling back.
Stephen Hines651f13c2014-04-23 16:59:28 -07005135 switch (Triple.getOS()) {
5136 case llvm::Triple::NetBSD:
5137 switch (Triple.getEnvironment()) {
5138 case llvm::Triple::GNUEABIHF:
5139 case llvm::Triple::GNUEABI:
5140 case llvm::Triple::EABIHF:
5141 case llvm::Triple::EABI:
5142 return "arm926ej-s";
5143 default:
5144 return "strongarm";
5145 }
5146 default:
5147 switch (Triple.getEnvironment()) {
5148 case llvm::Triple::EABIHF:
5149 case llvm::Triple::GNUEABIHF:
5150 return "arm1176jzf-s";
5151 default:
5152 return "arm7tdmi";
5153 }
5154 }
5155}
5156
5157/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
5158StringRef arm::getARMTargetCPU(const ArgList &Args,
5159 const llvm::Triple &Triple) {
5160 // FIXME: Warn on inconsistent use of -mcpu and -march.
5161 // If we have -mcpu=, use that.
5162 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5163 StringRef MCPU = A->getValue();
5164 // Handle -mcpu=native.
5165 if (MCPU == "native")
5166 return llvm::sys::getHostCPUName();
5167 else
5168 return MCPU;
5169 }
5170
5171 return getARMCPUForMArch(Args, Triple);
5172}
5173
5174/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5175/// CPU.
5176//
5177// FIXME: This is redundant with -mcpu, why does LLVM use this.
5178// FIXME: tblgen this, or kill it!
5179const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5180 return llvm::StringSwitch<const char *>(CPU)
5181 .Case("strongarm", "v4")
5182 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5183 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5184 .Cases("arm920", "arm920t", "arm922t", "v4t")
5185 .Cases("arm940t", "ep9312","v4t")
5186 .Cases("arm10tdmi", "arm1020t", "v5")
5187 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5188 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5189 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
5190 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
5191 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
5192 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
5193 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "v7")
5194 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
5195 .Cases("cortex-r4", "cortex-r5", "v7r")
5196 .Case("cortex-m0", "v6m")
5197 .Case("cortex-m3", "v7m")
5198 .Case("cortex-m4", "v7em")
5199 .Case("swift", "v7s")
5200 .Case("cyclone", "v8")
5201 .Cases("cortex-a53", "cortex-a57", "v8")
5202 .Default("");
5203}
5204
5205bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5206 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5207 return A && (A->getValue() == StringRef(Value));
5208}
5209
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005210bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
5211 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5212 return llvm::StringSwitch<bool>(NaNArg->getValue())
5213 .Case("2008", true)
5214 .Case("legacy", false)
5215 .Default(false);
5216
5217 // NaN2008 is the default for MIPS32r6/MIPS64r6.
5218 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5219 .Cases("mips32r6", "mips64r6", true)
5220 .Default(false);
5221
5222 return false;
5223}
5224
Stephen Hines651f13c2014-04-23 16:59:28 -07005225llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindolacfed8282012-10-31 18:51:07 +00005226 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5227 // archs which Darwin doesn't use.
5228
5229 // The matching this routine does is fairly pointless, since it is neither the
5230 // complete architecture list, nor a reasonable subset. The problem is that
5231 // historically the driver driver accepts this and also ties its -march=
5232 // handling to the architecture name, so we need to be careful before removing
5233 // support for it.
5234
5235 // This code must be kept in sync with Clang's Darwin specific argument
5236 // translation.
5237
5238 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5239 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5240 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5241 .Case("ppc64", llvm::Triple::ppc64)
5242 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5243 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5244 llvm::Triple::x86)
Jim Grosbach32ca73e2013-11-16 00:53:35 +00005245 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindolacfed8282012-10-31 18:51:07 +00005246 // This is derived from the driver driver.
Bob Wilson2503ebd2013-03-04 22:37:49 +00005247 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Stephen Hines651f13c2014-04-23 16:59:28 -07005248 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson2503ebd2013-03-04 22:37:49 +00005249 .Cases("armv7s", "xscale", llvm::Triple::arm)
Stephen Hines651f13c2014-04-23 16:59:28 -07005250 .Case("arm64", llvm::Triple::arm64)
Rafael Espindolacfed8282012-10-31 18:51:07 +00005251 .Case("r600", llvm::Triple::r600)
5252 .Case("nvptx", llvm::Triple::nvptx)
5253 .Case("nvptx64", llvm::Triple::nvptx64)
5254 .Case("amdil", llvm::Triple::amdil)
5255 .Case("spir", llvm::Triple::spir)
5256 .Default(llvm::Triple::UnknownArch);
5257}
Tony Linthicum96319392011-12-12 21:14:55 +00005258
Stephen Hines651f13c2014-04-23 16:59:28 -07005259void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5260 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5261 T.setArch(Arch);
5262
5263 if (Str == "x86_64h")
5264 T.setArchName(Str);
5265 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5266 T.setOS(llvm::Triple::UnknownOS);
5267 T.setObjectFormat(llvm::Triple::MachO);
5268 }
5269}
5270
Bob Wilson66b8a662012-11-23 06:14:39 +00005271const char *Clang::getBaseInputName(const ArgList &Args,
5272 const InputInfoList &Inputs) {
Michael J. Spencer472ccff2010-12-18 00:19:12 +00005273 return Args.MakeArgString(
5274 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00005275}
5276
Bob Wilson66b8a662012-11-23 06:14:39 +00005277const char *Clang::getBaseInputStem(const ArgList &Args,
5278 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00005279 const char *Str = getBaseInputName(Args, Inputs);
5280
Chris Lattner657ca662011-01-16 08:14:11 +00005281 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar88137642009-09-09 22:32:48 +00005282 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00005283
5284 return Str;
5285}
5286
Bob Wilson66b8a662012-11-23 06:14:39 +00005287const char *Clang::getDependencyFileName(const ArgList &Args,
5288 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00005289 // FIXME: Think about this more.
5290 std::string Res;
5291
5292 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00005293 std::string Str(OutputOpt->getValue());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00005294 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier30601782011-08-17 23:08:45 +00005295 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +00005296 Res = getBaseInputStem(Args, Inputs);
Chad Rosier30601782011-08-17 23:08:45 +00005297 }
Daniel Dunbar88137642009-09-09 22:32:48 +00005298 return Args.MakeArgString(Res + ".d");
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00005299}
5300
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00005301void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005302 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005303 const InputInfoList &Inputs,
5304 const ArgList &Args,
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00005305 const char *LinkingOutput) const {
5306 ArgStringList CmdArgs;
5307
5308 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5309 const InputInfo &Input = Inputs[0];
5310
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00005311 // Determine the original source input.
5312 const Action *SourceAction = &JA;
5313 while (SourceAction->getKind() != Action::InputClass) {
5314 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5315 SourceAction = SourceAction->getInputs()[0];
5316 }
5317
Stephen Hines651f13c2014-04-23 16:59:28 -07005318 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby6efcf6f2013-11-18 23:30:29 +00005319 // sure it runs its system assembler not clang's integrated assembler.
Stephen Hines651f13c2014-04-23 16:59:28 -07005320 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5321 // FIXME: at run-time detect assembler capabilities or rely on version
5322 // information forwarded by -target-assembler-version (future)
5323 if (Args.hasArg(options::OPT_fno_integrated_as)) {
5324 const llvm::Triple &T(getToolChain().getTriple());
5325 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
5326 CmdArgs.push_back("-Q");
5327 }
Kevin Enderby6efcf6f2013-11-18 23:30:29 +00005328
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00005329 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher88b7cf02011-08-19 00:30:14 +00005330 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00005331 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00005332 if (Args.hasArg(options::OPT_gstabs))
5333 CmdArgs.push_back("--gstabs");
5334 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson591ff152011-11-02 05:10:45 +00005335 CmdArgs.push_back("-g");
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00005336 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005337
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00005338 // Derived from asm spec.
Stephen Hines651f13c2014-04-23 16:59:28 -07005339 AddMachOArch(Args, CmdArgs);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00005340
Daniel Dunbarf5438e32010-07-22 01:47:22 +00005341 // Use -force_cpusubtype_ALL on x86 by default.
Eli Bendersky8f4269a2013-07-24 22:20:49 +00005342 if (getToolChain().getArch() == llvm::Triple::x86 ||
5343 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00005344 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5345 CmdArgs.push_back("-force_cpusubtype_ALL");
5346
Eli Bendersky8f4269a2013-07-24 22:20:49 +00005347 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00005348 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher59320e72013-02-21 22:35:01 +00005349 Args.hasArg(options::OPT_fapple_kext)) &&
Stephen Hines651f13c2014-04-23 16:59:28 -07005350 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00005351 Args.hasArg(options::OPT_static)))
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005352 CmdArgs.push_back("-static");
5353
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00005354 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5355 options::OPT_Xassembler);
5356
5357 assert(Output.isFilename() && "Unexpected lipo output.");
5358 CmdArgs.push_back("-o");
5359 CmdArgs.push_back(Output.getFilename());
5360
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005361 assert(Input.isFilename() && "Invalid input.");
5362 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00005363
5364 // asm_final spec is empty.
5365
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005366 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005367 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005368 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00005369}
Daniel Dunbarff7488d2009-03-20 00:52:38 +00005370
Stephen Hines651f13c2014-04-23 16:59:28 -07005371void darwin::MachOTool::anchor() {}
David Blaikie99ba9e32011-12-20 02:48:34 +00005372
Stephen Hines651f13c2014-04-23 16:59:28 -07005373void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5374 ArgStringList &CmdArgs) const {
5375 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbareeff4062010-01-22 02:04:58 +00005376
Daniel Dunbar02633b52009-03-26 16:23:12 +00005377 // Derived from darwin_arch spec.
5378 CmdArgs.push_back("-arch");
Daniel Dunbareeff4062010-01-22 02:04:58 +00005379 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar78dbd582009-09-04 18:35:31 +00005380
Daniel Dunbareeff4062010-01-22 02:04:58 +00005381 // FIXME: Is this needed anymore?
5382 if (ArchName == "arm")
Daniel Dunbar78dbd582009-09-04 18:35:31 +00005383 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbar02633b52009-03-26 16:23:12 +00005384}
5385
Bill Wendling6acf8b42012-10-02 18:02:50 +00005386bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5387 // We only need to generate a temp path for LTO if we aren't compiling object
5388 // files. When compiling source files, we run 'dsymutil' after linking. We
5389 // don't run 'dsymutil' when compiling object files.
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005390 for (const auto &Input : Inputs)
5391 if (Input.getType() != types::TY_Object)
Bill Wendling6acf8b42012-10-02 18:02:50 +00005392 return true;
5393
5394 return false;
5395}
5396
Daniel Dunbar748de8e2010-09-09 21:51:05 +00005397void darwin::Link::AddLinkArgs(Compilation &C,
5398 const ArgList &Args,
Bill Wendling6acf8b42012-10-02 18:02:50 +00005399 ArgStringList &CmdArgs,
5400 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00005401 const Driver &D = getToolChain().getDriver();
Stephen Hines651f13c2014-04-23 16:59:28 -07005402 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbar02633b52009-03-26 16:23:12 +00005403
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00005404 unsigned Version[3] = { 0, 0, 0 };
5405 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5406 bool HadExtra;
Richard Smith1d489cf2012-11-01 04:30:05 +00005407 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00005408 Version[1], Version[2], HadExtra) ||
5409 HadExtra)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005410 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00005411 << A->getAsString(Args);
5412 }
5413
Stephen Hines651f13c2014-04-23 16:59:28 -07005414 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00005415 // the user.
Stephen Hines651f13c2014-04-23 16:59:28 -07005416 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5417 CmdArgs.push_back("-demangle");
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00005418
Bob Wilsonbd77c592013-08-02 22:25:34 +00005419 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5420 CmdArgs.push_back("-export_dynamic");
5421
Bill Wendlingc35f9082012-11-16 23:03:00 +00005422 // If we are using LTO, then automatically create a temporary file path for
5423 // the linker to use, so that it's lifetime will extend past a possible
5424 // dsymutil step.
5425 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5426 const char *TmpPath = C.getArgs().MakeArgString(
5427 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5428 C.addTempFile(TmpPath);
5429 CmdArgs.push_back("-object_path_lto");
5430 CmdArgs.push_back(TmpPath);
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00005431 }
5432
Daniel Dunbar02633b52009-03-26 16:23:12 +00005433 // Derived from the "link" spec.
5434 Args.AddAllArgs(CmdArgs, options::OPT_static);
5435 if (!Args.hasArg(options::OPT_static))
5436 CmdArgs.push_back("-dynamic");
5437 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5438 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5439 // here. How do we wish to handle such things?
5440 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005441
Daniel Dunbar02633b52009-03-26 16:23:12 +00005442 if (!Args.hasArg(options::OPT_dynamiclib)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07005443 AddMachOArch(Args, CmdArgs);
Daniel Dunbara6d38492010-01-22 02:04:52 +00005444 // FIXME: Why do this only on this path?
Daniel Dunbar8917dd42010-01-22 03:37:33 +00005445 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbar02633b52009-03-26 16:23:12 +00005446
5447 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5448 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5449 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5450
5451 Arg *A;
5452 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5453 (A = Args.getLastArg(options::OPT_current__version)) ||
5454 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00005455 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00005456 << A->getAsString(Args) << "-dynamiclib";
5457
5458 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5459 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5460 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5461 } else {
5462 CmdArgs.push_back("-dylib");
5463
5464 Arg *A;
5465 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5466 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5467 (A = Args.getLastArg(options::OPT_client__name)) ||
5468 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5469 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5470 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00005471 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00005472 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005473
Daniel Dunbar02633b52009-03-26 16:23:12 +00005474 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5475 "-dylib_compatibility_version");
5476 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5477 "-dylib_current_version");
5478
Stephen Hines651f13c2014-04-23 16:59:28 -07005479 AddMachOArch(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00005480
5481 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5482 "-dylib_install_name");
5483 }
5484
5485 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5486 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5487 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Stephen Hines651f13c2014-04-23 16:59:28 -07005488 if (MachOTC.isTargetIOSBased())
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00005489 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbar02633b52009-03-26 16:23:12 +00005490 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5491 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5492 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5493 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5494 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5495 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar99ca47b2011-06-28 20:16:02 +00005496 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbar02633b52009-03-26 16:23:12 +00005497 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5498 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5499 Args.AddAllArgs(CmdArgs, options::OPT_init);
5500
Daniel Dunbarce911f52011-04-28 21:23:41 +00005501 // Add the deployment target.
Stephen Hines651f13c2014-04-23 16:59:28 -07005502 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarce911f52011-04-28 21:23:41 +00005503
Daniel Dunbar02633b52009-03-26 16:23:12 +00005504 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5505 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5506 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5507 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5508 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005509
Daniel Dunbar47e879d2010-07-13 23:31:40 +00005510 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5511 options::OPT_fno_pie,
5512 options::OPT_fno_PIE)) {
5513 if (A->getOption().matches(options::OPT_fpie) ||
5514 A->getOption().matches(options::OPT_fPIE))
5515 CmdArgs.push_back("-pie");
5516 else
5517 CmdArgs.push_back("-no_pie");
5518 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00005519
5520 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5521 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5522 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5523 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5524 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5525 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5526 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5527 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5528 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5529 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5530 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5531 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5532 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5533 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5534 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5535 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00005536
Daniel Dunbarcc957192011-05-02 21:03:47 +00005537 // Give --sysroot= preference, over the Apple specific behavior to also use
5538 // --isysroot as the syslibroot.
Sebastian Pop4762a2d2012-04-16 04:16:43 +00005539 StringRef sysroot = C.getSysRoot();
5540 if (sysroot != "") {
Daniel Dunbarcc957192011-05-02 21:03:47 +00005541 CmdArgs.push_back("-syslibroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +00005542 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbarcc957192011-05-02 21:03:47 +00005543 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5544 CmdArgs.push_back("-syslibroot");
Richard Smith1d489cf2012-11-01 04:30:05 +00005545 CmdArgs.push_back(A->getValue());
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00005546 }
5547
Daniel Dunbar02633b52009-03-26 16:23:12 +00005548 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5549 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5550 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5551 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5552 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00005553 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbar02633b52009-03-26 16:23:12 +00005554 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5555 Args.AddAllArgs(CmdArgs, options::OPT_y);
5556 Args.AddLastArg(CmdArgs, options::OPT_w);
5557 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5558 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5559 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5560 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5561 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5562 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5563 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5564 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5565 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5566 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5567 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5568 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5569}
5570
Stephen Hines651f13c2014-04-23 16:59:28 -07005571enum LibOpenMP {
5572 LibUnknown,
5573 LibGOMP,
5574 LibIOMP5
5575};
5576
Daniel Dunbar02633b52009-03-26 16:23:12 +00005577void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005578 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005579 const InputInfoList &Inputs,
5580 const ArgList &Args,
Daniel Dunbar02633b52009-03-26 16:23:12 +00005581 const char *LinkingOutput) const {
5582 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbare0be8b12009-09-08 16:39:16 +00005583
Daniel Dunbar02633b52009-03-26 16:23:12 +00005584 // The logic here is derived from gcc's behavior; most of which
5585 // comes from specs (starting with link_command). Consult gcc for
5586 // more information.
Daniel Dunbar02633b52009-03-26 16:23:12 +00005587 ArgStringList CmdArgs;
5588
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00005589 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5590 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5591 options::OPT_ccc_arcmt_migrate)) {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005592 for (const auto &Arg : Args)
5593 Arg->claim();
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00005594 const char *Exec =
5595 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5596 CmdArgs.push_back(Output.getFilename());
5597 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5598 return;
5599 }
5600
Daniel Dunbar02633b52009-03-26 16:23:12 +00005601 // I'm not sure why this particular decomposition exists in gcc, but
5602 // we follow suite for ease of comparison.
Bill Wendling6acf8b42012-10-02 18:02:50 +00005603 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00005604
Daniel Dunbar02633b52009-03-26 16:23:12 +00005605 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5606 Args.AddAllArgs(CmdArgs, options::OPT_s);
5607 Args.AddAllArgs(CmdArgs, options::OPT_t);
5608 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5609 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbar02633b52009-03-26 16:23:12 +00005610 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbar02633b52009-03-26 16:23:12 +00005611 Args.AddAllArgs(CmdArgs, options::OPT_r);
5612
Daniel Dunbar270073c2010-10-18 22:08:36 +00005613 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5614 // members of static archive libraries which implement Objective-C classes or
5615 // categories.
5616 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5617 CmdArgs.push_back("-ObjC");
Michael J. Spencer20249a12010-10-21 03:16:25 +00005618
Daniel Dunbar02633b52009-03-26 16:23:12 +00005619 CmdArgs.push_back("-o");
5620 CmdArgs.push_back(Output.getFilename());
5621
Chad Rosier18937312012-05-16 23:45:12 +00005622 if (!Args.hasArg(options::OPT_nostdlib) &&
Stephen Hines651f13c2014-04-23 16:59:28 -07005623 !Args.hasArg(options::OPT_nostartfiles))
5624 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00005625
5626 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005627
Stephen Hines651f13c2014-04-23 16:59:28 -07005628 LibOpenMP UsedOpenMPLib = LibUnknown;
5629 if (Args.hasArg(options::OPT_fopenmp)) {
5630 UsedOpenMPLib = LibGOMP;
5631 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
5632 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
5633 .Case("libgomp", LibGOMP)
5634 .Case("libiomp5", LibIOMP5)
5635 .Default(LibUnknown);
5636 if (UsedOpenMPLib == LibUnknown)
5637 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
5638 << A->getOption().getName() << A->getValue();
5639 }
5640 switch (UsedOpenMPLib) {
5641 case LibGOMP:
Daniel Dunbar02633b52009-03-26 16:23:12 +00005642 CmdArgs.push_back("-lgomp");
Stephen Hines651f13c2014-04-23 16:59:28 -07005643 break;
5644 case LibIOMP5:
5645 CmdArgs.push_back("-liomp5");
5646 break;
5647 case LibUnknown:
5648 break;
5649 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00005650
Douglas Gregor04e326b2012-05-15 21:00:27 +00005651 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5652
Bob Wilson63d9f3c2012-05-15 18:57:39 +00005653 if (isObjCRuntimeLinked(Args) &&
5654 !Args.hasArg(options::OPT_nostdlib) &&
5655 !Args.hasArg(options::OPT_nodefaultlibs)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07005656 // We use arclite library for both ARC and subscripting support.
5657 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
5658
Bob Wilson0b1c7152012-04-21 00:21:42 +00005659 CmdArgs.push_back("-framework");
5660 CmdArgs.push_back("Foundation");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00005661 // Link libobj.
5662 CmdArgs.push_back("-lobjc");
John McCall9f084a32011-07-06 00:26:06 +00005663 }
John McCallf85e1932011-06-15 23:02:42 +00005664
Daniel Dunbar02633b52009-03-26 16:23:12 +00005665 if (LinkingOutput) {
5666 CmdArgs.push_back("-arch_multiple");
5667 CmdArgs.push_back("-final_output");
5668 CmdArgs.push_back(LinkingOutput);
5669 }
5670
Daniel Dunbar02633b52009-03-26 16:23:12 +00005671 if (Args.hasArg(options::OPT_fnested_functions))
5672 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005673
Daniel Dunbar02633b52009-03-26 16:23:12 +00005674 if (!Args.hasArg(options::OPT_nostdlib) &&
5675 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005676 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar132e35d2010-09-17 01:20:05 +00005677 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbaredfa02b2009-04-08 06:06:21 +00005678
Daniel Dunbar02633b52009-03-26 16:23:12 +00005679 // link_ssp spec is empty.
5680
Daniel Dunbar6cd41542009-09-18 08:15:03 +00005681 // Let the tool chain choose which runtime library to link.
Stephen Hines651f13c2014-04-23 16:59:28 -07005682 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00005683 }
5684
Chad Rosier18937312012-05-16 23:45:12 +00005685 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00005686 !Args.hasArg(options::OPT_nostartfiles)) {
5687 // endfile_spec is empty.
5688 }
5689
5690 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5691 Args.AddAllArgs(CmdArgs, options::OPT_F);
5692
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005693 const char *Exec =
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005694 Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005695 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar02633b52009-03-26 16:23:12 +00005696}
5697
Daniel Dunbarff7488d2009-03-20 00:52:38 +00005698void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005699 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005700 const InputInfoList &Inputs,
5701 const ArgList &Args,
Daniel Dunbarff7488d2009-03-20 00:52:38 +00005702 const char *LinkingOutput) const {
5703 ArgStringList CmdArgs;
5704
5705 CmdArgs.push_back("-create");
5706 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbara428df82009-03-24 00:24:37 +00005707
5708 CmdArgs.push_back("-output");
Daniel Dunbarff7488d2009-03-20 00:52:38 +00005709 CmdArgs.push_back(Output.getFilename());
Daniel Dunbara428df82009-03-24 00:24:37 +00005710
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005711 for (const auto &II : Inputs) {
Daniel Dunbarff7488d2009-03-20 00:52:38 +00005712 assert(II.isFilename() && "Unexpected lipo input.");
5713 CmdArgs.push_back(II.getFilename());
5714 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005715
5716 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005717 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarff7488d2009-03-20 00:52:38 +00005718}
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005719
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00005720void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005721 const InputInfo &Output,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00005722 const InputInfoList &Inputs,
5723 const ArgList &Args,
5724 const char *LinkingOutput) const {
5725 ArgStringList CmdArgs;
5726
Daniel Dunbar03e92302011-05-09 17:23:16 +00005727 CmdArgs.push_back("-o");
5728 CmdArgs.push_back(Output.getFilename());
5729
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00005730 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5731 const InputInfo &Input = Inputs[0];
5732 assert(Input.isFilename() && "Unexpected dsymutil input.");
5733 CmdArgs.push_back(Input.getFilename());
5734
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00005735 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005736 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005737 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00005738}
5739
Eric Christopherf8571862011-08-23 17:56:55 +00005740void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher27e2b982012-12-18 00:31:10 +00005741 const InputInfo &Output,
5742 const InputInfoList &Inputs,
5743 const ArgList &Args,
5744 const char *LinkingOutput) const {
Eric Christopherf8571862011-08-23 17:56:55 +00005745 ArgStringList CmdArgs;
5746 CmdArgs.push_back("--verify");
Eric Christopher1c79dc42012-02-06 19:13:09 +00005747 CmdArgs.push_back("--debug-info");
5748 CmdArgs.push_back("--eh-frame");
Eric Christopherb822f722012-02-06 19:43:51 +00005749 CmdArgs.push_back("--quiet");
Eric Christopherf8571862011-08-23 17:56:55 +00005750
5751 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5752 const InputInfo &Input = Inputs[0];
5753 assert(Input.isFilename() && "Unexpected verify input");
5754
5755 // Grabbing the output of the earlier dsymutil run.
5756 CmdArgs.push_back(Input.getFilename());
5757
5758 const char *Exec =
5759 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5760 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5761}
5762
David Chisnall31c46902012-02-15 13:39:01 +00005763void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5764 const InputInfo &Output,
5765 const InputInfoList &Inputs,
5766 const ArgList &Args,
5767 const char *LinkingOutput) const {
5768 ArgStringList CmdArgs;
5769
5770 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5771 options::OPT_Xassembler);
5772
5773 CmdArgs.push_back("-o");
5774 CmdArgs.push_back(Output.getFilename());
5775
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005776 for (const auto &II : Inputs)
David Chisnall31c46902012-02-15 13:39:01 +00005777 CmdArgs.push_back(II.getFilename());
David Chisnall31c46902012-02-15 13:39:01 +00005778
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005779 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Chisnall31c46902012-02-15 13:39:01 +00005780 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5781}
5782
David Chisnall31c46902012-02-15 13:39:01 +00005783void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5784 const InputInfo &Output,
5785 const InputInfoList &Inputs,
5786 const ArgList &Args,
5787 const char *LinkingOutput) const {
5788 // FIXME: Find a real GCC, don't hard-code versions here
5789 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5790 const llvm::Triple &T = getToolChain().getTriple();
5791 std::string LibPath = "/usr/lib/";
5792 llvm::Triple::ArchType Arch = T.getArch();
5793 switch (Arch) {
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00005794 case llvm::Triple::x86:
5795 GCCLibPath +=
5796 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5797 break;
5798 case llvm::Triple::x86_64:
5799 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5800 GCCLibPath += "/4.5.2/amd64/";
5801 LibPath += "amd64/";
5802 break;
5803 default:
5804 llvm_unreachable("Unsupported architecture");
David Chisnall31c46902012-02-15 13:39:01 +00005805 }
5806
5807 ArgStringList CmdArgs;
5808
David Chisnall41d476d2012-02-29 15:06:12 +00005809 // Demangle C++ names in errors
5810 CmdArgs.push_back("-C");
5811
David Chisnall31c46902012-02-15 13:39:01 +00005812 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5813 (!Args.hasArg(options::OPT_shared))) {
5814 CmdArgs.push_back("-e");
5815 CmdArgs.push_back("_start");
5816 }
5817
5818 if (Args.hasArg(options::OPT_static)) {
5819 CmdArgs.push_back("-Bstatic");
5820 CmdArgs.push_back("-dn");
5821 } else {
5822 CmdArgs.push_back("-Bdynamic");
5823 if (Args.hasArg(options::OPT_shared)) {
5824 CmdArgs.push_back("-shared");
5825 } else {
5826 CmdArgs.push_back("--dynamic-linker");
5827 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5828 }
5829 }
5830
5831 if (Output.isFilename()) {
5832 CmdArgs.push_back("-o");
5833 CmdArgs.push_back(Output.getFilename());
5834 } else {
5835 assert(Output.isNothing() && "Invalid output.");
5836 }
5837
5838 if (!Args.hasArg(options::OPT_nostdlib) &&
5839 !Args.hasArg(options::OPT_nostartfiles)) {
5840 if (!Args.hasArg(options::OPT_shared)) {
5841 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5842 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00005843 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005844 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5845 } else {
5846 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00005847 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5848 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005849 }
Hans Wennborg76b86c22013-07-18 20:29:38 +00005850 if (getToolChain().getDriver().CCCIsCXX())
David Chisnalle6dd6832012-03-13 14:14:54 +00005851 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005852 }
5853
5854 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5855
5856 Args.AddAllArgs(CmdArgs, options::OPT_L);
5857 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5858 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall165329c2012-02-28 17:10:04 +00005859 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnall31c46902012-02-15 13:39:01 +00005860
5861 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5862
5863 if (!Args.hasArg(options::OPT_nostdlib) &&
5864 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005865 if (getToolChain().getDriver().CCCIsCXX())
David Chisnalle58e6f92012-04-10 11:49:50 +00005866 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnallb6229592012-02-15 18:24:31 +00005867 CmdArgs.push_back("-lgcc_s");
David Chisnall165329c2012-02-28 17:10:04 +00005868 if (!Args.hasArg(options::OPT_shared)) {
5869 CmdArgs.push_back("-lgcc");
David Chisnall31c46902012-02-15 13:39:01 +00005870 CmdArgs.push_back("-lc");
David Chisnall7dbefe12012-02-28 20:06:45 +00005871 CmdArgs.push_back("-lm");
David Chisnall165329c2012-02-28 17:10:04 +00005872 }
David Chisnall31c46902012-02-15 13:39:01 +00005873 }
5874
5875 if (!Args.hasArg(options::OPT_nostdlib) &&
5876 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall165329c2012-02-28 17:10:04 +00005877 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005878 }
David Chisnalld1ac03e2012-02-16 16:00:47 +00005879 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005880
Stephen Hines651f13c2014-04-23 16:59:28 -07005881 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnall31c46902012-02-15 13:39:01 +00005882
5883 const char *Exec =
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005884 Args.MakeArgString(getToolChain().GetLinkerPath());
David Chisnall31c46902012-02-15 13:39:01 +00005885 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5886}
5887
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005888void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005889 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00005890 const InputInfoList &Inputs,
5891 const ArgList &Args,
5892 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005893 ArgStringList CmdArgs;
5894
5895 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5896 options::OPT_Xassembler);
5897
5898 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005899 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005900
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005901 for (const auto &II : Inputs)
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005902 CmdArgs.push_back(II.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005903
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005904 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005905 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005906}
5907
5908void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005909 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00005910 const InputInfoList &Inputs,
5911 const ArgList &Args,
5912 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005913 ArgStringList CmdArgs;
5914
5915 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00005916 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005917 CmdArgs.push_back("-e");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005918 CmdArgs.push_back("_start");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005919 }
5920
5921 if (Args.hasArg(options::OPT_static)) {
5922 CmdArgs.push_back("-Bstatic");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005923 CmdArgs.push_back("-dn");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005924 } else {
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005925// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005926 CmdArgs.push_back("-Bdynamic");
5927 if (Args.hasArg(options::OPT_shared)) {
5928 CmdArgs.push_back("-shared");
5929 } else {
Edward O'Callaghan3cecc192009-10-16 19:44:18 +00005930 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005931 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5932 }
5933 }
5934
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005935 if (Output.isFilename()) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005936 CmdArgs.push_back("-o");
5937 CmdArgs.push_back(Output.getFilename());
5938 } else {
5939 assert(Output.isNothing() && "Invalid output.");
5940 }
5941
5942 if (!Args.hasArg(options::OPT_nostdlib) &&
5943 !Args.hasArg(options::OPT_nostartfiles)) {
5944 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00005945 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005946 getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005947 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005948 getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005949 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005950 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005951 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005952 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005953 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005954 }
Chris Lattner38e317d2010-07-07 16:01:42 +00005955 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005956 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005957 }
5958
Daniel Dunbar294691e2009-11-04 06:24:38 +00005959 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5960 + getToolChain().getTripleString()
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00005961 + "/4.2.4"));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005962
5963 Args.AddAllArgs(CmdArgs, options::OPT_L);
5964 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5965 Args.AddAllArgs(CmdArgs, options::OPT_e);
5966
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005967 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005968
5969 if (!Args.hasArg(options::OPT_nostdlib) &&
5970 !Args.hasArg(options::OPT_nodefaultlibs)) {
5971 // FIXME: For some reason GCC passes -lgcc before adding
5972 // the default system libraries. Just mimic this for now.
5973 CmdArgs.push_back("-lgcc");
5974
5975 if (Args.hasArg(options::OPT_pthread))
5976 CmdArgs.push_back("-pthread");
5977 if (!Args.hasArg(options::OPT_shared))
5978 CmdArgs.push_back("-lc");
5979 CmdArgs.push_back("-lgcc");
5980 }
5981
5982 if (!Args.hasArg(options::OPT_nostdlib) &&
5983 !Args.hasArg(options::OPT_nostartfiles)) {
5984 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005985 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005986 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005987 }
5988
Stephen Hines651f13c2014-04-23 16:59:28 -07005989 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005990
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005991 const char *Exec =
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005992 Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005993 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005994}
5995
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005996void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005997 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005998 const InputInfoList &Inputs,
5999 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00006000 const char *LinkingOutput) const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006001 ArgStringList CmdArgs;
Stephen Hines651f13c2014-04-23 16:59:28 -07006002 bool NeedsKPIC = false;
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006003
Stephen Hines651f13c2014-04-23 16:59:28 -07006004 switch (getToolChain().getArch()) {
6005 case llvm::Triple::x86:
6006 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6007 // instruct as in the base system to assemble 32-bit code.
Bill Wendlingac66cb82013-12-08 00:21:01 +00006008 CmdArgs.push_back("--32");
Stephen Hines651f13c2014-04-23 16:59:28 -07006009 break;
6010
6011 case llvm::Triple::ppc:
Bill Wendlingac66cb82013-12-08 00:21:01 +00006012 CmdArgs.push_back("-mppc");
6013 CmdArgs.push_back("-many");
Stephen Hines651f13c2014-04-23 16:59:28 -07006014 break;
6015
6016 case llvm::Triple::sparc:
6017 CmdArgs.push_back("-32");
6018 NeedsKPIC = true;
6019 break;
6020
6021 case llvm::Triple::sparcv9:
6022 CmdArgs.push_back("-64");
6023 CmdArgs.push_back("-Av9a");
6024 NeedsKPIC = true;
6025 break;
6026
6027 case llvm::Triple::mips64:
6028 case llvm::Triple::mips64el: {
Bill Wendlingac66cb82013-12-08 00:21:01 +00006029 StringRef CPUName;
6030 StringRef ABIName;
6031 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6032
6033 CmdArgs.push_back("-mabi");
6034 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6035
6036 if (getToolChain().getArch() == llvm::Triple::mips64)
6037 CmdArgs.push_back("-EB");
6038 else
6039 CmdArgs.push_back("-EL");
6040
Stephen Hines651f13c2014-04-23 16:59:28 -07006041 NeedsKPIC = true;
6042 break;
Bill Wendlingac66cb82013-12-08 00:21:01 +00006043 }
6044
Stephen Hines651f13c2014-04-23 16:59:28 -07006045 default:
6046 break;
6047 }
6048
6049 if (NeedsKPIC)
6050 addAssemblerKPIC(Args, CmdArgs);
6051
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006052 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6053 options::OPT_Xassembler);
6054
6055 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006056 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006057
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006058 for (const auto &II : Inputs)
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006059 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006060
6061 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006062 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006063 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006064}
6065
6066void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006067 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006068 const InputInfoList &Inputs,
6069 const ArgList &Args,
6070 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00006071 const Driver &D = getToolChain().getDriver();
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006072 ArgStringList CmdArgs;
6073
Rafael Espindola6cc2a682012-12-31 22:41:36 +00006074 // Silence warning for "clang -g foo.o -o foo"
6075 Args.ClaimAllArgs(options::OPT_g_Group);
6076 // and "clang -emit-llvm foo.o -o foo"
6077 Args.ClaimAllArgs(options::OPT_emit_llvm);
6078 // and for "clang -w foo.o -o foo". Other warning options are already
6079 // handled somewhere else.
6080 Args.ClaimAllArgs(options::OPT_w);
6081
Bill Wendlingac66cb82013-12-08 00:21:01 +00006082 if (getToolChain().getArch() == llvm::Triple::mips64)
6083 CmdArgs.push_back("-EB");
6084 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6085 CmdArgs.push_back("-EL");
6086
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00006087 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00006088 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00006089 CmdArgs.push_back("-e");
6090 CmdArgs.push_back("__start");
6091 }
6092
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006093 if (Args.hasArg(options::OPT_static)) {
6094 CmdArgs.push_back("-Bstatic");
6095 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00006096 if (Args.hasArg(options::OPT_rdynamic))
6097 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006098 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00006099 CmdArgs.push_back("-Bdynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006100 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00006101 CmdArgs.push_back("-shared");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006102 } else {
6103 CmdArgs.push_back("-dynamic-linker");
6104 CmdArgs.push_back("/usr/libexec/ld.so");
6105 }
6106 }
6107
Rafael Espindola9adba392013-06-05 04:28:55 +00006108 if (Args.hasArg(options::OPT_nopie))
6109 CmdArgs.push_back("-nopie");
6110
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006111 if (Output.isFilename()) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006112 CmdArgs.push_back("-o");
6113 CmdArgs.push_back(Output.getFilename());
6114 } else {
6115 assert(Output.isNothing() && "Invalid output.");
6116 }
6117
6118 if (!Args.hasArg(options::OPT_nostdlib) &&
6119 !Args.hasArg(options::OPT_nostartfiles)) {
6120 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman62d829a2011-12-15 02:15:56 +00006121 if (Args.hasArg(options::OPT_pg))
6122 CmdArgs.push_back(Args.MakeArgString(
6123 getToolChain().GetFilePath("gcrt0.o")));
6124 else
6125 CmdArgs.push_back(Args.MakeArgString(
6126 getToolChain().GetFilePath("crt0.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006127 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006128 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006129 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00006130 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006131 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006132 }
6133 }
6134
Edward O'Callaghane7e18202009-10-28 15:13:08 +00006135 std::string Triple = getToolChain().getTripleString();
6136 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar294691e2009-11-04 06:24:38 +00006137 Triple.replace(0, 6, "amd64");
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00006138 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbar95c04572010-08-01 23:13:54 +00006139 "/4.2.1"));
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00006140
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006141 Args.AddAllArgs(CmdArgs, options::OPT_L);
6142 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6143 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindola6cc2a682012-12-31 22:41:36 +00006144 Args.AddAllArgs(CmdArgs, options::OPT_s);
6145 Args.AddAllArgs(CmdArgs, options::OPT_t);
6146 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6147 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006148
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006149 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006150
6151 if (!Args.hasArg(options::OPT_nostdlib) &&
6152 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006153 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006154 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman62d829a2011-12-15 02:15:56 +00006155 if (Args.hasArg(options::OPT_pg))
6156 CmdArgs.push_back("-lm_p");
6157 else
6158 CmdArgs.push_back("-lm");
Daniel Dunbar95c04572010-08-01 23:13:54 +00006159 }
6160
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00006161 // FIXME: For some reason GCC passes -lgcc before adding
6162 // the default system libraries. Just mimic this for now.
6163 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006164
Eric Christopherdc6cc872012-09-13 06:32:34 +00006165 if (Args.hasArg(options::OPT_pthread)) {
6166 if (!Args.hasArg(options::OPT_shared) &&
6167 Args.hasArg(options::OPT_pg))
6168 CmdArgs.push_back("-lpthread_p");
6169 else
6170 CmdArgs.push_back("-lpthread");
6171 }
6172
Chandler Carruth657849c2011-12-17 22:32:42 +00006173 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherdc6cc872012-09-13 06:32:34 +00006174 if (Args.hasArg(options::OPT_pg))
Eli Friedman62d829a2011-12-15 02:15:56 +00006175 CmdArgs.push_back("-lc_p");
6176 else
6177 CmdArgs.push_back("-lc");
Chandler Carruth657849c2011-12-17 22:32:42 +00006178 }
Eric Christopherdc6cc872012-09-13 06:32:34 +00006179
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00006180 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006181 }
6182
6183 if (!Args.hasArg(options::OPT_nostdlib) &&
6184 !Args.hasArg(options::OPT_nostartfiles)) {
6185 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00006186 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006187 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006188 else
Chris Lattner38e317d2010-07-07 16:01:42 +00006189 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006190 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006191 }
6192
6193 const char *Exec =
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006194 Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006195 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00006196}
Ed Schoutenc66a5a32009-04-02 19:13:12 +00006197
Eli Friedman42f74f22012-08-08 23:57:20 +00006198void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6199 const InputInfo &Output,
6200 const InputInfoList &Inputs,
6201 const ArgList &Args,
6202 const char *LinkingOutput) const {
6203 ArgStringList CmdArgs;
6204
6205 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6206 options::OPT_Xassembler);
6207
6208 CmdArgs.push_back("-o");
6209 CmdArgs.push_back(Output.getFilename());
6210
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006211 for (const auto &II : Inputs)
Eli Friedman42f74f22012-08-08 23:57:20 +00006212 CmdArgs.push_back(II.getFilename());
Eli Friedman42f74f22012-08-08 23:57:20 +00006213
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006214 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Eli Friedman42f74f22012-08-08 23:57:20 +00006215 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6216}
6217
6218void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6219 const InputInfo &Output,
6220 const InputInfoList &Inputs,
6221 const ArgList &Args,
6222 const char *LinkingOutput) const {
6223 const Driver &D = getToolChain().getDriver();
6224 ArgStringList CmdArgs;
6225
6226 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6227 (!Args.hasArg(options::OPT_shared))) {
6228 CmdArgs.push_back("-e");
6229 CmdArgs.push_back("__start");
6230 }
6231
6232 if (Args.hasArg(options::OPT_static)) {
6233 CmdArgs.push_back("-Bstatic");
6234 } else {
6235 if (Args.hasArg(options::OPT_rdynamic))
6236 CmdArgs.push_back("-export-dynamic");
6237 CmdArgs.push_back("--eh-frame-hdr");
6238 CmdArgs.push_back("-Bdynamic");
6239 if (Args.hasArg(options::OPT_shared)) {
6240 CmdArgs.push_back("-shared");
6241 } else {
6242 CmdArgs.push_back("-dynamic-linker");
6243 CmdArgs.push_back("/usr/libexec/ld.so");
6244 }
6245 }
6246
6247 if (Output.isFilename()) {
6248 CmdArgs.push_back("-o");
6249 CmdArgs.push_back(Output.getFilename());
6250 } else {
6251 assert(Output.isNothing() && "Invalid output.");
6252 }
6253
6254 if (!Args.hasArg(options::OPT_nostdlib) &&
6255 !Args.hasArg(options::OPT_nostartfiles)) {
6256 if (!Args.hasArg(options::OPT_shared)) {
6257 if (Args.hasArg(options::OPT_pg))
6258 CmdArgs.push_back(Args.MakeArgString(
6259 getToolChain().GetFilePath("gcrt0.o")));
6260 else
6261 CmdArgs.push_back(Args.MakeArgString(
6262 getToolChain().GetFilePath("crt0.o")));
6263 CmdArgs.push_back(Args.MakeArgString(
6264 getToolChain().GetFilePath("crtbegin.o")));
6265 } else {
6266 CmdArgs.push_back(Args.MakeArgString(
6267 getToolChain().GetFilePath("crtbeginS.o")));
6268 }
6269 }
6270
6271 Args.AddAllArgs(CmdArgs, options::OPT_L);
6272 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6273 Args.AddAllArgs(CmdArgs, options::OPT_e);
6274
6275 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6276
6277 if (!Args.hasArg(options::OPT_nostdlib) &&
6278 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006279 if (D.CCCIsCXX()) {
Eli Friedman42f74f22012-08-08 23:57:20 +00006280 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6281 if (Args.hasArg(options::OPT_pg))
6282 CmdArgs.push_back("-lm_p");
6283 else
6284 CmdArgs.push_back("-lm");
6285 }
6286
Rafael Espindola3667bbe2012-10-23 17:07:31 +00006287 if (Args.hasArg(options::OPT_pthread)) {
6288 if (!Args.hasArg(options::OPT_shared) &&
6289 Args.hasArg(options::OPT_pg))
6290 CmdArgs.push_back("-lpthread_p");
6291 else
6292 CmdArgs.push_back("-lpthread");
6293 }
6294
Eli Friedman42f74f22012-08-08 23:57:20 +00006295 if (!Args.hasArg(options::OPT_shared)) {
6296 if (Args.hasArg(options::OPT_pg))
6297 CmdArgs.push_back("-lc_p");
6298 else
6299 CmdArgs.push_back("-lc");
6300 }
6301
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00006302 StringRef MyArch;
6303 switch (getToolChain().getTriple().getArch()) {
6304 case llvm::Triple::arm:
6305 MyArch = "arm";
6306 break;
6307 case llvm::Triple::x86:
6308 MyArch = "i386";
6309 break;
6310 case llvm::Triple::x86_64:
6311 MyArch = "amd64";
6312 break;
6313 default:
6314 llvm_unreachable("Unsupported architecture");
6315 }
6316 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman42f74f22012-08-08 23:57:20 +00006317 }
6318
6319 if (!Args.hasArg(options::OPT_nostdlib) &&
6320 !Args.hasArg(options::OPT_nostartfiles)) {
6321 if (!Args.hasArg(options::OPT_shared))
6322 CmdArgs.push_back(Args.MakeArgString(
6323 getToolChain().GetFilePath("crtend.o")));
6324 else
6325 CmdArgs.push_back(Args.MakeArgString(
6326 getToolChain().GetFilePath("crtendS.o")));
6327 }
Eli Friedmanc9c48db2012-08-09 22:42:04 +00006328
6329 const char *Exec =
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006330 Args.MakeArgString(getToolChain().GetLinkerPath());
Eli Friedmanc9c48db2012-08-09 22:42:04 +00006331 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman42f74f22012-08-08 23:57:20 +00006332}
6333
Daniel Dunbar68a31d42009-03-31 17:45:15 +00006334void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006335 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00006336 const InputInfoList &Inputs,
6337 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00006338 const char *LinkingOutput) const {
Daniel Dunbar68a31d42009-03-31 17:45:15 +00006339 ArgStringList CmdArgs;
6340
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006341 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6342 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc55da4b2012-09-05 21:32:44 +00006343 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar68a31d42009-03-31 17:45:15 +00006344 CmdArgs.push_back("--32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00006345 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky3393cef2011-06-04 07:37:31 +00006346 CmdArgs.push_back("-a32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00006347 else if (getToolChain().getArch() == llvm::Triple::mips ||
6348 getToolChain().getArch() == llvm::Triple::mipsel ||
6349 getToolChain().getArch() == llvm::Triple::mips64 ||
6350 getToolChain().getArch() == llvm::Triple::mips64el) {
6351 StringRef CPUName;
6352 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00006353 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer20249a12010-10-21 03:16:25 +00006354
Eric Christopherc55da4b2012-09-05 21:32:44 +00006355 CmdArgs.push_back("-march");
6356 CmdArgs.push_back(CPUName.data());
6357
Eric Christopherc55da4b2012-09-05 21:32:44 +00006358 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00006359 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc55da4b2012-09-05 21:32:44 +00006360
6361 if (getToolChain().getArch() == llvm::Triple::mips ||
6362 getToolChain().getArch() == llvm::Triple::mips64)
6363 CmdArgs.push_back("-EB");
6364 else
6365 CmdArgs.push_back("-EL");
6366
Stephen Hines651f13c2014-04-23 16:59:28 -07006367 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola27fa2362012-12-13 04:17:14 +00006368 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Stephen Hines651f13c2014-04-23 16:59:28 -07006369 getToolChain().getArch() == llvm::Triple::armeb ||
6370 getToolChain().getArch() == llvm::Triple::thumb ||
6371 getToolChain().getArch() == llvm::Triple::thumbeb) {
6372 const Driver &D = getToolChain().getDriver();
6373 const llvm::Triple &Triple = getToolChain().getTriple();
6374 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6375
6376 if (FloatABI == "hard") {
6377 CmdArgs.push_back("-mfpu=vfp");
6378 } else {
6379 CmdArgs.push_back("-mfpu=softvfp");
6380 }
6381
Rafael Espindola27fa2362012-12-13 04:17:14 +00006382 switch(getToolChain().getTriple().getEnvironment()) {
Stephen Hines651f13c2014-04-23 16:59:28 -07006383 case llvm::Triple::GNUEABIHF:
Rafael Espindola27fa2362012-12-13 04:17:14 +00006384 case llvm::Triple::GNUEABI:
6385 case llvm::Triple::EABI:
Anton Korobeynikovb234e742013-03-18 07:59:20 +00006386 CmdArgs.push_back("-meabi=5");
Rafael Espindola27fa2362012-12-13 04:17:14 +00006387 break;
6388
6389 default:
6390 CmdArgs.push_back("-matpcs");
6391 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006392 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
6393 getToolChain().getArch() == llvm::Triple::sparcv9) {
6394 if (getToolChain().getArch() == llvm::Triple::sparc)
6395 CmdArgs.push_back("-Av8plusa");
6396 else
6397 CmdArgs.push_back("-Av9a");
6398
6399 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc55da4b2012-09-05 21:32:44 +00006400 }
Eric Christophered734732010-03-02 02:41:08 +00006401
Daniel Dunbar68a31d42009-03-31 17:45:15 +00006402 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6403 options::OPT_Xassembler);
6404
6405 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006406 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00006407
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006408 for (const auto &II : Inputs)
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006409 CmdArgs.push_back(II.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00006410
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006411 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006412 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar68a31d42009-03-31 17:45:15 +00006413}
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006414
6415void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006416 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00006417 const InputInfoList &Inputs,
6418 const ArgList &Args,
Daniel Dunbara8304f62009-05-02 20:14:53 +00006419 const char *LinkingOutput) const {
Roman Divacky94380162012-08-28 15:09:03 +00006420 const toolchains::FreeBSD& ToolChain =
6421 static_cast<const toolchains::FreeBSD&>(getToolChain());
6422 const Driver &D = ToolChain.getDriver();
Stephen Hines651f13c2014-04-23 16:59:28 -07006423 const bool IsPIE =
6424 !Args.hasArg(options::OPT_shared) &&
6425 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006426 ArgStringList CmdArgs;
David Chisnalldfa210b2012-07-29 15:24:44 +00006427
6428 // Silence warning for "clang -g foo.o -o foo"
6429 Args.ClaimAllArgs(options::OPT_g_Group);
6430 // and "clang -emit-llvm foo.o -o foo"
6431 Args.ClaimAllArgs(options::OPT_emit_llvm);
6432 // and for "clang -w foo.o -o foo". Other warning options are already
6433 // handled somewhere else.
6434 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006435
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006436 if (!D.SysRoot.empty())
6437 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6438
Stephen Hines651f13c2014-04-23 16:59:28 -07006439 if (IsPIE)
Roman Divacky94380162012-08-28 15:09:03 +00006440 CmdArgs.push_back("-pie");
6441
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006442 if (Args.hasArg(options::OPT_static)) {
6443 CmdArgs.push_back("-Bstatic");
6444 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00006445 if (Args.hasArg(options::OPT_rdynamic))
6446 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006447 CmdArgs.push_back("--eh-frame-hdr");
6448 if (Args.hasArg(options::OPT_shared)) {
6449 CmdArgs.push_back("-Bshareable");
6450 } else {
6451 CmdArgs.push_back("-dynamic-linker");
6452 CmdArgs.push_back("/libexec/ld-elf.so.1");
6453 }
Roman Divacky94380162012-08-28 15:09:03 +00006454 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6455 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnalldfa210b2012-07-29 15:24:44 +00006456 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6457 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6458 CmdArgs.push_back("--hash-style=both");
6459 }
6460 }
6461 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006462 }
6463
6464 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6465 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006466 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006467 CmdArgs.push_back("-m");
6468 CmdArgs.push_back("elf_i386_fbsd");
6469 }
6470
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006471 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky000a6552011-06-04 07:40:24 +00006472 CmdArgs.push_back("-m");
Roman Divacky1052c1d2011-11-21 16:50:32 +00006473 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky000a6552011-06-04 07:40:24 +00006474 }
6475
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006476 if (Output.isFilename()) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006477 CmdArgs.push_back("-o");
6478 CmdArgs.push_back(Output.getFilename());
6479 } else {
6480 assert(Output.isNothing() && "Invalid output.");
6481 }
6482
6483 if (!Args.hasArg(options::OPT_nostdlib) &&
6484 !Args.hasArg(options::OPT_nostartfiles)) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006485 const char *crt1 = nullptr;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006486 if (!Args.hasArg(options::OPT_shared)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00006487 if (Args.hasArg(options::OPT_pg))
Roman Divacky94380162012-08-28 15:09:03 +00006488 crt1 = "gcrt1.o";
Stephen Hines651f13c2014-04-23 16:59:28 -07006489 else if (IsPIE)
Roman Divacky94380162012-08-28 15:09:03 +00006490 crt1 = "Scrt1.o";
6491 else
6492 crt1 = "crt1.o";
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006493 }
Roman Divacky94380162012-08-28 15:09:03 +00006494 if (crt1)
6495 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6496
6497 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6498
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006499 const char *crtbegin = nullptr;
Roman Divacky94380162012-08-28 15:09:03 +00006500 if (Args.hasArg(options::OPT_static))
6501 crtbegin = "crtbeginT.o";
Stephen Hines651f13c2014-04-23 16:59:28 -07006502 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divacky94380162012-08-28 15:09:03 +00006503 crtbegin = "crtbeginS.o";
6504 else
6505 crtbegin = "crtbegin.o";
6506
6507 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006508 }
6509
6510 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divacky94380162012-08-28 15:09:03 +00006511 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006512 for (const auto &Path : Paths)
6513 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006514 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6515 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnallc7363772010-08-15 22:58:12 +00006516 Args.AddAllArgs(CmdArgs, options::OPT_s);
6517 Args.AddAllArgs(CmdArgs, options::OPT_t);
6518 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6519 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006520
Stephen Hines651f13c2014-04-23 16:59:28 -07006521 if (D.IsUsingLTO(Args))
6522 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackydb334192013-11-10 09:31:43 +00006523
Roman Divacky94380162012-08-28 15:09:03 +00006524 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006525
6526 if (!Args.hasArg(options::OPT_nostdlib) &&
6527 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006528 if (D.CCCIsCXX()) {
Roman Divacky94380162012-08-28 15:09:03 +00006529 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divackyc16bb762011-02-10 16:59:40 +00006530 if (Args.hasArg(options::OPT_pg))
6531 CmdArgs.push_back("-lm_p");
6532 else
6533 CmdArgs.push_back("-lm");
Daniel Dunbar20022632010-02-17 08:07:51 +00006534 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006535 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6536 // the default system libraries. Just mimic this for now.
Roman Divackyc16bb762011-02-10 16:59:40 +00006537 if (Args.hasArg(options::OPT_pg))
6538 CmdArgs.push_back("-lgcc_p");
6539 else
6540 CmdArgs.push_back("-lgcc");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006541 if (Args.hasArg(options::OPT_static)) {
6542 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00006543 } else if (Args.hasArg(options::OPT_pg)) {
6544 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006545 } else {
6546 CmdArgs.push_back("--as-needed");
6547 CmdArgs.push_back("-lgcc_s");
6548 CmdArgs.push_back("--no-as-needed");
6549 }
6550
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00006551 if (Args.hasArg(options::OPT_pthread)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00006552 if (Args.hasArg(options::OPT_pg))
6553 CmdArgs.push_back("-lpthread_p");
6554 else
6555 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00006556 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006557
Roman Divackyc16bb762011-02-10 16:59:40 +00006558 if (Args.hasArg(options::OPT_pg)) {
6559 if (Args.hasArg(options::OPT_shared))
6560 CmdArgs.push_back("-lc");
6561 else
6562 CmdArgs.push_back("-lc_p");
6563 CmdArgs.push_back("-lgcc_p");
6564 } else {
6565 CmdArgs.push_back("-lc");
6566 CmdArgs.push_back("-lgcc");
6567 }
6568
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006569 if (Args.hasArg(options::OPT_static)) {
6570 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00006571 } else if (Args.hasArg(options::OPT_pg)) {
6572 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006573 } else {
6574 CmdArgs.push_back("--as-needed");
6575 CmdArgs.push_back("-lgcc_s");
6576 CmdArgs.push_back("--no-as-needed");
6577 }
6578 }
6579
6580 if (!Args.hasArg(options::OPT_nostdlib) &&
6581 !Args.hasArg(options::OPT_nostartfiles)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07006582 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divacky94380162012-08-28 15:09:03 +00006583 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackyf6513812012-09-07 13:36:21 +00006584 else
6585 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divacky94380162012-08-28 15:09:03 +00006586 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006587 }
6588
Stephen Hines651f13c2014-04-23 16:59:28 -07006589 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
6590
6591 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00006592
Daniel Dunbarc21c4852009-04-08 23:54:23 +00006593 const char *Exec =
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006594 Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006595 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00006596}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006597
Benjamin Kramer8e50a962011-02-02 18:59:27 +00006598void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6599 const InputInfo &Output,
6600 const InputInfoList &Inputs,
6601 const ArgList &Args,
6602 const char *LinkingOutput) const {
6603 ArgStringList CmdArgs;
6604
Stephen Hines651f13c2014-04-23 16:59:28 -07006605 // GNU as needs different flags for creating the correct output format
6606 // on architectures with different ABIs or optional feature sets.
6607 switch (getToolChain().getArch()) {
6608 case llvm::Triple::x86:
Benjamin Kramer8e50a962011-02-02 18:59:27 +00006609 CmdArgs.push_back("--32");
Stephen Hines651f13c2014-04-23 16:59:28 -07006610 break;
6611 case llvm::Triple::arm:
6612 case llvm::Triple::armeb:
6613 case llvm::Triple::thumb:
6614 case llvm::Triple::thumbeb: {
6615 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Bill Wendlingcf660bd2013-12-06 19:12:36 +00006616 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Stephen Hines651f13c2014-04-23 16:59:28 -07006617 break;
Bill Wendlingcf660bd2013-12-06 19:12:36 +00006618 }
6619
Stephen Hines651f13c2014-04-23 16:59:28 -07006620 case llvm::Triple::mips:
6621 case llvm::Triple::mipsel:
6622 case llvm::Triple::mips64:
6623 case llvm::Triple::mips64el: {
Bill Wendlingc54c8852013-12-09 02:59:27 +00006624 StringRef CPUName;
6625 StringRef ABIName;
6626 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6627
6628 CmdArgs.push_back("-march");
6629 CmdArgs.push_back(CPUName.data());
6630
6631 CmdArgs.push_back("-mabi");
6632 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6633
6634 if (getToolChain().getArch() == llvm::Triple::mips ||
6635 getToolChain().getArch() == llvm::Triple::mips64)
6636 CmdArgs.push_back("-EB");
6637 else
6638 CmdArgs.push_back("-EL");
6639
Stephen Hines651f13c2014-04-23 16:59:28 -07006640 addAssemblerKPIC(Args, CmdArgs);
6641 break;
6642 }
6643
6644 case llvm::Triple::sparc:
6645 CmdArgs.push_back("-32");
6646 addAssemblerKPIC(Args, CmdArgs);
6647 break;
6648
6649 case llvm::Triple::sparcv9:
6650 CmdArgs.push_back("-64");
6651 CmdArgs.push_back("-Av9");
6652 addAssemblerKPIC(Args, CmdArgs);
6653 break;
6654
6655 default:
6656 break;
Bill Wendlingc54c8852013-12-09 02:59:27 +00006657 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00006658
6659 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6660 options::OPT_Xassembler);
6661
6662 CmdArgs.push_back("-o");
6663 CmdArgs.push_back(Output.getFilename());
6664
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006665 for (const auto &II : Inputs)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00006666 CmdArgs.push_back(II.getFilename());
Benjamin Kramer8e50a962011-02-02 18:59:27 +00006667
David Chisnall5adcec12011-09-27 22:03:18 +00006668 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00006669 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6670}
6671
6672void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6673 const InputInfo &Output,
6674 const InputInfoList &Inputs,
6675 const ArgList &Args,
6676 const char *LinkingOutput) const {
6677 const Driver &D = getToolChain().getDriver();
6678 ArgStringList CmdArgs;
6679
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006680 if (!D.SysRoot.empty())
6681 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6682
Stephen Hines651f13c2014-04-23 16:59:28 -07006683 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00006684 if (Args.hasArg(options::OPT_static)) {
6685 CmdArgs.push_back("-Bstatic");
6686 } else {
6687 if (Args.hasArg(options::OPT_rdynamic))
6688 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00006689 if (Args.hasArg(options::OPT_shared)) {
6690 CmdArgs.push_back("-Bshareable");
6691 } else {
6692 CmdArgs.push_back("-dynamic-linker");
6693 CmdArgs.push_back("/libexec/ld.elf_so");
6694 }
6695 }
6696
Stephen Hines651f13c2014-04-23 16:59:28 -07006697 // Many NetBSD architectures support more than one ABI.
6698 // Determine the correct emulation for ld.
6699 switch (getToolChain().getArch()) {
6700 case llvm::Triple::x86:
Benjamin Kramer8e50a962011-02-02 18:59:27 +00006701 CmdArgs.push_back("-m");
6702 CmdArgs.push_back("elf_i386");
Stephen Hines651f13c2014-04-23 16:59:28 -07006703 break;
6704 case llvm::Triple::arm:
6705 case llvm::Triple::armeb:
6706 case llvm::Triple::thumb:
6707 case llvm::Triple::thumbeb:
6708 CmdArgs.push_back("-m");
6709 switch (getToolChain().getTriple().getEnvironment()) {
6710 case llvm::Triple::EABI:
6711 case llvm::Triple::GNUEABI:
6712 CmdArgs.push_back("armelf_nbsd_eabi");
6713 break;
6714 case llvm::Triple::EABIHF:
6715 case llvm::Triple::GNUEABIHF:
6716 CmdArgs.push_back("armelf_nbsd_eabihf");
6717 break;
6718 default:
6719 CmdArgs.push_back("armelf_nbsd");
6720 break;
6721 }
6722 break;
6723 case llvm::Triple::mips64:
6724 case llvm::Triple::mips64el:
6725 if (mips::hasMipsAbiArg(Args, "32")) {
6726 CmdArgs.push_back("-m");
6727 if (getToolChain().getArch() == llvm::Triple::mips64)
6728 CmdArgs.push_back("elf32btsmip");
6729 else
6730 CmdArgs.push_back("elf32ltsmip");
6731 } else if (mips::hasMipsAbiArg(Args, "64")) {
6732 CmdArgs.push_back("-m");
6733 if (getToolChain().getArch() == llvm::Triple::mips64)
6734 CmdArgs.push_back("elf64btsmip");
6735 else
6736 CmdArgs.push_back("elf64ltsmip");
6737 }
6738 break;
6739
6740 case llvm::Triple::sparc:
6741 CmdArgs.push_back("-m");
6742 CmdArgs.push_back("elf32_sparc");
6743 break;
6744
6745 case llvm::Triple::sparcv9:
6746 CmdArgs.push_back("-m");
6747 CmdArgs.push_back("elf64_sparc");
6748 break;
6749
6750 default:
6751 break;
Benjamin Kramer8e50a962011-02-02 18:59:27 +00006752 }
6753
6754 if (Output.isFilename()) {
6755 CmdArgs.push_back("-o");
6756 CmdArgs.push_back(Output.getFilename());
6757 } else {
6758 assert(Output.isNothing() && "Invalid output.");
6759 }
6760
6761 if (!Args.hasArg(options::OPT_nostdlib) &&
6762 !Args.hasArg(options::OPT_nostartfiles)) {
6763 if (!Args.hasArg(options::OPT_shared)) {
6764 CmdArgs.push_back(Args.MakeArgString(
6765 getToolChain().GetFilePath("crt0.o")));
6766 CmdArgs.push_back(Args.MakeArgString(
6767 getToolChain().GetFilePath("crti.o")));
6768 CmdArgs.push_back(Args.MakeArgString(
6769 getToolChain().GetFilePath("crtbegin.o")));
6770 } else {
6771 CmdArgs.push_back(Args.MakeArgString(
6772 getToolChain().GetFilePath("crti.o")));
6773 CmdArgs.push_back(Args.MakeArgString(
6774 getToolChain().GetFilePath("crtbeginS.o")));
6775 }
6776 }
6777
6778 Args.AddAllArgs(CmdArgs, options::OPT_L);
6779 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6780 Args.AddAllArgs(CmdArgs, options::OPT_e);
6781 Args.AddAllArgs(CmdArgs, options::OPT_s);
6782 Args.AddAllArgs(CmdArgs, options::OPT_t);
6783 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6784 Args.AddAllArgs(CmdArgs, options::OPT_r);
6785
6786 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6787
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00006788 unsigned Major, Minor, Micro;
6789 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6790 bool useLibgcc = true;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006791 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 40) || Major == 0) {
Stephen Hines651f13c2014-04-23 16:59:28 -07006792 switch(getToolChain().getArch()) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006793 case llvm::Triple::arm:
6794 case llvm::Triple::armeb:
6795 case llvm::Triple::thumb:
6796 case llvm::Triple::thumbeb:
Stephen Hines651f13c2014-04-23 16:59:28 -07006797 case llvm::Triple::x86:
6798 case llvm::Triple::x86_64:
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00006799 useLibgcc = false;
Stephen Hines651f13c2014-04-23 16:59:28 -07006800 break;
6801 default:
6802 break;
6803 }
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00006804 }
6805
Benjamin Kramer8e50a962011-02-02 18:59:27 +00006806 if (!Args.hasArg(options::OPT_nostdlib) &&
6807 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006808 if (D.CCCIsCXX()) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00006809 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6810 CmdArgs.push_back("-lm");
6811 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00006812 if (Args.hasArg(options::OPT_pthread))
6813 CmdArgs.push_back("-lpthread");
6814 CmdArgs.push_back("-lc");
6815
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00006816 if (useLibgcc) {
6817 if (Args.hasArg(options::OPT_static)) {
6818 // libgcc_eh depends on libc, so resolve as much as possible,
6819 // pull in any new requirements from libc and then get the rest
6820 // of libgcc.
6821 CmdArgs.push_back("-lgcc_eh");
6822 CmdArgs.push_back("-lc");
6823 CmdArgs.push_back("-lgcc");
6824 } else {
6825 CmdArgs.push_back("-lgcc");
6826 CmdArgs.push_back("--as-needed");
6827 CmdArgs.push_back("-lgcc_s");
6828 CmdArgs.push_back("--no-as-needed");
6829 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00006830 }
6831 }
6832
6833 if (!Args.hasArg(options::OPT_nostdlib) &&
6834 !Args.hasArg(options::OPT_nostartfiles)) {
6835 if (!Args.hasArg(options::OPT_shared))
6836 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6837 "crtend.o")));
6838 else
6839 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6840 "crtendS.o")));
6841 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6842 "crtn.o")));
6843 }
6844
Stephen Hines651f13c2014-04-23 16:59:28 -07006845 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00006846
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006847 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Benjamin Kramer8e50a962011-02-02 18:59:27 +00006848 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6849}
6850
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00006851void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6852 const InputInfo &Output,
6853 const InputInfoList &Inputs,
6854 const ArgList &Args,
6855 const char *LinkingOutput) const {
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006856 ArgStringList CmdArgs;
Stephen Hines651f13c2014-04-23 16:59:28 -07006857 bool NeedsKPIC = false;
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006858
6859 // Add --32/--64 to make sure we get the format we want.
6860 // This is incomplete
6861 if (getToolChain().getArch() == llvm::Triple::x86) {
6862 CmdArgs.push_back("--32");
6863 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006864 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
6865 CmdArgs.push_back("--x32");
6866 else
6867 CmdArgs.push_back("--64");
Eli Friedman7972c882011-11-28 23:46:52 +00006868 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6869 CmdArgs.push_back("-a32");
6870 CmdArgs.push_back("-mppc");
6871 CmdArgs.push_back("-many");
6872 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6873 CmdArgs.push_back("-a64");
6874 CmdArgs.push_back("-mppc64");
6875 CmdArgs.push_back("-many");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00006876 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6877 CmdArgs.push_back("-a64");
Stephen Hines651f13c2014-04-23 16:59:28 -07006878 CmdArgs.push_back("-mppc64");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00006879 CmdArgs.push_back("-many");
Stephen Hines651f13c2014-04-23 16:59:28 -07006880 CmdArgs.push_back("-mlittle-endian");
6881 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
6882 CmdArgs.push_back("-32");
6883 CmdArgs.push_back("-Av8plusa");
6884 NeedsKPIC = true;
6885 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
6886 CmdArgs.push_back("-64");
6887 CmdArgs.push_back("-Av9a");
6888 NeedsKPIC = true;
6889 } else if (getToolChain().getArch() == llvm::Triple::arm ||
6890 getToolChain().getArch() == llvm::Triple::armeb) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00006891 StringRef MArch = getToolChain().getArchName();
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006892 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6893 CmdArgs.push_back("-mfpu=neon");
Stephen Hines651f13c2014-04-23 16:59:28 -07006894 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
6895 MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
Bernard Ogden80e90c22013-10-24 18:32:41 +00006896 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00006897
Stephen Hines651f13c2014-04-23 16:59:28 -07006898 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
6899 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00006900 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00006901
6902 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Stephen Hines651f13c2014-04-23 16:59:28 -07006903
6904 // FIXME: remove krait check when GNU tools support krait cpu
6905 // for now replace it with -march=armv7-a to avoid a lower
6906 // march from being picked in the absence of a cpu flag.
6907 Arg *A;
6908 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
6909 StringRef(A->getValue()) == "krait")
6910 CmdArgs.push_back("-march=armv7-a");
6911 else
6912 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00006913 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanakac85900f2011-11-30 19:31:38 +00006914 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6915 getToolChain().getArch() == llvm::Triple::mipsel ||
6916 getToolChain().getArch() == llvm::Triple::mips64 ||
6917 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan073a7802012-04-07 22:31:29 +00006918 StringRef CPUName;
6919 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00006920 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanakac85900f2011-11-30 19:31:38 +00006921
Simon Atanasyan073a7802012-04-07 22:31:29 +00006922 CmdArgs.push_back("-march");
6923 CmdArgs.push_back(CPUName.data());
6924
Simon Atanasyan073a7802012-04-07 22:31:29 +00006925 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00006926 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan5f0a1c12012-04-06 19:15:24 +00006927
6928 if (getToolChain().getArch() == llvm::Triple::mips ||
6929 getToolChain().getArch() == llvm::Triple::mips64)
6930 CmdArgs.push_back("-EB");
6931 else
6932 CmdArgs.push_back("-EL");
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00006933
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00006934 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6935 if (StringRef(A->getValue()) == "2008")
6936 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6937 }
6938
Stephen Hines651f13c2014-04-23 16:59:28 -07006939 Args.AddLastArg(CmdArgs, options::OPT_mfp32, options::OPT_mfp64);
Simon Atanasyan9dbfc612013-04-30 07:47:13 +00006940 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6941 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6942 options::OPT_mno_micromips);
6943 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6944 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6945
Daniel Sanders0d5d6ff2013-12-02 10:14:43 +00006946 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
6947 // Do not use AddLastArg because not all versions of MIPS assembler
6948 // support -mmsa / -mno-msa options.
6949 if (A->getOption().matches(options::OPT_mmsa))
6950 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
6951 }
6952
Stephen Hines651f13c2014-04-23 16:59:28 -07006953 NeedsKPIC = true;
Ulrich Weigandb8409212013-05-06 16:26:41 +00006954 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00006955 // Always pass an -march option, since our default of z10 is later
6956 // than the GNU assembler's default.
6957 StringRef CPUName = getSystemZTargetCPU(Args);
6958 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006959 }
6960
Stephen Hines651f13c2014-04-23 16:59:28 -07006961 if (NeedsKPIC)
6962 addAssemblerKPIC(Args, CmdArgs);
6963
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006964 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6965 options::OPT_Xassembler);
6966
6967 CmdArgs.push_back("-o");
6968 CmdArgs.push_back(Output.getFilename());
6969
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006970 for (const auto &II : Inputs)
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006971 CmdArgs.push_back(II.getFilename());
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006972
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006973 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006974 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopherc47b6f32013-06-05 23:58:15 +00006975
6976 // Handle the debug info splitting at object creation time if we're
6977 // creating an object.
6978 // TODO: Currently only works on linux with newer objcopy.
6979 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00006980 getToolChain().getTriple().isOSLinux())
Eric Christopherc47b6f32013-06-05 23:58:15 +00006981 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6982 SplitDebugName(Args, Inputs));
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006983}
6984
Stephen Hines651f13c2014-04-23 16:59:28 -07006985static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006986 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chien94a71422012-09-02 09:30:11 +00006987 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth68f94db2013-03-04 02:07:55 +00006988 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6989 Args.hasArg(options::OPT_static);
Hans Wennborg76b86c22013-07-18 20:29:38 +00006990 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006991 CmdArgs.push_back("-lgcc");
6992
Logan Chien529a73d2012-11-19 12:04:11 +00006993 if (StaticLibgcc || isAndroid) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006994 if (D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006995 CmdArgs.push_back("-lgcc");
6996 } else {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006997 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006998 CmdArgs.push_back("--as-needed");
6999 CmdArgs.push_back("-lgcc_s");
Hans Wennborg76b86c22013-07-18 20:29:38 +00007000 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00007001 CmdArgs.push_back("--no-as-needed");
7002 }
7003
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007004 if (StaticLibgcc && !isAndroid)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00007005 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg76b86c22013-07-18 20:29:38 +00007006 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00007007 CmdArgs.push_back("-lgcc");
Logan Chien529a73d2012-11-19 12:04:11 +00007008
7009 // According to Android ABI, we have to link with libdl if we are
7010 // linking with non-static libgcc.
7011 //
7012 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7013 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7014 if (isAndroid && !StaticLibgcc)
7015 CmdArgs.push_back("-ldl");
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00007016}
7017
Peter Collingbournebdaa1342013-05-27 21:40:20 +00007018static StringRef getLinuxDynamicLinker(const ArgList &Args,
7019 const toolchains::Linux &ToolChain) {
Stephen Hines651f13c2014-04-23 16:59:28 -07007020 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7021 if (ToolChain.getTriple().isArch64Bit())
7022 return "/system/bin/linker64";
7023 else
7024 return "/system/bin/linker";
7025 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7026 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbournebdaa1342013-05-27 21:40:20 +00007027 return "/lib/ld-linux.so.2";
Stephen Hines651f13c2014-04-23 16:59:28 -07007028 else if (ToolChain.getArch() == llvm::Triple::aarch64 ||
7029 ToolChain.getArch() == llvm::Triple::arm64)
Peter Collingbournebdaa1342013-05-27 21:40:20 +00007030 return "/lib/ld-linux-aarch64.so.1";
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007031 else if (ToolChain.getArch() == llvm::Triple::aarch64_be ||
7032 ToolChain.getArch() == llvm::Triple::arm64_be)
Stephen Hines651f13c2014-04-23 16:59:28 -07007033 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbournebdaa1342013-05-27 21:40:20 +00007034 else if (ToolChain.getArch() == llvm::Triple::arm ||
7035 ToolChain.getArch() == llvm::Triple::thumb) {
7036 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7037 return "/lib/ld-linux-armhf.so.3";
7038 else
7039 return "/lib/ld-linux.so.3";
Stephen Hines651f13c2014-04-23 16:59:28 -07007040 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7041 ToolChain.getArch() == llvm::Triple::thumbeb) {
7042 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7043 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7044 else
7045 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbournebdaa1342013-05-27 21:40:20 +00007046 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007047 ToolChain.getArch() == llvm::Triple::mipsel) {
7048 if (mips::isNaN2008(Args, ToolChain.getTriple()))
7049 return "/lib/ld-linux-mipsn8.so.1";
Peter Collingbournebdaa1342013-05-27 21:40:20 +00007050 return "/lib/ld.so.1";
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007051 } else if (ToolChain.getArch() == llvm::Triple::mips64 ||
7052 ToolChain.getArch() == llvm::Triple::mips64el) {
Stephen Hines651f13c2014-04-23 16:59:28 -07007053 if (mips::hasMipsAbiArg(Args, "n32"))
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007054 return mips::isNaN2008(Args, ToolChain.getTriple())
7055 ? "/lib32/ld-linux-mipsn8.so.1" : "/lib32/ld.so.1";
7056 return mips::isNaN2008(Args, ToolChain.getTriple())
7057 ? "/lib64/ld-linux-mipsn8.so.1" : "/lib64/ld.so.1";
Peter Collingbournebdaa1342013-05-27 21:40:20 +00007058 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7059 return "/lib/ld.so.1";
7060 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
7061 ToolChain.getArch() == llvm::Triple::systemz)
7062 return "/lib64/ld64.so.1";
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007063 else if (ToolChain.getArch() == llvm::Triple::ppc64le)
7064 return "/lib64/ld64.so.2";
Stephen Hines651f13c2014-04-23 16:59:28 -07007065 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7066 return "/lib64/ld-linux.so.2";
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007067 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7068 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7069 return "/libx32/ld-linux-x32.so.2";
Peter Collingbournebdaa1342013-05-27 21:40:20 +00007070 else
7071 return "/lib64/ld-linux-x86-64.so.2";
7072}
7073
Stephen Hines651f13c2014-04-23 16:59:28 -07007074static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
7075 ArgStringList &CmdArgs, const ArgList &Args) {
7076 // Make use of compiler-rt if --rtlib option is used
7077 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7078
7079 switch(RLT) {
7080 case ToolChain::RLT_CompilerRT:
7081 addClangRTLinux(TC, Args, CmdArgs);
7082 break;
7083 case ToolChain::RLT_Libgcc:
7084 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7085 break;
7086 }
7087}
7088
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00007089void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7090 const InputInfo &Output,
7091 const InputInfoList &Inputs,
7092 const ArgList &Args,
7093 const char *LinkingOutput) const {
Rafael Espindolac1da9812010-11-07 20:14:31 +00007094 const toolchains::Linux& ToolChain =
7095 static_cast<const toolchains::Linux&>(getToolChain());
7096 const Driver &D = ToolChain.getDriver();
Rafael Espindola715852c2012-11-02 20:41:30 +00007097 const bool isAndroid =
7098 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00007099 const bool IsPIE =
7100 !Args.hasArg(options::OPT_shared) &&
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007101 !Args.hasArg(options::OPT_static) &&
7102 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault() ||
7103 // On Android every code is PIC so every executable is PIE
7104 // Cannot use isPIEDefault here since otherwise
7105 // PIE only logic will be enabled during compilation
7106 isAndroid);
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007107
Rafael Espindolac1da9812010-11-07 20:14:31 +00007108 ArgStringList CmdArgs;
7109
Rafael Espindola26f14c32010-11-15 18:28:16 +00007110 // Silence warning for "clang -g foo.o -o foo"
7111 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00007112 // and "clang -emit-llvm foo.o -o foo"
7113 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnalldfa210b2012-07-29 15:24:44 +00007114 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindola7f6458b2010-11-17 20:37:10 +00007115 // handled somewhere else.
7116 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola26f14c32010-11-15 18:28:16 +00007117
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00007118 if (!D.SysRoot.empty())
7119 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac1da9812010-11-07 20:14:31 +00007120
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00007121 if (IsPIE)
Rafael Espindolafdda1712010-11-17 22:26:15 +00007122 CmdArgs.push_back("-pie");
7123
Rafael Espindoladc1b76d2010-11-07 22:57:16 +00007124 if (Args.hasArg(options::OPT_rdynamic))
7125 CmdArgs.push_back("-export-dynamic");
7126
Rafael Espindolae0e6d3b2010-11-11 19:34:42 +00007127 if (Args.hasArg(options::OPT_s))
7128 CmdArgs.push_back("-s");
7129
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007130 for (const auto &Opt : ToolChain.ExtraOpts)
7131 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac1da9812010-11-07 20:14:31 +00007132
7133 if (!Args.hasArg(options::OPT_static)) {
7134 CmdArgs.push_back("--eh-frame-hdr");
7135 }
7136
7137 CmdArgs.push_back("-m");
7138 if (ToolChain.getArch() == llvm::Triple::x86)
7139 CmdArgs.push_back("elf_i386");
Stephen Hines651f13c2014-04-23 16:59:28 -07007140 else if (ToolChain.getArch() == llvm::Triple::aarch64 ||
7141 ToolChain.getArch() == llvm::Triple::arm64)
Tim Northoverc264e162013-01-31 12:13:10 +00007142 CmdArgs.push_back("aarch64linux");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007143 else if (ToolChain.getArch() == llvm::Triple::aarch64_be ||
7144 ToolChain.getArch() == llvm::Triple::arm64_be)
Stephen Hines651f13c2014-04-23 16:59:28 -07007145 CmdArgs.push_back("aarch64_be_linux");
Eric Christopher88b7cf02011-08-19 00:30:14 +00007146 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregorf0594d82011-03-06 19:11:49 +00007147 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00007148 CmdArgs.push_back("armelf_linux_eabi");
Stephen Hines651f13c2014-04-23 16:59:28 -07007149 else if (ToolChain.getArch() == llvm::Triple::armeb
7150 || ToolChain.getArch() == llvm::Triple::thumbeb)
7151 CmdArgs.push_back("armebelf_linux_eabi"); /* TODO: check which NAME. */
Ted Kremenek43ac2972011-04-05 22:04:27 +00007152 else if (ToolChain.getArch() == llvm::Triple::ppc)
7153 CmdArgs.push_back("elf32ppclinux");
7154 else if (ToolChain.getArch() == llvm::Triple::ppc64)
7155 CmdArgs.push_back("elf64ppc");
Stephen Hines651f13c2014-04-23 16:59:28 -07007156 else if (ToolChain.getArch() == llvm::Triple::ppc64le)
7157 CmdArgs.push_back("elf64lppc");
7158 else if (ToolChain.getArch() == llvm::Triple::sparc)
7159 CmdArgs.push_back("elf32_sparc");
7160 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7161 CmdArgs.push_back("elf64_sparc");
Eli Friedman5bea4f62011-11-08 19:43:37 +00007162 else if (ToolChain.getArch() == llvm::Triple::mips)
7163 CmdArgs.push_back("elf32btsmip");
7164 else if (ToolChain.getArch() == llvm::Triple::mipsel)
7165 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00007166 else if (ToolChain.getArch() == llvm::Triple::mips64) {
Stephen Hines651f13c2014-04-23 16:59:28 -07007167 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00007168 CmdArgs.push_back("elf32btsmipn32");
7169 else
7170 CmdArgs.push_back("elf64btsmip");
7171 }
7172 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
Stephen Hines651f13c2014-04-23 16:59:28 -07007173 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00007174 CmdArgs.push_back("elf32ltsmipn32");
7175 else
7176 CmdArgs.push_back("elf64ltsmip");
7177 }
Ulrich Weigandb8409212013-05-06 16:26:41 +00007178 else if (ToolChain.getArch() == llvm::Triple::systemz)
7179 CmdArgs.push_back("elf64_s390");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007180 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7181 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7182 CmdArgs.push_back("elf32_x86_64");
Rafael Espindolac1da9812010-11-07 20:14:31 +00007183 else
7184 CmdArgs.push_back("elf_x86_64");
7185
7186 if (Args.hasArg(options::OPT_static)) {
Stephen Hines651f13c2014-04-23 16:59:28 -07007187 if (ToolChain.getArch() == llvm::Triple::arm ||
7188 ToolChain.getArch() == llvm::Triple::armeb ||
7189 ToolChain.getArch() == llvm::Triple::thumb ||
7190 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00007191 CmdArgs.push_back("-Bstatic");
7192 else
7193 CmdArgs.push_back("-static");
7194 } else if (Args.hasArg(options::OPT_shared)) {
7195 CmdArgs.push_back("-shared");
7196 }
7197
7198 if (ToolChain.getArch() == llvm::Triple::arm ||
Stephen Hines651f13c2014-04-23 16:59:28 -07007199 ToolChain.getArch() == llvm::Triple::armeb ||
Douglas Gregorf0594d82011-03-06 19:11:49 +00007200 ToolChain.getArch() == llvm::Triple::thumb ||
Stephen Hines651f13c2014-04-23 16:59:28 -07007201 ToolChain.getArch() == llvm::Triple::thumbeb ||
Rafael Espindolac1da9812010-11-07 20:14:31 +00007202 (!Args.hasArg(options::OPT_static) &&
7203 !Args.hasArg(options::OPT_shared))) {
7204 CmdArgs.push_back("-dynamic-linker");
Peter Collingbournebdaa1342013-05-27 21:40:20 +00007205 CmdArgs.push_back(Args.MakeArgString(
7206 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00007207 }
7208
7209 CmdArgs.push_back("-o");
7210 CmdArgs.push_back(Output.getFilename());
7211
Rafael Espindola49c64fd2010-12-01 01:52:43 +00007212 if (!Args.hasArg(options::OPT_nostdlib) &&
7213 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007214 if (!isAndroid) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007215 const char *crt1 = nullptr;
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007216 if (!Args.hasArg(options::OPT_shared)){
Eric Christopher61f08682013-06-07 23:25:01 +00007217 if (Args.hasArg(options::OPT_pg))
7218 crt1 = "gcrt1.o";
7219 else if (IsPIE)
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007220 crt1 = "Scrt1.o";
7221 else
7222 crt1 = "crt1.o";
7223 }
7224 if (crt1)
7225 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00007226
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007227 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7228 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00007229
Rafael Espindola89414b32010-11-12 03:00:39 +00007230 const char *crtbegin;
7231 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007232 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00007233 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007234 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00007235 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00007236 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00007237 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007238 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00007239 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramere20e5082012-10-04 19:42:20 +00007240
7241 // Add crtfastmath.o if available and fast math is enabled.
7242 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola89414b32010-11-12 03:00:39 +00007243 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00007244
7245 Args.AddAllArgs(CmdArgs, options::OPT_L);
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007246 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac1da9812010-11-07 20:14:31 +00007247
7248 const ToolChain::path_list Paths = ToolChain.getFilePaths();
7249
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007250 for (const auto &Path : Paths)
7251 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac1da9812010-11-07 20:14:31 +00007252
Stephen Hines651f13c2014-04-23 16:59:28 -07007253 if (D.IsUsingLTO(Args))
7254 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth700d4e42013-01-13 11:46:33 +00007255
Nick Lewyckye276cfc2012-08-17 03:39:16 +00007256 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7257 CmdArgs.push_back("--no-demangle");
7258
Rafael Espindolac1da9812010-11-07 20:14:31 +00007259 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7260
Stephen Hines651f13c2014-04-23 16:59:28 -07007261 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
Chandler Carruth80a393e2013-06-24 09:38:45 +00007262 // The profile runtime also needs access to system libraries.
Stephen Hines651f13c2014-04-23 16:59:28 -07007263 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruth80a393e2013-06-24 09:38:45 +00007264
Hans Wennborg76b86c22013-07-18 20:29:38 +00007265 if (D.CCCIsCXX() &&
Chandler Carruth2ba542c2012-05-14 18:31:18 +00007266 !Args.hasArg(options::OPT_nostdlib) &&
7267 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola19706f82011-10-17 22:14:51 +00007268 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7269 !Args.hasArg(options::OPT_static);
7270 if (OnlyLibstdcxxStatic)
7271 CmdArgs.push_back("-Bstatic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00007272 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola19706f82011-10-17 22:14:51 +00007273 if (OnlyLibstdcxxStatic)
7274 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00007275 CmdArgs.push_back("-lm");
7276 }
7277
Rafael Espindola89414b32010-11-12 03:00:39 +00007278 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth2ba542c2012-05-14 18:31:18 +00007279 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7280 if (Args.hasArg(options::OPT_static))
7281 CmdArgs.push_back("--start-group");
Nick Lewycky80df0252011-06-04 06:27:06 +00007282
Stephen Hines651f13c2014-04-23 16:59:28 -07007283 LibOpenMP UsedOpenMPLib = LibUnknown;
7284 if (Args.hasArg(options::OPT_fopenmp)) {
7285 UsedOpenMPLib = LibGOMP;
7286 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7287 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7288 .Case("libgomp", LibGOMP)
7289 .Case("libiomp5", LibIOMP5)
7290 .Default(LibUnknown);
7291 if (UsedOpenMPLib == LibUnknown)
7292 D.Diag(diag::err_drv_unsupported_option_argument)
7293 << A->getOption().getName() << A->getValue();
7294 }
7295 switch (UsedOpenMPLib) {
7296 case LibGOMP:
Chandler Carruthdf96e022013-01-17 13:19:29 +00007297 CmdArgs.push_back("-lgomp");
7298
Stephen Hines651f13c2014-04-23 16:59:28 -07007299 // FIXME: Exclude this for platforms with libgomp that don't require
7300 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruthdf96e022013-01-17 13:19:29 +00007301 CmdArgs.push_back("-lrt");
Stephen Hines651f13c2014-04-23 16:59:28 -07007302 break;
7303 case LibIOMP5:
7304 CmdArgs.push_back("-liomp5");
7305 break;
7306 case LibUnknown:
7307 break;
Chandler Carruthdf96e022013-01-17 13:19:29 +00007308 }
Stephen Hines651f13c2014-04-23 16:59:28 -07007309 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola89414b32010-11-12 03:00:39 +00007310
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007311 if ((Args.hasArg(options::OPT_pthread) ||
7312 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7313 !isAndroid)
Chandler Carruth2ba542c2012-05-14 18:31:18 +00007314 CmdArgs.push_back("-lpthread");
7315
7316 CmdArgs.push_back("-lc");
7317
7318 if (Args.hasArg(options::OPT_static))
7319 CmdArgs.push_back("--end-group");
7320 else
Stephen Hines651f13c2014-04-23 16:59:28 -07007321 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth2ba542c2012-05-14 18:31:18 +00007322 }
Rafael Espindolafdda1712010-11-17 22:26:15 +00007323
Rafael Espindola49c64fd2010-12-01 01:52:43 +00007324 if (!Args.hasArg(options::OPT_nostartfiles)) {
7325 const char *crtend;
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00007326 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007327 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00007328 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00007329 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola49c64fd2010-12-01 01:52:43 +00007330 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007331 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00007332
Rafael Espindola49c64fd2010-12-01 01:52:43 +00007333 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00007334 if (!isAndroid)
7335 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola49c64fd2010-12-01 01:52:43 +00007336 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00007337 }
7338
Rafael Espindolac1da9812010-11-07 20:14:31 +00007339 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
7340}
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00007341
Chris Lattner38e317d2010-07-07 16:01:42 +00007342void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00007343 const InputInfo &Output,
7344 const InputInfoList &Inputs,
7345 const ArgList &Args,
7346 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00007347 ArgStringList CmdArgs;
7348
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007349 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner38e317d2010-07-07 16:01:42 +00007350
7351 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00007352 CmdArgs.push_back(Output.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00007353
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007354 for (const auto &II : Inputs)
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00007355 CmdArgs.push_back(II.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00007356
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007357 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00007358 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00007359}
7360
7361void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00007362 const InputInfo &Output,
7363 const InputInfoList &Inputs,
7364 const ArgList &Args,
7365 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00007366 const Driver &D = getToolChain().getDriver();
7367 ArgStringList CmdArgs;
7368
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00007369 if (Output.isFilename()) {
Chris Lattner38e317d2010-07-07 16:01:42 +00007370 CmdArgs.push_back("-o");
7371 CmdArgs.push_back(Output.getFilename());
7372 } else {
7373 assert(Output.isNothing() && "Invalid output.");
7374 }
7375
7376 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman6d402dc2011-12-08 23:54:21 +00007377 !Args.hasArg(options::OPT_nostartfiles)) {
7378 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7379 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7380 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7381 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7382 }
Chris Lattner38e317d2010-07-07 16:01:42 +00007383
7384 Args.AddAllArgs(CmdArgs, options::OPT_L);
7385 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7386 Args.AddAllArgs(CmdArgs, options::OPT_e);
7387
Daniel Dunbar2008fee2010-09-17 00:24:54 +00007388 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00007389
Stephen Hines651f13c2014-04-23 16:59:28 -07007390 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman6d402dc2011-12-08 23:54:21 +00007391
Chris Lattner38e317d2010-07-07 16:01:42 +00007392 if (!Args.hasArg(options::OPT_nostdlib) &&
7393 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00007394 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00007395 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00007396 CmdArgs.push_back("-lm");
7397 }
Chris Lattner38e317d2010-07-07 16:01:42 +00007398 }
7399
7400 if (!Args.hasArg(options::OPT_nostdlib) &&
7401 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman6d402dc2011-12-08 23:54:21 +00007402 if (Args.hasArg(options::OPT_pthread))
7403 CmdArgs.push_back("-lpthread");
7404 CmdArgs.push_back("-lc");
7405 CmdArgs.push_back("-lCompilerRT-Generic");
7406 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7407 CmdArgs.push_back(
Eric Christopher27e2b982012-12-18 00:31:10 +00007408 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00007409 }
7410
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007411 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00007412 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00007413}
7414
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007415/// DragonFly Tools
7416
7417// For now, DragonFly Assemble does just about the same as for
7418// FreeBSD, but this may change soon.
7419void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00007420 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00007421 const InputInfoList &Inputs,
7422 const ArgList &Args,
7423 const char *LinkingOutput) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007424 ArgStringList CmdArgs;
7425
7426 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7427 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00007428 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007429 CmdArgs.push_back("--32");
7430
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007431 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007432
7433 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00007434 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007435
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007436 for (const auto &II : Inputs)
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00007437 CmdArgs.push_back(II.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007438
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007439 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00007440 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007441}
7442
7443void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00007444 const InputInfo &Output,
7445 const InputInfoList &Inputs,
7446 const ArgList &Args,
7447 const char *LinkingOutput) const {
John McCall8cfb7202013-04-11 22:55:55 +00007448 bool UseGCC47 = false;
Daniel Dunbaree788e72009-12-21 18:54:17 +00007449 const Driver &D = getToolChain().getDriver();
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007450 ArgStringList CmdArgs;
7451
John McCall8cfb7202013-04-11 22:55:55 +00007452 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
7453 UseGCC47 = false;
7454
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00007455 if (!D.SysRoot.empty())
7456 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7457
John McCall8cfb7202013-04-11 22:55:55 +00007458 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007459 if (Args.hasArg(options::OPT_static)) {
7460 CmdArgs.push_back("-Bstatic");
7461 } else {
John McCall8cfb7202013-04-11 22:55:55 +00007462 if (Args.hasArg(options::OPT_rdynamic))
7463 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007464 if (Args.hasArg(options::OPT_shared))
7465 CmdArgs.push_back("-Bshareable");
7466 else {
7467 CmdArgs.push_back("-dynamic-linker");
7468 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7469 }
John McCall8cfb7202013-04-11 22:55:55 +00007470 CmdArgs.push_back("--hash-style=both");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007471 }
7472
7473 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7474 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00007475 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007476 CmdArgs.push_back("-m");
7477 CmdArgs.push_back("elf_i386");
7478 }
7479
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00007480 if (Output.isFilename()) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007481 CmdArgs.push_back("-o");
7482 CmdArgs.push_back(Output.getFilename());
7483 } else {
7484 assert(Output.isNothing() && "Invalid output.");
7485 }
7486
7487 if (!Args.hasArg(options::OPT_nostdlib) &&
7488 !Args.hasArg(options::OPT_nostartfiles)) {
7489 if (!Args.hasArg(options::OPT_shared)) {
John McCall8cfb7202013-04-11 22:55:55 +00007490 if (Args.hasArg(options::OPT_pg))
7491 CmdArgs.push_back(Args.MakeArgString(
7492 getToolChain().GetFilePath("gcrt1.o")));
7493 else {
7494 if (Args.hasArg(options::OPT_pie))
7495 CmdArgs.push_back(Args.MakeArgString(
7496 getToolChain().GetFilePath("Scrt1.o")));
7497 else
7498 CmdArgs.push_back(Args.MakeArgString(
7499 getToolChain().GetFilePath("crt1.o")));
7500 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007501 }
John McCall8cfb7202013-04-11 22:55:55 +00007502 CmdArgs.push_back(Args.MakeArgString(
7503 getToolChain().GetFilePath("crti.o")));
7504 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7505 CmdArgs.push_back(Args.MakeArgString(
7506 getToolChain().GetFilePath("crtbeginS.o")));
7507 else
7508 CmdArgs.push_back(Args.MakeArgString(
7509 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007510 }
7511
7512 Args.AddAllArgs(CmdArgs, options::OPT_L);
7513 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7514 Args.AddAllArgs(CmdArgs, options::OPT_e);
7515
Daniel Dunbar2008fee2010-09-17 00:24:54 +00007516 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007517
7518 if (!Args.hasArg(options::OPT_nostdlib) &&
7519 !Args.hasArg(options::OPT_nodefaultlibs)) {
7520 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7521 // rpaths
John McCall8cfb7202013-04-11 22:55:55 +00007522 if (UseGCC47)
7523 CmdArgs.push_back("-L/usr/lib/gcc47");
7524 else
7525 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007526
7527 if (!Args.hasArg(options::OPT_static)) {
John McCall8cfb7202013-04-11 22:55:55 +00007528 if (UseGCC47) {
7529 CmdArgs.push_back("-rpath");
7530 CmdArgs.push_back("/usr/lib/gcc47");
7531 } else {
7532 CmdArgs.push_back("-rpath");
7533 CmdArgs.push_back("/usr/lib/gcc44");
7534 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007535 }
7536
Hans Wennborg76b86c22013-07-18 20:29:38 +00007537 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00007538 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola405861d2010-07-20 12:59:03 +00007539 CmdArgs.push_back("-lm");
7540 }
7541
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007542 if (Args.hasArg(options::OPT_pthread))
Mike Stump4d63f8b2009-10-31 20:11:46 +00007543 CmdArgs.push_back("-lpthread");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007544
7545 if (!Args.hasArg(options::OPT_nolibc)) {
7546 CmdArgs.push_back("-lc");
7547 }
7548
John McCall8cfb7202013-04-11 22:55:55 +00007549 if (UseGCC47) {
7550 if (Args.hasArg(options::OPT_static) ||
7551 Args.hasArg(options::OPT_static_libgcc)) {
7552 CmdArgs.push_back("-lgcc");
7553 CmdArgs.push_back("-lgcc_eh");
7554 } else {
7555 if (Args.hasArg(options::OPT_shared_libgcc)) {
7556 CmdArgs.push_back("-lgcc_pic");
7557 if (!Args.hasArg(options::OPT_shared))
7558 CmdArgs.push_back("-lgcc");
7559 } else {
7560 CmdArgs.push_back("-lgcc");
7561 CmdArgs.push_back("--as-needed");
7562 CmdArgs.push_back("-lgcc_pic");
7563 CmdArgs.push_back("--no-as-needed");
7564 }
7565 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007566 } else {
John McCall8cfb7202013-04-11 22:55:55 +00007567 if (Args.hasArg(options::OPT_shared)) {
7568 CmdArgs.push_back("-lgcc_pic");
7569 } else {
7570 CmdArgs.push_back("-lgcc");
7571 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007572 }
7573 }
7574
7575 if (!Args.hasArg(options::OPT_nostdlib) &&
7576 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall8cfb7202013-04-11 22:55:55 +00007577 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner38e317d2010-07-07 16:01:42 +00007578 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00007579 getToolChain().GetFilePath("crtendS.o")));
John McCall8cfb7202013-04-11 22:55:55 +00007580 else
7581 CmdArgs.push_back(Args.MakeArgString(
7582 getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00007583 CmdArgs.push_back(Args.MakeArgString(
John McCall8cfb7202013-04-11 22:55:55 +00007584 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007585 }
7586
Stephen Hines651f13c2014-04-23 16:59:28 -07007587 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00007588
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007589 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00007590 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00007591}
Michael J. Spencerff58e362010-08-21 21:55:07 +00007592
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007593static void addSanitizerRTWindows(const ToolChain &TC, const ArgList &Args,
7594 ArgStringList &CmdArgs,
7595 const StringRef RTName) {
7596 SmallString<128> LibSanitizer(getCompilerRTLibDir(TC));
7597 llvm::sys::path::append(LibSanitizer,
7598 Twine("clang_rt.") + RTName + ".lib");
7599 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
7600}
7601
Michael J. Spencerff58e362010-08-21 21:55:07 +00007602void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
7603 const InputInfo &Output,
7604 const InputInfoList &Inputs,
7605 const ArgList &Args,
7606 const char *LinkingOutput) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00007607 ArgStringList CmdArgs;
7608
7609 if (Output.isFilename()) {
Daniel Dunbare5a37f42010-09-17 00:45:02 +00007610 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
7611 Output.getFilename()));
Michael J. Spencerff58e362010-08-21 21:55:07 +00007612 } else {
7613 assert(Output.isNothing() && "Invalid output.");
7614 }
7615
7616 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg746974d2013-08-09 17:38:42 +00007617 !Args.hasArg(options::OPT_nostartfiles) &&
7618 !C.getDriver().IsCLMode()) {
Michael J. Spencerff58e362010-08-21 21:55:07 +00007619 CmdArgs.push_back("-defaultlib:libcmt");
7620 }
7621
7622 CmdArgs.push_back("-nologo");
7623
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007624 if (Args.hasArg(options::OPT_g_Group)) {
7625 CmdArgs.push_back("-debug");
7626 }
7627
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00007628 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
7629
7630 if (DLL) {
7631 CmdArgs.push_back(Args.MakeArgString("-dll"));
7632
7633 SmallString<128> ImplibName(Output.getFilename());
7634 llvm::sys::path::replace_extension(ImplibName, "lib");
7635 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
7636 ImplibName.str()));
7637 }
7638
Peter Collingbournec6911a22013-11-01 18:16:25 +00007639 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg324cc032013-08-28 17:36:07 +00007640 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborg2ddffa12013-08-30 10:50:52 +00007641 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00007642 // FIXME: Handle 64-bit.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007643 if (DLL) {
7644 addSanitizerRTWindows(getToolChain(), Args, CmdArgs,
7645 "asan_dll_thunk-i386");
7646 } else {
7647 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan-i386");
7648 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan_cxx-i386");
7649 }
Hans Wennborg3c4da0c2013-08-27 18:10:21 +00007650 }
7651
Michael J. Spencera2284f52012-06-18 16:56:04 +00007652 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg5db95272013-08-13 23:38:57 +00007653 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencera2284f52012-06-18 16:56:04 +00007654
7655 // Add filenames immediately.
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007656 for (const auto &Input : Inputs)
7657 if (Input.isFilename())
7658 CmdArgs.push_back(Input.getFilename());
Hans Wennborg2388b772013-08-14 01:24:35 +00007659 else
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007660 Input.getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencerff58e362010-08-21 21:55:07 +00007661
7662 const char *Exec =
Daniel Dunbar2008fee2010-09-17 00:24:54 +00007663 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerff58e362010-08-21 21:55:07 +00007664 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7665}
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00007666
7667void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
7668 const InputInfo &Output,
7669 const InputInfoList &Inputs,
7670 const ArgList &Args,
7671 const char *LinkingOutput) const {
7672 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
7673}
7674
Hans Wennborgdc40bf92013-09-20 18:16:35 +00007675// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7676// If one cannot be found, return FallbackName.
7677// We do this special search to prevent clang-cl from falling back onto itself
7678// if it's available as cl.exe on the path.
7679static std::string FindFallback(const char *FallbackName,
7680 const char *ClangProgramPath) {
7681 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7682 if (!OptPath.hasValue())
7683 return FallbackName;
7684
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007685 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Hans Wennborgdc40bf92013-09-20 18:16:35 +00007686 SmallVector<StringRef, 8> PathSegments;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007687 llvm::SplitString(OptPath.getValue(), PathSegments, EnvPathSeparatorStr);
Hans Wennborgdc40bf92013-09-20 18:16:35 +00007688
7689 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
7690 const StringRef &PathSegment = PathSegments[i];
7691 if (PathSegment.empty())
7692 continue;
7693
7694 SmallString<128> FilePath(PathSegment);
7695 llvm::sys::path::append(FilePath, FallbackName);
7696 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7697 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7698 return FilePath.str();
7699 }
7700
7701 return FallbackName;
7702}
7703
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00007704Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7705 const InputInfo &Output,
7706 const InputInfoList &Inputs,
7707 const ArgList &Args,
7708 const char *LinkingOutput) const {
7709 ArgStringList CmdArgs;
Hans Wennborg1413d622013-09-24 17:36:21 +00007710 CmdArgs.push_back("/nologo");
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00007711 CmdArgs.push_back("/c"); // Compile only.
7712 CmdArgs.push_back("/W0"); // No warnings.
7713
7714 // The goal is to be able to invoke this tool correctly based on
7715 // any flag accepted by clang-cl.
7716
7717 // These are spelled the same way in clang and cl.exe,.
7718 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7719 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborga8ffc162013-09-24 18:17:21 +00007720
7721 // Optimization level.
7722 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7723 if (A->getOption().getID() == options::OPT_O0) {
7724 CmdArgs.push_back("/Od");
7725 } else {
7726 StringRef OptLevel = A->getValue();
7727 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7728 A->render(Args, CmdArgs);
7729 else if (OptLevel == "3")
7730 CmdArgs.push_back("/Ox");
7731 }
7732 }
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00007733
7734 // Flags for which clang-cl have an alias.
7735 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7736
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007737 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
7738 /*default=*/false))
7739 CmdArgs.push_back("/GR-");
Stephen Hines651f13c2014-04-23 16:59:28 -07007740 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
7741 options::OPT_fno_function_sections))
7742 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
7743 ? "/Gy"
7744 : "/Gy-");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007745 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
7746 options::OPT_fno_data_sections))
7747 CmdArgs.push_back(
7748 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00007749 if (Args.hasArg(options::OPT_fsyntax_only))
7750 CmdArgs.push_back("/Zs");
Stephen Hines651f13c2014-04-23 16:59:28 -07007751 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
7752 CmdArgs.push_back("/Z7");
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00007753
Hans Wennborg4fe475a2013-09-27 17:54:18 +00007754 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007755 for (const auto &Include : Includes)
7756 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg4fe475a2013-09-27 17:54:18 +00007757
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00007758 // Flags that can simply be passed through.
7759 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7760 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007761 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00007762
7763 // The order of these flags is relevant, so pick the last one.
7764 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7765 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7766 A->render(Args, CmdArgs);
7767
7768
7769 // Input filename.
7770 assert(Inputs.size() == 1);
7771 const InputInfo &II = Inputs[0];
7772 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7773 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7774 if (II.isFilename())
7775 CmdArgs.push_back(II.getFilename());
7776 else
7777 II.getInputArg().renderAsInput(Args, CmdArgs);
7778
7779 // Output filename.
7780 assert(Output.getType() == types::TY_Object);
7781 const char *Fo = Args.MakeArgString(std::string("/Fo") +
7782 Output.getFilename());
7783 CmdArgs.push_back(Fo);
7784
Hans Wennborgdc40bf92013-09-20 18:16:35 +00007785 const Driver &D = getToolChain().getDriver();
7786 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborgdc40bf92013-09-20 18:16:35 +00007787 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00007788}
Robert Lytton4e490e22013-10-11 10:29:40 +00007789
7790
7791/// XCore Tools
7792// We pass assemble and link construction to the xcc tool.
7793
7794void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7795 const InputInfo &Output,
7796 const InputInfoList &Inputs,
7797 const ArgList &Args,
7798 const char *LinkingOutput) const {
7799 ArgStringList CmdArgs;
7800
7801 CmdArgs.push_back("-o");
7802 CmdArgs.push_back(Output.getFilename());
7803
7804 CmdArgs.push_back("-c");
7805
Stephen Hines651f13c2014-04-23 16:59:28 -07007806 if (Args.hasArg(options::OPT_v))
7807 CmdArgs.push_back("-v");
7808
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007809 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
7810 if (!A->getOption().matches(options::OPT_g0))
7811 CmdArgs.push_back("-g");
Stephen Hines651f13c2014-04-23 16:59:28 -07007812
7813 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
7814 false))
7815 CmdArgs.push_back("-fverbose-asm");
Robert Lytton4e490e22013-10-11 10:29:40 +00007816
7817 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7818 options::OPT_Xassembler);
7819
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007820 for (const auto &II : Inputs)
Robert Lytton4e490e22013-10-11 10:29:40 +00007821 CmdArgs.push_back(II.getFilename());
Robert Lytton4e490e22013-10-11 10:29:40 +00007822
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007823 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Robert Lytton4e490e22013-10-11 10:29:40 +00007824 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7825}
7826
7827void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
7828 const InputInfo &Output,
7829 const InputInfoList &Inputs,
7830 const ArgList &Args,
7831 const char *LinkingOutput) const {
7832 ArgStringList CmdArgs;
7833
7834 if (Output.isFilename()) {
7835 CmdArgs.push_back("-o");
7836 CmdArgs.push_back(Output.getFilename());
7837 } else {
7838 assert(Output.isNothing() && "Invalid output.");
7839 }
7840
Stephen Hines651f13c2014-04-23 16:59:28 -07007841 if (Args.hasArg(options::OPT_v))
7842 CmdArgs.push_back("-v");
7843
7844 ExceptionSettings EH = exceptionSettings(Args, getToolChain().getTriple());
7845 if (EH.ShouldUseExceptionTables)
7846 CmdArgs.push_back("-fexceptions");
7847
Robert Lytton4e490e22013-10-11 10:29:40 +00007848 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7849
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007850 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Robert Lytton4e490e22013-10-11 10:29:40 +00007851 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7852}