blob: 397f641f1b6d48b3948306549a64afb31795f7e4 [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"
13#include "clang/Basic/ObjCRuntime.h"
Kevin Enderby02341792013-01-17 21:38:06 +000014#include "clang/Basic/Version.h"
Daniel Dunbar1d460332009-03-18 10:01:51 +000015#include "clang/Driver/Action.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000016#include "clang/Driver/Compilation.h"
Daniel Dunbaree848a72009-10-29 02:39:57 +000017#include "clang/Driver/Driver.h"
18#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000019#include "clang/Driver/Job.h"
Daniel Dunbar265e9ef2009-11-19 04:25:22 +000020#include "clang/Driver/Options.h"
Alexey Samsonov1b8f12d2013-08-19 09:14:21 +000021#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000022#include "clang/Driver/ToolChain.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000023#include "clang/Driver/Util.h"
Daniel Dunbar88137642009-09-09 22:32:48 +000024#include "llvm/ADT/SmallString.h"
Hans Wennborgdc40bf92013-09-20 18:16:35 +000025#include "llvm/ADT/StringExtras.h"
Douglas Gregor55d3f7a2009-10-29 00:41:01 +000026#include "llvm/ADT/StringSwitch.h"
Daniel Dunbar5b750fe2009-09-09 22:32:34 +000027#include "llvm/ADT/Twine.h"
Reid Klecknerb1e25a12013-06-14 17:17:23 +000028#include "llvm/Option/Arg.h"
29#include "llvm/Option/ArgList.h"
30#include "llvm/Option/Option.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000031#include "llvm/Support/ErrorHandling.h"
Michael J. Spencer32bef4e2011-01-10 02:34:13 +000032#include "llvm/Support/FileSystem.h"
Daniel Dunbar02633b52009-03-26 16:23:12 +000033#include "llvm/Support/Format.h"
Michael J. Spencer03013fa2010-11-29 18:12:39 +000034#include "llvm/Support/Host.h"
Hans Wennborgdc40bf92013-09-20 18:16:35 +000035#include "llvm/Support/Path.h"
Rafael Espindola8db7ec02013-06-25 14:29:51 +000036#include "llvm/Support/Program.h"
Michael J. Spencer03013fa2010-11-29 18:12:39 +000037#include "llvm/Support/Process.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000038#include "llvm/Support/raw_ostream.h"
Reid Klecknerb1e25a12013-06-14 17:17:23 +000039#include <sys/stat.h>
Daniel Dunbar871adcf2009-03-18 07:06:02 +000040
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000041using namespace clang::driver;
42using namespace clang::driver::tools;
Chris Lattner5f9e2722011-07-23 10:55:15 +000043using namespace clang;
Reid Klecknerb1e25a12013-06-14 17:17:23 +000044using namespace llvm::opt;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000045
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +000046/// CheckPreprocessingOptions - Perform some validation of preprocessing
47/// arguments that is shared with gcc.
48static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
49 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Hans Wennborg76b86c22013-07-18 20:29:38 +000050 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP())
Chris Lattner5f9e2722011-07-23 10:55:15 +000051 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +000052 << A->getAsString(Args) << "-E";
53}
54
Daniel Dunbare2fd6642009-09-10 01:21:12 +000055/// CheckCodeGenerationOptions - Perform some validation of code generation
56/// arguments that is shared with gcc.
57static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
58 // In gcc, only ARM checks this, but it seems reasonable to check universally.
59 if (Args.hasArg(options::OPT_static))
60 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
61 options::OPT_mdynamic_no_pic))
Chris Lattner5f9e2722011-07-23 10:55:15 +000062 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbare2fd6642009-09-10 01:21:12 +000063 << A->getAsString(Args) << "-static";
64}
65
Chris Lattner3edbeb72010-03-29 17:55:58 +000066// Quote target names for inclusion in GNU Make dependency files.
67// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner5f9e2722011-07-23 10:55:15 +000068static void QuoteTarget(StringRef Target,
69 SmallVectorImpl<char> &Res) {
Chris Lattner3edbeb72010-03-29 17:55:58 +000070 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
71 switch (Target[i]) {
72 case ' ':
73 case '\t':
74 // Escape the preceding backslashes
75 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
76 Res.push_back('\\');
77
78 // Escape the space/tab
79 Res.push_back('\\');
80 break;
81 case '$':
82 Res.push_back('$');
83 break;
84 case '#':
85 Res.push_back('\\');
86 break;
87 default:
88 break;
89 }
90
91 Res.push_back(Target[i]);
92 }
93}
94
Bill Wendling3d717152012-03-12 22:10:06 +000095static void addDirectoryList(const ArgList &Args,
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +000096 ArgStringList &CmdArgs,
97 const char *ArgName,
Bill Wendling3d717152012-03-12 22:10:06 +000098 const char *EnvVar) {
99 const char *DirList = ::getenv(EnvVar);
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000100 bool CombinedArg = false;
101
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000102 if (!DirList)
103 return; // Nothing to do.
104
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000105 StringRef Name(ArgName);
106 if (Name.equals("-I") || Name.equals("-L"))
107 CombinedArg = true;
108
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000109 StringRef Dirs(DirList);
110 if (Dirs.empty()) // Empty string should not add '.'.
111 return;
112
113 StringRef::size_type Delim;
Rafael Espindola8db7ec02013-06-25 14:29:51 +0000114 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000115 if (Delim == 0) { // Leading colon.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000116 if (CombinedArg) {
117 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
118 } else {
119 CmdArgs.push_back(ArgName);
120 CmdArgs.push_back(".");
121 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000122 } else {
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000123 if (CombinedArg) {
124 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
125 } else {
126 CmdArgs.push_back(ArgName);
127 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
128 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000129 }
Nico Weber09c5c392012-03-19 15:00:03 +0000130 Dirs = Dirs.substr(Delim + 1);
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000131 }
132
133 if (Dirs.empty()) { // Trailing colon.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000134 if (CombinedArg) {
135 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
136 } else {
137 CmdArgs.push_back(ArgName);
138 CmdArgs.push_back(".");
139 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000140 } else { // Add the last path.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000141 if (CombinedArg) {
142 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
143 } else {
144 CmdArgs.push_back(ArgName);
145 CmdArgs.push_back(Args.MakeArgString(Dirs));
146 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000147 }
148}
149
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000150static void AddLinkerInputs(const ToolChain &TC,
151 const InputInfoList &Inputs, const ArgList &Args,
152 ArgStringList &CmdArgs) {
153 const Driver &D = TC.getDriver();
154
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000155 // Add extra linker input arguments which are not treated as inputs
156 // (constructed via -Xarch_).
157 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
158
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000159 for (InputInfoList::const_iterator
160 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
161 const InputInfo &II = *it;
162
163 if (!TC.HasNativeLLVMSupport()) {
164 // Don't try to pass LLVM inputs unless we have native support.
165 if (II.getType() == types::TY_LLVM_IR ||
166 II.getType() == types::TY_LTO_IR ||
167 II.getType() == types::TY_LLVM_BC ||
168 II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000169 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000170 << TC.getTripleString();
171 }
172
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000173 // Add filenames immediately.
174 if (II.isFilename()) {
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000175 CmdArgs.push_back(II.getFilename());
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000176 continue;
177 }
178
179 // Otherwise, this is a linker input argument.
180 const Arg &A = II.getInputArg();
181
182 // Handle reserved library options.
183 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +0000184 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Sen7433fed2010-09-17 18:39:08 +0000185 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
186 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000187 } else
188 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000189 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000190
191 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendling3d717152012-03-12 22:10:06 +0000192 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000193}
194
John McCallf85e1932011-06-15 23:02:42 +0000195/// \brief Determine whether Objective-C automated reference counting is
196/// enabled.
197static bool isObjCAutoRefCount(const ArgList &Args) {
198 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
199}
200
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000201/// \brief Determine whether we are linking the ObjC runtime.
202static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilsona7635f12012-08-07 19:58:00 +0000203 if (isObjCAutoRefCount(Args)) {
204 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000205 return true;
Bob Wilsona7635f12012-08-07 19:58:00 +0000206 }
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000207 return Args.hasArg(options::OPT_fobjc_link_runtime);
208}
209
Rafael Espindoladb3f24a2011-06-02 18:58:46 +0000210static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling3f4be6f2011-06-27 19:15:03 +0000211 ArgStringList &CmdArgs,
212 llvm::Triple Triple) {
213 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
214 Args.hasArg(options::OPT_fprofile_generate) ||
215 Args.hasArg(options::OPT_fcreate_profile) ||
216 Args.hasArg(options::OPT_coverage)))
217 return;
218
219 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
220 // the link line. We cannot do the same thing because unlike gcov there is a
221 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
222 // not supported by old linkers.
Benjamin Kramerf2db04c2011-11-07 16:02:25 +0000223 std::string ProfileRT =
224 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling3f4be6f2011-06-27 19:15:03 +0000225
Bill Wendling3f4be6f2011-06-27 19:15:03 +0000226 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindoladb3f24a2011-06-02 18:58:46 +0000227}
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");
299 }
300
Peter Collingbournebb527862011-07-12 19:35:15 +0000301 if (Args.hasArg(options::OPT_MG)) {
302 if (!A || A->getOption().matches(options::OPT_MD) ||
303 A->getOption().matches(options::OPT_MMD))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000304 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbournebb527862011-07-12 19:35:15 +0000305 CmdArgs.push_back("-MG");
306 }
307
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000308 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000309
310 // Convert all -MQ <target> args to -MT <quoted target>
311 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
312 options::OPT_MQ),
313 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000314 const Arg *A = *it;
315 A->claim();
Chris Lattner3edbeb72010-03-29 17:55:58 +0000316
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000317 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattner3edbeb72010-03-29 17:55:58 +0000318 CmdArgs.push_back("-MT");
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000319 SmallString<128> Quoted;
Richard Smith1d489cf2012-11-01 04:30:05 +0000320 QuoteTarget(A->getValue(), Quoted);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000321 CmdArgs.push_back(Args.MakeArgString(Quoted));
322
323 // -MT flag - no change
324 } else {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000325 A->render(Args, CmdArgs);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000326 }
327 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000328
Douglas Gregordf91ef32009-04-18 00:34:01 +0000329 // Add -i* options, and automatically translate to
330 // -include-pch/-include-pth for transparent PCH support. It's
331 // wonky, but we include looking for .gch so we can support seamless
332 // replacement into a build system already set up to be generating
333 // .gch files.
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000334 bool RenderedImplicitInclude = false;
Daniel Dunbarcdd96862009-11-25 11:53:23 +0000335 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
336 ie = Args.filtered_end(); it != ie; ++it) {
337 const Arg *A = it;
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000338
339 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000340 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
341 RenderedImplicitInclude = true;
342
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +0000343 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000344 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000345
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000346 bool FoundPTH = false;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000347 bool FoundPCH = false;
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000348 SmallString<128> P(A->getValue());
349 // We want the files to have a name like foo.h.pch. Add a dummy extension
350 // so that replace_extension does the right thing.
351 P += ".dummy";
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000352 if (UsePCH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000353 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola829e88d2013-06-25 14:48:00 +0000354 if (llvm::sys::fs::exists(P.str()))
Douglas Gregordf91ef32009-04-18 00:34:01 +0000355 FoundPCH = true;
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000356 }
357
Douglas Gregordf91ef32009-04-18 00:34:01 +0000358 if (!FoundPCH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000359 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola829e88d2013-06-25 14:48:00 +0000360 if (llvm::sys::fs::exists(P.str()))
Douglas Gregordf91ef32009-04-18 00:34:01 +0000361 FoundPTH = true;
Mike Stump1eb44332009-09-09 15:08:12 +0000362 }
363
Douglas Gregordf91ef32009-04-18 00:34:01 +0000364 if (!FoundPCH && !FoundPTH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000365 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola829e88d2013-06-25 14:48:00 +0000366 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000367 FoundPCH = UsePCH;
368 FoundPTH = !UsePCH;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000369 }
Douglas Gregordf91ef32009-04-18 00:34:01 +0000370 }
371
372 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000373 if (IsFirstImplicitInclude) {
374 A->claim();
375 if (UsePCH)
376 CmdArgs.push_back("-include-pch");
377 else
378 CmdArgs.push_back("-include-pth");
379 CmdArgs.push_back(Args.MakeArgString(P.str()));
380 continue;
381 } else {
382 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000383 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000384 << P.str() << A->getAsString(Args);
385 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000386 }
387 }
388
389 // Not translated, render as usual.
390 A->claim();
391 A->render(Args, CmdArgs);
392 }
393
394 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor65e02fa2011-07-28 04:45:53 +0000395 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
396 options::OPT_index_header_map);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000397
398 // Add -Wp, and -Xassembler if using the preprocessor.
399
400 // FIXME: There is a very unfortunate problem here, some troubled
401 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
402 // really support that we would have to parse and then translate
403 // those options. :(
404 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
405 options::OPT_Xpreprocessor);
Daniel Dunbar607d7f62009-10-29 01:53:44 +0000406
407 // -I- is a deprecated GCC feature, reject it.
408 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000409 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000410
411 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
412 // -isysroot to the CC1 invocation.
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000413 StringRef sysroot = C.getSysRoot();
414 if (sysroot != "") {
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000415 if (!Args.hasArg(options::OPT_isysroot)) {
416 CmdArgs.push_back("-isysroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000417 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000418 }
419 }
Douglas Gregor2a060852013-02-07 00:21:12 +0000420
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000421 // Parse additional include paths from environment variables.
Chandler Carruthb5870e72011-11-04 07:12:58 +0000422 // FIXME: We should probably sink the logic for handling these from the
423 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000424 // CPATH - included following the user specified includes (but prior to
425 // builtin and standard includes).
Bill Wendling3d717152012-03-12 22:10:06 +0000426 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000427 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendling3d717152012-03-12 22:10:06 +0000428 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000429 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendling3d717152012-03-12 22:10:06 +0000430 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000431 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendling3d717152012-03-12 22:10:06 +0000432 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000433 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendling3d717152012-03-12 22:10:06 +0000434 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth88491fc2011-11-04 07:12:53 +0000435
Chandler Carruth88491fc2011-11-04 07:12:53 +0000436 // Add C++ include arguments, if needed.
Chandler Carrutha4614422011-11-04 07:43:33 +0000437 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth7ffa0322011-11-04 07:34:47 +0000438 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carruth7d7e9f92011-11-05 20:17:13 +0000439
440 // Add system include arguments.
441 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000442}
443
Daniel Dunbar1d65e4b2009-09-10 22:59:51 +0000444/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbar728a5122009-09-10 06:49:20 +0000445/// CPU.
446//
447// FIXME: This is redundant with -mcpu, why does LLVM use this.
448// FIXME: tblgen this, or kill it!
Chris Lattner5f9e2722011-07-23 10:55:15 +0000449static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosierae1aee62011-10-07 17:48:56 +0000450 return llvm::StringSwitch<const char *>(CPU)
Tim Northover4889a1f2013-06-13 15:02:46 +0000451 .Case("strongarm", "v4")
Chad Rosierae1aee62011-10-07 17:48:56 +0000452 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
453 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
454 .Cases("arm920", "arm920t", "arm922t", "v4t")
455 .Cases("arm940t", "ep9312","v4t")
456 .Cases("arm10tdmi", "arm1020t", "v5")
457 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
458 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
459 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
460 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
461 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
462 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonfc553452013-03-04 22:37:46 +0000463 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin5df40452013-09-13 17:02:54 +0000464 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "v7")
465 .Cases("cortex-r4", "cortex-r5", "v7r")
Bob Wilson57f6d192012-03-21 17:19:12 +0000466 .Case("cortex-m0", "v6m")
Bob Wilson2503ebd2013-03-04 22:37:49 +0000467 .Case("cortex-m3", "v7m")
468 .Case("cortex-m4", "v7em")
Bob Wilson336bfa32012-09-29 23:52:50 +0000469 .Case("cortex-a9-mp", "v7f")
470 .Case("swift", "v7s")
Bernard Ogdenc4272492013-10-24 18:32:36 +0000471 .Cases("cortex-a53", "cortex-a57", "v8")
Chad Rosierae1aee62011-10-07 17:48:56 +0000472 .Default("");
Daniel Dunbar728a5122009-09-10 06:49:20 +0000473}
474
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000475/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
476//
477// FIXME: tblgen this.
478static std::string getARMTargetCPU(const ArgList &Args,
479 const llvm::Triple &Triple) {
480 // FIXME: Warn on inconsistent use of -mcpu and -march.
481
482 // If we have -mcpu=, use that.
483 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000484 StringRef MCPU = A->getValue();
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000485 // Handle -mcpu=native.
486 if (MCPU == "native")
487 return llvm::sys::getHostCPUName();
488 else
489 return MCPU;
490 }
491
492 StringRef MArch;
493 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
494 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smith1d489cf2012-11-01 04:30:05 +0000495 MArch = A->getValue();
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000496 } else {
497 // Otherwise, use the Arch from the triple.
498 MArch = Triple.getArchName();
499 }
500
501 // Handle -march=native.
502 std::string NativeMArch;
503 if (MArch == "native") {
504 std::string CPU = llvm::sys::getHostCPUName();
505 if (CPU != "generic") {
506 // Translate the native cpu into the architecture. The switch below will
507 // then chose the minimum cpu for that arch.
508 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
509 MArch = NativeMArch;
510 }
511 }
512
513 return llvm::StringSwitch<const char *>(MArch)
514 .Cases("armv2", "armv2a","arm2")
515 .Case("armv3", "arm6")
516 .Case("armv3m", "arm7m")
Tim Northover4889a1f2013-06-13 15:02:46 +0000517 .Case("armv4", "strongarm")
518 .Case("armv4t", "arm7tdmi")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000519 .Cases("armv5", "armv5t", "arm10tdmi")
520 .Cases("armv5e", "armv5te", "arm1022e")
521 .Case("armv5tej", "arm926ej-s")
522 .Cases("armv6", "armv6k", "arm1136jf-s")
523 .Case("armv6j", "arm1136j-s")
524 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
525 .Case("armv6t2", "arm1156t2-s")
Bob Wilson2503ebd2013-03-04 22:37:49 +0000526 .Cases("armv6m", "armv6-m", "cortex-m0")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000527 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilson2503ebd2013-03-04 22:37:49 +0000528 .Cases("armv7em", "armv7e-m", "cortex-m4")
Bob Wilson336bfa32012-09-29 23:52:50 +0000529 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
530 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000531 .Cases("armv7r", "armv7-r", "cortex-r4")
532 .Cases("armv7m", "armv7-m", "cortex-m3")
Joey Gouly4ec8d5b2013-06-26 17:19:48 +0000533 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000534 .Case("ep9312", "ep9312")
535 .Case("iwmmxt", "iwmmxt")
536 .Case("xscale", "xscale")
Tim Northover4889a1f2013-06-13 15:02:46 +0000537 // If all else failed, return the most base CPU with thumb interworking
538 // supported by LLVM.
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000539 .Default("arm7tdmi");
540}
541
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000542// FIXME: Move to target hook.
543static bool isSignedCharDefault(const llvm::Triple &Triple) {
544 switch (Triple.getArch()) {
545 default:
546 return true;
547
Tim Northoverc264e162013-01-31 12:13:10 +0000548 case llvm::Triple::aarch64:
Jim Grosbach5b4e7b12011-05-24 15:40:46 +0000549 case llvm::Triple::arm:
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000550 case llvm::Triple::ppc:
551 case llvm::Triple::ppc64:
Bob Wilson905c45f2011-10-14 05:03:44 +0000552 if (Triple.isOSDarwin())
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000553 return true;
554 return false;
Ulrich Weigandb8409212013-05-06 16:26:41 +0000555
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000556 case llvm::Triple::ppc64le:
Ulrich Weigandb8409212013-05-06 16:26:41 +0000557 case llvm::Triple::systemz:
Robert Lytton5f15f4d2013-08-13 09:43:10 +0000558 case llvm::Triple::xcore:
Ulrich Weigandb8409212013-05-06 16:26:41 +0000559 return false;
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000560 }
561}
562
Robert Lytton5f15f4d2013-08-13 09:43:10 +0000563static bool isNoCommonDefault(const llvm::Triple &Triple) {
564 switch (Triple.getArch()) {
565 default:
566 return false;
567
568 case llvm::Triple::xcore:
569 return true;
570 }
571}
572
Chad Rosier99317272012-04-04 20:51:35 +0000573// Handle -mfpu=.
574//
575// FIXME: Centralize feature selection, defaulting shouldn't be also in the
576// frontend target.
Amara Emersonfe7ed042013-10-01 10:20:54 +0000577static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
578 const ArgList &Args,
579 std::vector<const char *> &Features) {
580 StringRef FPU = A->getValue();
581 if (FPU == "fp-armv8") {
582 Features.push_back("+fp-armv8");
583 } else if (FPU == "neon-fp-armv8") {
584 Features.push_back("+fp-armv8");
585 Features.push_back("+neon");
586 } else if (FPU == "crypto-neon-fp-armv8") {
587 Features.push_back("+fp-armv8");
588 Features.push_back("+neon");
589 Features.push_back("+crypto");
590 } else if (FPU == "neon") {
591 Features.push_back("+neon");
592 } else if (FPU == "none") {
593 Features.push_back("-fp-armv8");
594 Features.push_back("-crypto");
595 Features.push_back("-neon");
596 } else
597 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
598}
599
Silviu Baranga1db2e272013-10-21 10:54:53 +0000600// Handle -mhwdiv=.
601static void getARMHWDivFeatures(const Driver &D, const Arg *A,
602 const ArgList &Args,
603 std::vector<const char *> &Features) {
604 StringRef HWDiv = A->getValue();
605 if (HWDiv == "arm") {
606 Features.push_back("+hwdiv-arm");
607 Features.push_back("-hwdiv");
608 } else if (HWDiv == "thumb") {
609 Features.push_back("-hwdiv-arm");
610 Features.push_back("+hwdiv");
611 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
612 Features.push_back("+hwdiv-arm");
613 Features.push_back("+hwdiv");
614 } else if (HWDiv == "none") {
615 Features.push_back("-hwdiv-arm");
616 Features.push_back("-hwdiv");
617 } else
618 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
619}
620
Amara Emersonfe7ed042013-10-01 10:20:54 +0000621// Handle -mfpu=.
622//
623// FIXME: Centralize feature selection, defaulting shouldn't be also in the
624// frontend target.
625static void getARMFPUFeatures(const Driver &D, const Arg *A,
626 const ArgList &Args,
627 std::vector<const char *> &Features) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000628 StringRef FPU = A->getValue();
Chad Rosier99317272012-04-04 20:51:35 +0000629
630 // Set the target features based on the FPU.
631 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
632 // Disable any default FPU support.
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000633 Features.push_back("-vfp2");
634 Features.push_back("-vfp3");
635 Features.push_back("-neon");
Chad Rosier99317272012-04-04 20:51:35 +0000636 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000637 Features.push_back("+vfp3");
638 Features.push_back("+d16");
639 Features.push_back("-neon");
Chad Rosier99317272012-04-04 20:51:35 +0000640 } else if (FPU == "vfp") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000641 Features.push_back("+vfp2");
642 Features.push_back("-neon");
Chad Rosier99317272012-04-04 20:51:35 +0000643 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000644 Features.push_back("+vfp3");
645 Features.push_back("-neon");
Joey Goulycbed3bf2013-06-27 13:19:54 +0000646 } else if (FPU == "fp-armv8") {
Joey Gouly2b33b7e2013-09-13 13:48:33 +0000647 Features.push_back("+fp-armv8");
Bernard Ogdenf779e652013-10-24 18:32:51 +0000648 Features.push_back("-neon");
649 Features.push_back("-crypto");
Joey Goulycbed3bf2013-06-27 13:19:54 +0000650 } else if (FPU == "neon-fp-armv8") {
Joey Gouly2b33b7e2013-09-13 13:48:33 +0000651 Features.push_back("+fp-armv8");
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000652 Features.push_back("+neon");
Bernard Ogdenf779e652013-10-24 18:32:51 +0000653 Features.push_back("-crypto");
Amara Emersoncdc532c2013-09-19 13:54:03 +0000654 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersoncdc532c2013-09-19 13:54:03 +0000655 Features.push_back("+fp-armv8");
Bernard Ogdenf779e652013-10-24 18:32:51 +0000656 Features.push_back("+neon");
657 Features.push_back("+crypto");
Chad Rosier99317272012-04-04 20:51:35 +0000658 } else if (FPU == "neon") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000659 Features.push_back("+neon");
Amara Emersonfe7ed042013-10-01 10:20:54 +0000660 } else if (FPU == "none") {
661 Features.push_back("-vfp2");
662 Features.push_back("-vfp3");
663 Features.push_back("-vfp4");
664 Features.push_back("-fp-armv8");
665 Features.push_back("-crypto");
666 Features.push_back("-neon");
Chad Rosier99317272012-04-04 20:51:35 +0000667 } else
668 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
669}
670
Anton Korobeynikove2571792012-04-09 13:38:30 +0000671// Select the float ABI as determined by -msoft-float, -mhard-float, and
672// -mfloat-abi=.
673static StringRef getARMFloatABI(const Driver &D,
674 const ArgList &Args,
675 const llvm::Triple &Triple) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000676 StringRef FloatABI;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000677 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
678 options::OPT_mhard_float,
679 options::OPT_mfloat_abi_EQ)) {
680 if (A->getOption().matches(options::OPT_msoft_float))
681 FloatABI = "soft";
682 else if (A->getOption().matches(options::OPT_mhard_float))
683 FloatABI = "hard";
684 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000685 FloatABI = A->getValue();
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000686 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000687 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000688 << A->getAsString(Args);
689 FloatABI = "soft";
690 }
691 }
692 }
693
694 // If unspecified, choose the default based on the platform.
695 if (FloatABI.empty()) {
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000696 switch (Triple.getOS()) {
Bob Wilson905c45f2011-10-14 05:03:44 +0000697 case llvm::Triple::Darwin:
698 case llvm::Triple::MacOSX:
699 case llvm::Triple::IOS: {
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000700 // Darwin defaults to "softfp" for v6 and v7.
701 //
702 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000703 std::string ArchName =
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000704 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000705 if (StringRef(ArchName).startswith("v6") ||
706 StringRef(ArchName).startswith("v7"))
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000707 FloatABI = "softfp";
708 else
709 FloatABI = "soft";
710 break;
711 }
712
Rafael Espindola27fa2362012-12-13 04:17:14 +0000713 case llvm::Triple::FreeBSD:
714 // FreeBSD defaults to soft float
715 FloatABI = "soft";
716 break;
717
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000718 default:
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000719 switch(Triple.getEnvironment()) {
Jiangning Liuff104a12012-07-31 08:06:29 +0000720 case llvm::Triple::GNUEABIHF:
721 FloatABI = "hard";
722 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000723 case llvm::Triple::GNUEABI:
724 FloatABI = "softfp";
725 break;
726 case llvm::Triple::EABI:
727 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
728 FloatABI = "softfp";
729 break;
Logan Chien94a71422012-09-02 09:30:11 +0000730 case llvm::Triple::Android: {
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000731 std::string ArchName =
Chandler Carruthb43550b2012-01-10 19:47:42 +0000732 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000733 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthb43550b2012-01-10 19:47:42 +0000734 FloatABI = "softfp";
735 else
736 FloatABI = "soft";
737 break;
738 }
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000739 default:
740 // Assume "soft", but warn the user we are guessing.
741 FloatABI = "soft";
Chris Lattner5f9e2722011-07-23 10:55:15 +0000742 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000743 break;
744 }
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000745 }
746 }
747
Anton Korobeynikove2571792012-04-09 13:38:30 +0000748 return FloatABI;
749}
750
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000751static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
752 const ArgList &Args,
753 std::vector<const char *> &Features) {
754 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
755 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
756 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
757 // stripped out by the ARM target.
758 // Use software floating point operations?
759 if (FloatABI == "soft")
760 Features.push_back("+soft-float");
761
762 // Use software floating point argument passing?
763 if (FloatABI != "hard")
764 Features.push_back("+soft-float-abi");
765
766 // Honor -mfpu=.
767 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emersonfe7ed042013-10-01 10:20:54 +0000768 getARMFPUFeatures(D, A, Args, Features);
Silviu Baranga1db2e272013-10-21 10:54:53 +0000769 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
770 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000771
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000772 // Setting -msoft-float effectively disables NEON because of the GCC
773 // implementation, although the same isn't true of VFP or VFP3.
774 if (FloatABI == "soft")
775 Features.push_back("-neon");
776}
Anton Korobeynikove2571792012-04-09 13:38:30 +0000777
778void Clang::AddARMTargetArgs(const ArgList &Args,
779 ArgStringList &CmdArgs,
780 bool KernelOrKext) const {
781 const Driver &D = getToolChain().getDriver();
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000782 // Get the effective triple, which takes into account the deployment target.
783 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
784 llvm::Triple Triple(TripleStr);
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000785 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikove2571792012-04-09 13:38:30 +0000786
787 // Select the ABI to use.
788 //
789 // FIXME: Support -meabi.
790 const char *ABIName = 0;
791 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000792 ABIName = A->getValue();
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000793 } else if (Triple.isOSDarwin()) {
794 // The backend is hardwired to assume AAPCS for M-class processors, ensure
795 // the frontend matches that.
Tim Northoverfc1a75b2013-10-03 14:23:28 +0000796 if (Triple.getEnvironment() == llvm::Triple::EABI ||
797 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000798 ABIName = "aapcs";
799 } else {
800 ABIName = "apcs-gnu";
801 }
Anton Korobeynikove2571792012-04-09 13:38:30 +0000802 } else {
803 // Select the default based on the platform.
804 switch(Triple.getEnvironment()) {
Logan Chien94a71422012-09-02 09:30:11 +0000805 case llvm::Triple::Android:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000806 case llvm::Triple::GNUEABI:
Jiangning Liuff104a12012-07-31 08:06:29 +0000807 case llvm::Triple::GNUEABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000808 ABIName = "aapcs-linux";
809 break;
810 case llvm::Triple::EABI:
811 ABIName = "aapcs";
812 break;
813 default:
814 ABIName = "apcs-gnu";
815 }
816 }
817 CmdArgs.push_back("-target-abi");
818 CmdArgs.push_back(ABIName);
819
Anton Korobeynikove2571792012-04-09 13:38:30 +0000820 // Determine floating point ABI from the options & target defaults.
821 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000822 if (FloatABI == "soft") {
823 // Floating point operations and argument passing are soft.
824 //
825 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbar3b315262009-11-30 08:42:00 +0000826 CmdArgs.push_back("-msoft-float");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000827 CmdArgs.push_back("-mfloat-abi");
828 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000829 } else if (FloatABI == "softfp") {
830 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000831 CmdArgs.push_back("-mfloat-abi");
832 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000833 } else {
834 // Floating point operations and argument passing are hard.
835 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000836 CmdArgs.push_back("-mfloat-abi");
837 CmdArgs.push_back("hard");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000838 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +0000839
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000840 // Kernel code has more strict alignment requirements.
841 if (KernelOrKext) {
Cameron Esfahani57b1da12013-09-14 01:09:11 +0000842 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000843 CmdArgs.push_back("-backend-option");
844 CmdArgs.push_back("-arm-long-calls");
845 }
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000846
Daniel Dunbar3c66d302011-03-22 16:48:17 +0000847 CmdArgs.push_back("-backend-option");
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000848 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000849
850 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000851 CmdArgs.push_back("-backend-option");
Renato Golinebc313d2013-08-15 20:54:45 +0000852 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000853 }
Chad Rosier1b906052011-08-26 00:26:29 +0000854
855 // Setting -mno-global-merge disables the codegen global merge pass. Setting
856 // -mglobal-merge has no effect as the pass is enabled by default.
857 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
858 options::OPT_mno_global_merge)) {
859 if (A->getOption().matches(options::OPT_mno_global_merge))
860 CmdArgs.push_back("-mno-global-merge");
861 }
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000862
Bob Wilsonf6f77bd2013-04-11 18:53:25 +0000863 if (!Args.hasFlag(options::OPT_mimplicit_float,
864 options::OPT_mno_implicit_float,
865 true))
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000866 CmdArgs.push_back("-no-implicit-float");
Renato Golin45bd2942013-08-24 14:44:35 +0000867
868 // llvm does not support reserving registers in general. There is support
869 // for reserving r9 on ARM though (defined as a platform-specific register
870 // in ARM EABI).
871 if (Args.hasArg(options::OPT_ffixed_r9)) {
872 CmdArgs.push_back("-backend-option");
873 CmdArgs.push_back("-arm-reserve-r9");
874 }
Daniel Dunbarb163ef72009-09-10 04:57:17 +0000875}
876
Simon Atanasyana2768be2012-04-07 22:09:23 +0000877// Get CPU and ABI names. They are not independent
878// so we have to calculate them together.
879static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindolab330e402013-08-20 22:12:08 +0000880 const llvm::Triple &Triple,
Simon Atanasyana2768be2012-04-07 22:09:23 +0000881 StringRef &CPUName,
882 StringRef &ABIName) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000883 const char *DefMips32CPU = "mips32";
884 const char *DefMips64CPU = "mips64";
Akira Hatanaka9f360622011-09-26 21:07:52 +0000885
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000886 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan66751bc2013-10-09 12:12:24 +0000887 options::OPT_mcpu_EQ))
888 CPUName = A->getValue();
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000889
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +0000890 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000891 ABIName = A->getValue();
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +0000892 // Convert a GNU style Mips ABI name to the name
893 // accepted by LLVM Mips backend.
894 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
895 .Case("32", "o32")
896 .Case("64", "n64")
897 .Default(ABIName);
898 }
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000899
900 // Setup default CPU and ABI names.
901 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindolab330e402013-08-20 22:12:08 +0000902 switch (Triple.getArch()) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000903 default:
904 llvm_unreachable("Unexpected triple arch name");
905 case llvm::Triple::mips:
906 case llvm::Triple::mipsel:
907 CPUName = DefMips32CPU;
908 break;
909 case llvm::Triple::mips64:
910 case llvm::Triple::mips64el:
911 CPUName = DefMips64CPU;
912 break;
913 }
914 }
915
916 if (!ABIName.empty()) {
917 // Deduce CPU name from ABI name.
918 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyane9616a42013-02-27 14:55:49 +0000919 .Cases("32", "o32", "eabi", DefMips32CPU)
920 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000921 .Default("");
922 }
923 else if (!CPUName.empty()) {
924 // Deduce ABI name from CPU name.
925 ABIName = llvm::StringSwitch<const char *>(CPUName)
926 .Cases("mips32", "mips32r2", "o32")
927 .Cases("mips64", "mips64r2", "n64")
928 .Default("");
929 }
930
931 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyana2768be2012-04-07 22:09:23 +0000932}
933
Simon Atanasyane9616a42013-02-27 14:55:49 +0000934// Convert ABI name to the GNU tools acceptable variant.
935static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
936 return llvm::StringSwitch<llvm::StringRef>(ABI)
937 .Case("o32", "32")
938 .Case("n64", "64")
939 .Default(ABI);
940}
941
Simon Atanasyan5e627792012-06-02 15:06:29 +0000942// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
943// and -mfloat-abi=.
944static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000945 StringRef FloatABI;
Eric Christophered734732010-03-02 02:41:08 +0000946 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000947 options::OPT_mhard_float,
948 options::OPT_mfloat_abi_EQ)) {
Eric Christophered734732010-03-02 02:41:08 +0000949 if (A->getOption().matches(options::OPT_msoft_float))
950 FloatABI = "soft";
951 else if (A->getOption().matches(options::OPT_mhard_float))
952 FloatABI = "hard";
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000953 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000954 FloatABI = A->getValue();
Simon Atanasyan2ed42b82013-04-14 08:37:15 +0000955 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan5e627792012-06-02 15:06:29 +0000956 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000957 FloatABI = "hard";
958 }
959 }
Eric Christophered734732010-03-02 02:41:08 +0000960 }
961
962 // If unspecified, choose the default based on the platform.
963 if (FloatABI.empty()) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000964 // Assume "hard", because it's a default value used by gcc.
965 // When we start to recognize specific target MIPS processors,
966 // we will be able to select the default more correctly.
967 FloatABI = "hard";
Eric Christophered734732010-03-02 02:41:08 +0000968 }
969
Simon Atanasyan5e627792012-06-02 15:06:29 +0000970 return FloatABI;
971}
972
Simon Atanasyandc536f52012-07-05 18:51:43 +0000973static void AddTargetFeature(const ArgList &Args,
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000974 std::vector<const char *> &Features,
975 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyandc536f52012-07-05 18:51:43 +0000976 StringRef FeatureName) {
977 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyandc536f52012-07-05 18:51:43 +0000978 if (A->getOption().matches(OnOpt))
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000979 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyandc536f52012-07-05 18:51:43 +0000980 else
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000981 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyandc536f52012-07-05 18:51:43 +0000982 }
983}
984
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000985static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
986 std::vector<const char *> &Features) {
987 StringRef FloatABI = getMipsFloatABI(D, Args);
988 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
989 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
990 // FIXME: Note, this is a hack. We need to pass the selected float
991 // mode to the MipsTargetInfoBase to define appropriate macros there.
992 // Now it is the only method.
993 Features.push_back("+soft-float");
994 }
995
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +0000996 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
997 if (StringRef(A->getValue()) == "2008")
998 Features.push_back("+nan2008");
999 }
1000
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001001 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1002 options::OPT_mdouble_float, "single-float");
1003 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1004 "mips16");
1005 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1006 options::OPT_mno_micromips, "micromips");
1007 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1008 "dsp");
1009 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1010 "dspr2");
1011 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1012 "msa");
Daniel Sandersaf7ed9e2013-10-17 14:55:58 +00001013 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
1014 "fp64");
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001015}
1016
Simon Atanasyan5e627792012-06-02 15:06:29 +00001017void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyana8141612013-04-14 14:07:41 +00001018 ArgStringList &CmdArgs) const {
Simon Atanasyan5e627792012-06-02 15:06:29 +00001019 const Driver &D = getToolChain().getDriver();
1020 StringRef CPUName;
1021 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00001022 const llvm::Triple &Triple = getToolChain().getTriple();
1023 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan5e627792012-06-02 15:06:29 +00001024
1025 CmdArgs.push_back("-target-abi");
1026 CmdArgs.push_back(ABIName.data());
1027
1028 StringRef FloatABI = getMipsFloatABI(D, Args);
1029
Simon Atanasyane1d792f2013-01-10 12:36:19 +00001030 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
1031
1032 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christophered734732010-03-02 02:41:08 +00001033 // Floating point operations and argument passing are soft.
Eric Christophered734732010-03-02 02:41:08 +00001034 CmdArgs.push_back("-msoft-float");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001035 CmdArgs.push_back("-mfloat-abi");
1036 CmdArgs.push_back("soft");
1037
Simon Atanasyane1d792f2013-01-10 12:36:19 +00001038 if (FloatABI == "hard" && IsMips16) {
1039 CmdArgs.push_back("-mllvm");
1040 CmdArgs.push_back("-mips16-hard-float");
1041 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001042 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001043 else {
1044 // Floating point operations and argument passing are hard.
Eric Christophered734732010-03-02 02:41:08 +00001045 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001046 CmdArgs.push_back("-mfloat-abi");
1047 CmdArgs.push_back("hard");
Eric Christophered734732010-03-02 02:41:08 +00001048 }
Simon Atanasyan0b273ef2012-07-05 14:19:39 +00001049
Simon Atanasyanbda07ac2012-12-01 18:27:21 +00001050 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1051 if (A->getOption().matches(options::OPT_mxgot)) {
1052 CmdArgs.push_back("-mllvm");
1053 CmdArgs.push_back("-mxgot");
1054 }
1055 }
1056
Simon Atanasyan6bdc4c62013-05-11 06:33:44 +00001057 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1058 options::OPT_mno_ldc1_sdc1)) {
1059 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1060 CmdArgs.push_back("-mllvm");
1061 CmdArgs.push_back("-mno-ldc1-sdc1");
1062 }
1063 }
1064
Akira Hatanakacdbc3b32013-07-19 18:58:48 +00001065 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1066 options::OPT_mno_check_zero_division)) {
1067 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1068 CmdArgs.push_back("-mllvm");
1069 CmdArgs.push_back("-mno-check-zero-division");
1070 }
1071 }
1072
Simon Atanasyan9804b762012-08-27 20:55:56 +00001073 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001074 StringRef v = A->getValue();
Simon Atanasyan9804b762012-08-27 20:55:56 +00001075 CmdArgs.push_back("-mllvm");
1076 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1077 A->claim();
1078 }
Eric Christophered734732010-03-02 02:41:08 +00001079}
1080
Hal Finkel02a84272012-06-11 22:35:19 +00001081/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1082static std::string getPPCTargetCPU(const ArgList &Args) {
1083 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001084 StringRef CPUName = A->getValue();
Hal Finkel02a84272012-06-11 22:35:19 +00001085
1086 if (CPUName == "native") {
1087 std::string CPU = llvm::sys::getHostCPUName();
1088 if (!CPU.empty() && CPU != "generic")
1089 return CPU;
1090 else
1091 return "";
1092 }
1093
1094 return llvm::StringSwitch<const char *>(CPUName)
1095 .Case("common", "generic")
1096 .Case("440", "440")
1097 .Case("440fp", "440")
1098 .Case("450", "450")
1099 .Case("601", "601")
1100 .Case("602", "602")
1101 .Case("603", "603")
1102 .Case("603e", "603e")
1103 .Case("603ev", "603ev")
1104 .Case("604", "604")
1105 .Case("604e", "604e")
1106 .Case("620", "620")
Bill Schmidt2821e182013-02-01 20:23:10 +00001107 .Case("630", "pwr3")
Hal Finkel02a84272012-06-11 22:35:19 +00001108 .Case("G3", "g3")
1109 .Case("7400", "7400")
1110 .Case("G4", "g4")
1111 .Case("7450", "7450")
1112 .Case("G4+", "g4+")
1113 .Case("750", "750")
1114 .Case("970", "970")
1115 .Case("G5", "g5")
1116 .Case("a2", "a2")
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001117 .Case("a2q", "a2q")
Hal Finkel7de32962012-09-18 22:25:03 +00001118 .Case("e500mc", "e500mc")
1119 .Case("e5500", "e5500")
Bill Schmidt2821e182013-02-01 20:23:10 +00001120 .Case("power3", "pwr3")
1121 .Case("power4", "pwr4")
1122 .Case("power5", "pwr5")
1123 .Case("power5x", "pwr5x")
Hal Finkel02a84272012-06-11 22:35:19 +00001124 .Case("power6", "pwr6")
Bill Schmidt2821e182013-02-01 20:23:10 +00001125 .Case("power6x", "pwr6x")
Hal Finkel02a84272012-06-11 22:35:19 +00001126 .Case("power7", "pwr7")
Bill Schmidt2821e182013-02-01 20:23:10 +00001127 .Case("pwr3", "pwr3")
1128 .Case("pwr4", "pwr4")
1129 .Case("pwr5", "pwr5")
1130 .Case("pwr5x", "pwr5x")
1131 .Case("pwr6", "pwr6")
1132 .Case("pwr6x", "pwr6x")
1133 .Case("pwr7", "pwr7")
Hal Finkel02a84272012-06-11 22:35:19 +00001134 .Case("powerpc", "ppc")
1135 .Case("powerpc64", "ppc64")
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001136 .Case("powerpc64le", "ppc64le")
Hal Finkel02a84272012-06-11 22:35:19 +00001137 .Default("");
1138 }
1139
1140 return "";
1141}
1142
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001143static void getPPCTargetFeatures(const ArgList &Args,
1144 std::vector<const char *> &Features) {
Eric Christopherd5e59fc2013-10-16 20:40:08 +00001145 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1146 ie = Args.filtered_end();
1147 it != ie; ++it) {
1148 StringRef Name = (*it)->getOption().getName();
1149 (*it)->claim();
1150
1151 // Skip over "-m".
1152 assert(Name.startswith("m") && "Invalid feature name.");
1153 Name = Name.substr(1);
1154
1155 bool IsNegative = Name.startswith("no-");
1156 if (IsNegative)
1157 Name = Name.substr(3);
1158
1159 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1160 // pass the correct option to the backend while calling the frontend
1161 // option the same.
1162 // TODO: Change the LLVM backend option maybe?
1163 if (Name == "mfcrf")
1164 Name = "mfocrf";
1165
1166 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1167 }
1168
1169 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001170 AddTargetFeature(Args, Features, options::OPT_faltivec,
1171 options::OPT_fno_altivec, "altivec");
Hal Finkel02a84272012-06-11 22:35:19 +00001172}
1173
Tom Stellarde25d2f62013-04-01 20:56:53 +00001174/// Get the (LLVM) name of the R600 gpu we are targeting.
1175static std::string getR600TargetGPU(const ArgList &Args) {
1176 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001177 const char *GPUName = A->getValue();
Tom Stellarde25d2f62013-04-01 20:56:53 +00001178 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardfd4aa4b2013-05-06 16:12:05 +00001179 .Cases("rv630", "rv635", "r600")
1180 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellarde25d2f62013-04-01 20:56:53 +00001181 .Case("rv740", "rv770")
1182 .Case("palm", "cedar")
Tom Stellardfd4aa4b2013-05-06 16:12:05 +00001183 .Cases("sumo", "sumo2", "sumo")
Tom Stellarde25d2f62013-04-01 20:56:53 +00001184 .Case("hemlock", "cypress")
1185 .Case("aruba", "cayman")
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001186 .Default(GPUName);
Tom Stellarde25d2f62013-04-01 20:56:53 +00001187 }
1188 return "";
1189}
1190
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001191static void getSparcTargetFeatures(const ArgList &Args,
1192 std::vector<const char *> Features) {
1193 bool SoftFloatABI = true;
1194 if (Arg *A =
1195 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1196 if (A->getOption().matches(options::OPT_mhard_float))
1197 SoftFloatABI = false;
1198 }
1199 if (SoftFloatABI)
1200 Features.push_back("+soft-float");
1201}
1202
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001203void Clang::AddSparcTargetArgs(const ArgList &Args,
1204 ArgStringList &CmdArgs) const {
1205 const Driver &D = getToolChain().getDriver();
1206
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001207 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner5f9e2722011-07-23 10:55:15 +00001208 StringRef FloatABI;
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001209 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1210 options::OPT_mhard_float)) {
1211 if (A->getOption().matches(options::OPT_msoft_float))
1212 FloatABI = "soft";
1213 else if (A->getOption().matches(options::OPT_mhard_float))
1214 FloatABI = "hard";
1215 }
1216
1217 // If unspecified, choose the default based on the platform.
1218 if (FloatABI.empty()) {
Aaron Ballmand58915e2013-07-15 13:41:33 +00001219 // Assume "soft", but warn the user we are guessing.
1220 FloatABI = "soft";
1221 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001222 }
1223
1224 if (FloatABI == "soft") {
1225 // Floating point operations and argument passing are soft.
1226 //
1227 // FIXME: This changes CPP defines, we need -target-soft-float.
1228 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001229 } else {
1230 assert(FloatABI == "hard" && "Invalid float abi!");
1231 CmdArgs.push_back("-mhard-float");
1232 }
1233}
1234
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00001235static const char *getSystemZTargetCPU(const ArgList &Args) {
1236 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1237 return A->getValue();
1238 return "z10";
1239}
1240
Chandler Carruth700d4e42013-01-13 11:46:33 +00001241static const char *getX86TargetCPU(const ArgList &Args,
1242 const llvm::Triple &Triple) {
1243 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1244 if (StringRef(A->getValue()) != "native")
1245 return A->getValue();
1246
1247 // FIXME: Reject attempts to use -march=native unless the target matches
1248 // the host.
1249 //
1250 // FIXME: We should also incorporate the detected target features for use
1251 // with -native.
1252 std::string CPU = llvm::sys::getHostCPUName();
1253 if (!CPU.empty() && CPU != "generic")
1254 return Args.MakeArgString(CPU);
1255 }
1256
1257 // Select the default CPU if none was given (or detection failed).
1258
1259 if (Triple.getArch() != llvm::Triple::x86_64 &&
1260 Triple.getArch() != llvm::Triple::x86)
1261 return 0; // This routine is only handling x86 targets.
1262
1263 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1264
1265 // FIXME: Need target hooks.
1266 if (Triple.isOSDarwin())
1267 return Is64Bit ? "core2" : "yonah";
1268
Chandler Carruth700d4e42013-01-13 11:46:33 +00001269 // All x86 devices running Android have core2 as their common
1270 // denominator. This makes a better choice than pentium4.
1271 if (Triple.getEnvironment() == llvm::Triple::Android)
1272 return "core2";
1273
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001274 // Everything else goes to x86-64 in 64-bit mode.
1275 if (Is64Bit)
1276 return "x86-64";
1277
1278 switch (Triple.getOS()) {
1279 case llvm::Triple::FreeBSD:
1280 case llvm::Triple::NetBSD:
1281 case llvm::Triple::OpenBSD:
1282 return "i486";
1283 case llvm::Triple::Haiku:
1284 return "i586";
1285 case llvm::Triple::Bitrig:
1286 return "i686";
1287 default:
1288 // Fallback to p4.
1289 return "pentium4";
1290 }
Chandler Carruth700d4e42013-01-13 11:46:33 +00001291}
1292
Rafael Espindolab330e402013-08-20 22:12:08 +00001293static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1294 switch(T.getArch()) {
1295 default:
1296 return "";
1297
1298 case llvm::Triple::arm:
1299 case llvm::Triple::thumb:
1300 return getARMTargetCPU(Args, T);
1301
1302 case llvm::Triple::mips:
1303 case llvm::Triple::mipsel:
1304 case llvm::Triple::mips64:
1305 case llvm::Triple::mips64el: {
1306 StringRef CPUName;
1307 StringRef ABIName;
1308 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1309 return CPUName;
1310 }
1311
1312 case llvm::Triple::ppc:
1313 case llvm::Triple::ppc64:
1314 case llvm::Triple::ppc64le: {
1315 std::string TargetCPUName = getPPCTargetCPU(Args);
1316 // LLVM may default to generating code for the native CPU,
1317 // but, like gcc, we default to a more generic option for
1318 // each architecture. (except on Darwin)
1319 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1320 if (T.getArch() == llvm::Triple::ppc64)
1321 TargetCPUName = "ppc64";
1322 else if (T.getArch() == llvm::Triple::ppc64le)
1323 TargetCPUName = "ppc64le";
1324 else
1325 TargetCPUName = "ppc";
1326 }
1327 return TargetCPUName;
1328 }
1329
1330 case llvm::Triple::sparc:
1331 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1332 return A->getValue();
1333 return "";
1334
1335 case llvm::Triple::x86:
1336 case llvm::Triple::x86_64:
1337 return getX86TargetCPU(Args, T);
1338
1339 case llvm::Triple::hexagon:
1340 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1341
1342 case llvm::Triple::systemz:
1343 return getSystemZTargetCPU(Args);
1344
1345 case llvm::Triple::r600:
1346 return getR600TargetGPU(Args);
1347 }
1348}
1349
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001350static void getX86TargetFeatures(const ArgList &Args,
1351 std::vector<const char *> &Features) {
1352 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1353 ie = Args.filtered_end();
1354 it != ie; ++it) {
1355 StringRef Name = (*it)->getOption().getName();
1356 (*it)->claim();
1357
1358 // Skip over "-m".
1359 assert(Name.startswith("m") && "Invalid feature name.");
1360 Name = Name.substr(1);
1361
1362 bool IsNegative = Name.startswith("no-");
1363 if (IsNegative)
1364 Name = Name.substr(3);
1365
1366 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1367 }
1368}
1369
Daniel Dunbar6acda162009-09-09 22:33:08 +00001370void Clang::AddX86TargetArgs(const ArgList &Args,
1371 ArgStringList &CmdArgs) const {
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001372 if (!Args.hasFlag(options::OPT_mred_zone,
1373 options::OPT_mno_red_zone,
1374 true) ||
1375 Args.hasArg(options::OPT_mkernel) ||
1376 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar66861e02009-11-20 22:21:36 +00001377 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001378
Bob Wilsonf0c54562013-02-10 16:01:41 +00001379 // Default to avoid implicit floating-point for kernel/kext code, but allow
1380 // that to be overridden with -mno-soft-float.
1381 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1382 Args.hasArg(options::OPT_fapple_kext));
1383 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1384 options::OPT_mno_soft_float,
Bob Wilsonf6f77bd2013-04-11 18:53:25 +00001385 options::OPT_mimplicit_float,
Bob Wilsonf0c54562013-02-10 16:01:41 +00001386 options::OPT_mno_implicit_float)) {
1387 const Option &O = A->getOption();
1388 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1389 O.matches(options::OPT_msoft_float));
1390 }
1391 if (NoImplicitFloat)
Daniel Dunbar66861e02009-11-20 22:21:36 +00001392 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar6acda162009-09-09 22:33:08 +00001393}
1394
Matthew Curtis33c95f12012-12-06 17:49:03 +00001395static inline bool HasPICArg(const ArgList &Args) {
1396 return Args.hasArg(options::OPT_fPIC)
1397 || Args.hasArg(options::OPT_fpic);
1398}
1399
1400static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1401 return Args.getLastArg(options::OPT_G,
1402 options::OPT_G_EQ,
1403 options::OPT_msmall_data_threshold_EQ);
1404}
1405
1406static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1407 std::string value;
1408 if (HasPICArg(Args))
1409 value = "0";
1410 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1411 value = A->getValue();
1412 A->claim();
1413 }
1414 return value;
1415}
1416
Tony Linthicum96319392011-12-12 21:14:55 +00001417void Clang::AddHexagonTargetArgs(const ArgList &Args,
1418 ArgStringList &CmdArgs) const {
Tony Linthicum96319392011-12-12 21:14:55 +00001419 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis1dbaef52012-12-07 13:52:44 +00001420 CmdArgs.push_back("-mqdsp6-compat");
1421 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum96319392011-12-12 21:14:55 +00001422
Matthew Curtis33c95f12012-12-06 17:49:03 +00001423 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1424 if (!SmallDataThreshold.empty()) {
Tony Linthicum96319392011-12-12 21:14:55 +00001425 CmdArgs.push_back ("-mllvm");
Matthew Curtis33c95f12012-12-06 17:49:03 +00001426 CmdArgs.push_back(Args.MakeArgString(
1427 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00001428 }
1429
Sirish Pande5f9688b2012-05-10 20:19:54 +00001430 if (!Args.hasArg(options::OPT_fno_short_enums))
1431 CmdArgs.push_back("-fshort-enums");
1432 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1433 CmdArgs.push_back ("-mllvm");
1434 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1435 }
Tony Linthicum96319392011-12-12 21:14:55 +00001436 CmdArgs.push_back ("-mllvm");
1437 CmdArgs.push_back ("-machine-sink-split=0");
1438}
1439
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001440static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1441 std::vector<const char *> &Features) {
Tim Northoverb793f0d2013-08-01 09:23:19 +00001442 // Honor -mfpu=.
1443 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emersonfe7ed042013-10-01 10:20:54 +00001444 getAArch64FPUFeatures(D, A, Args, Features);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001445}
1446
1447static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1448 const ArgList &Args, ArgStringList &CmdArgs) {
1449 std::vector<const char *> Features;
1450 switch (Triple.getArch()) {
1451 default:
1452 break;
1453 case llvm::Triple::mips:
1454 case llvm::Triple::mipsel:
1455 case llvm::Triple::mips64:
1456 case llvm::Triple::mips64el:
1457 getMIPSTargetFeatures(D, Args, Features);
1458 break;
1459
1460 case llvm::Triple::arm:
1461 case llvm::Triple::thumb:
1462 getARMTargetFeatures(D, Triple, Args, Features);
1463 break;
1464
1465 case llvm::Triple::ppc:
1466 case llvm::Triple::ppc64:
1467 case llvm::Triple::ppc64le:
1468 getPPCTargetFeatures(Args, Features);
1469 break;
1470 case llvm::Triple::sparc:
1471 getSparcTargetFeatures(Args, Features);
1472 break;
1473 case llvm::Triple::aarch64:
1474 getAArch64TargetFeatures(D, Args, Features);
1475 break;
1476 case llvm::Triple::x86:
1477 case llvm::Triple::x86_64:
1478 getX86TargetFeatures(Args, Features);
1479 break;
1480 }
Rafael Espindolabc1e5452013-08-21 17:34:32 +00001481
1482 // Find the last of each feature.
1483 llvm::StringMap<unsigned> LastOpt;
1484 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1485 const char *Name = Features[I];
1486 assert(Name[0] == '-' || Name[0] == '+');
1487 LastOpt[Name + 1] = I;
1488 }
1489
1490 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1491 // If this feature was overridden, ignore it.
1492 const char *Name = Features[I];
1493 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1494 assert(LastI != LastOpt.end());
1495 unsigned Last = LastI->second;
1496 if (Last != I)
1497 continue;
1498
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001499 CmdArgs.push_back("-target-feature");
Rafael Espindolabc1e5452013-08-21 17:34:32 +00001500 CmdArgs.push_back(Name);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001501 }
Tim Northoverb793f0d2013-08-01 09:23:19 +00001502}
1503
Eric Christopher88b7cf02011-08-19 00:30:14 +00001504static bool
John McCall260611a2012-06-20 06:18:46 +00001505shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson525544d2011-02-28 00:44:51 +00001506 const llvm::Triple &Triple) {
1507 // We use the zero-cost exception tables for Objective-C if the non-fragile
1508 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1509 // later.
John McCall260611a2012-06-20 06:18:46 +00001510 if (runtime.isNonFragile())
Anders Carlsson525544d2011-02-28 00:44:51 +00001511 return true;
1512
Bob Wilson905c45f2011-10-14 05:03:44 +00001513 if (!Triple.isOSDarwin())
Anders Carlsson525544d2011-02-28 00:44:51 +00001514 return false;
1515
Eric Christopheraa7333c2011-07-02 00:20:22 +00001516 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson525544d2011-02-28 00:44:51 +00001517 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher88b7cf02011-08-19 00:30:14 +00001518 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson525544d2011-02-28 00:44:51 +00001519}
1520
Anders Carlsson15348ae2011-02-28 02:27:16 +00001521/// addExceptionArgs - Adds exception related arguments to the driver command
1522/// arguments. There's a master flag, -fexceptions and also language specific
1523/// flags to enable/disable C++ and Objective-C exceptions.
1524/// This makes it possible to for example disable C++ exceptions but enable
1525/// Objective-C exceptions.
1526static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1527 const llvm::Triple &Triple,
Fariborz Jahanian15b77312012-04-04 18:28:00 +00001528 bool KernelOrKext,
John McCall260611a2012-06-20 06:18:46 +00001529 const ObjCRuntime &objcRuntime,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001530 ArgStringList &CmdArgs) {
Chad Rosierafc4baa2012-03-26 22:04:46 +00001531 if (KernelOrKext) {
1532 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1533 // arguments now to avoid warnings about unused arguments.
1534 Args.ClaimAllArgs(options::OPT_fexceptions);
1535 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1536 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1537 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1538 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1539 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001540 return;
Chad Rosierafc4baa2012-03-26 22:04:46 +00001541 }
Anders Carlsson15348ae2011-02-28 02:27:16 +00001542
1543 // Exceptions are enabled by default.
1544 bool ExceptionsEnabled = true;
1545
1546 // This keeps track of whether exceptions were explicitly turned on or off.
1547 bool DidHaveExplicitExceptionFlag = false;
1548
Rafael Espindolaf759df02009-10-01 13:33:33 +00001549 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1550 options::OPT_fno_exceptions)) {
1551 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001552 ExceptionsEnabled = true;
Eric Christopher88b7cf02011-08-19 00:30:14 +00001553 else
Anders Carlsson15348ae2011-02-28 02:27:16 +00001554 ExceptionsEnabled = false;
1555
1556 DidHaveExplicitExceptionFlag = true;
Rafael Espindolaf759df02009-10-01 13:33:33 +00001557 }
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001558
Anders Carlsson15348ae2011-02-28 02:27:16 +00001559 bool ShouldUseExceptionTables = false;
Fariborz Jahanian85caf032009-10-01 20:30:46 +00001560
Anders Carlsson15348ae2011-02-28 02:27:16 +00001561 // Exception tables and cleanups can be enabled with -fexceptions even if the
1562 // language itself doesn't support exceptions.
1563 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1564 ShouldUseExceptionTables = true;
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001565
Daniel Dunbard47ea692011-03-17 23:28:31 +00001566 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1567 // is not necessarily sensible, but follows GCC.
1568 if (types::isObjC(InputType) &&
Eric Christopher88b7cf02011-08-19 00:30:14 +00001569 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbard47ea692011-03-17 23:28:31 +00001570 options::OPT_fno_objc_exceptions,
1571 true)) {
1572 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlsson15348ae2011-02-28 02:27:16 +00001573
Eric Christopher88b7cf02011-08-19 00:30:14 +00001574 ShouldUseExceptionTables |=
John McCall260611a2012-06-20 06:18:46 +00001575 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001576 }
1577
1578 if (types::isCXX(InputType)) {
1579 bool CXXExceptionsEnabled = ExceptionsEnabled;
1580
Eric Christopher88b7cf02011-08-19 00:30:14 +00001581 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1582 options::OPT_fno_cxx_exceptions,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001583 options::OPT_fexceptions,
1584 options::OPT_fno_exceptions)) {
1585 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1586 CXXExceptionsEnabled = true;
Chandler Carruth43f220f2011-02-28 07:25:18 +00001587 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001588 CXXExceptionsEnabled = false;
1589 }
1590
1591 if (CXXExceptionsEnabled) {
1592 CmdArgs.push_back("-fcxx-exceptions");
1593
1594 ShouldUseExceptionTables = true;
1595 }
1596 }
1597
1598 if (ShouldUseExceptionTables)
1599 CmdArgs.push_back("-fexceptions");
Rafael Espindolaf759df02009-10-01 13:33:33 +00001600}
1601
Daniel Dunbarf4910132013-04-16 18:21:19 +00001602static bool ShouldDisableAutolink(const ArgList &Args,
1603 const ToolChain &TC) {
1604 bool Default = true;
1605 if (TC.getTriple().isOSDarwin()) {
1606 // The native darwin assembler doesn't support the linker_option directives,
1607 // so we disable them if we think the .s file will be passed to it.
1608 Default = TC.useIntegratedAs();
1609 }
1610 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1611 Default);
1612}
1613
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001614static bool ShouldDisableCFI(const ArgList &Args,
1615 const ToolChain &TC) {
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001616 bool Default = true;
Bob Wilson905c45f2011-10-14 05:03:44 +00001617 if (TC.getTriple().isOSDarwin()) {
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001618 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindolacb773922011-05-17 19:06:58 +00001619 // we disable them if we think the .s file will be passed to it.
Rafael Espindolaaf370e62013-03-18 18:10:27 +00001620 Default = TC.useIntegratedAs();
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001621 }
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001622 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher27e2b982012-12-18 00:31:10 +00001623 options::OPT_fno_dwarf2_cfi_asm,
1624 Default);
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001625}
1626
Ted Kremenekc06fcdf2013-03-12 17:02:12 +00001627static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1628 const ToolChain &TC) {
Nick Lewyckyea523d72011-10-17 23:05:52 +00001629 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1630 options::OPT_fno_dwarf_directory_asm,
Rafael Espindolaaf370e62013-03-18 18:10:27 +00001631 TC.useIntegratedAs());
Nick Lewyckyea523d72011-10-17 23:05:52 +00001632 return !UseDwarfDirectory;
1633}
1634
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001635/// \brief Check whether the given input tree contains any compilation actions.
1636static bool ContainsCompileAction(const Action *A) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001637 if (isa<CompileJobAction>(A))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001638 return true;
1639
1640 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1641 if (ContainsCompileAction(*it))
1642 return true;
1643
1644 return false;
1645}
1646
1647/// \brief Check if -relax-all should be passed to the internal assembler.
1648/// This is done by default when compiling non-assembler source with -O0.
1649static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1650 bool RelaxDefault = true;
1651
1652 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1653 RelaxDefault = A->getOption().matches(options::OPT_O0);
1654
1655 if (RelaxDefault) {
1656 RelaxDefault = false;
1657 for (ActionList::const_iterator it = C.getActions().begin(),
1658 ie = C.getActions().end(); it != ie; ++it) {
1659 if (ContainsCompileAction(*it)) {
1660 RelaxDefault = true;
1661 break;
1662 }
1663 }
1664 }
1665
1666 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1667 RelaxDefault);
1668}
1669
David Blaikie73168db2013-07-25 21:19:01 +00001670static void CollectArgsForIntegratedAssembler(Compilation &C,
1671 const ArgList &Args,
1672 ArgStringList &CmdArgs,
1673 const Driver &D) {
1674 if (UseRelaxAll(C, Args))
1675 CmdArgs.push_back("-mrelax-all");
1676
1677 // When using an integrated assembler, translate -Wa, and -Xassembler
1678 // options.
1679 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1680 options::OPT_Xassembler),
1681 ie = Args.filtered_end(); it != ie; ++it) {
1682 const Arg *A = *it;
1683 A->claim();
1684
1685 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1686 StringRef Value = A->getValue(i);
1687
1688 if (Value == "-force_cpusubtype_ALL") {
1689 // Do nothing, this is the default and we don't support anything else.
1690 } else if (Value == "-L") {
1691 CmdArgs.push_back("-msave-temp-labels");
1692 } else if (Value == "--fatal-warnings") {
1693 CmdArgs.push_back("-mllvm");
1694 CmdArgs.push_back("-fatal-assembler-warnings");
1695 } else if (Value == "--noexecstack") {
1696 CmdArgs.push_back("-mnoexecstack");
1697 } else {
1698 D.Diag(diag::err_drv_unsupported_option_argument)
1699 << A->getOption().getName() << Value;
1700 }
1701 }
1702 }
1703}
1704
Chandler Carruth9db37cd2013-06-23 11:28:48 +00001705static void addProfileRTLinux(
1706 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1707 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1708 Args.hasArg(options::OPT_fprofile_generate) ||
1709 Args.hasArg(options::OPT_fcreate_profile) ||
1710 Args.hasArg(options::OPT_coverage)))
1711 return;
1712
1713 // The profile runtime is located in the Linux library directory and has name
1714 // "libclang_rt.profile-<ArchName>.a".
1715 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1716 llvm::sys::path::append(
1717 LibProfile, "lib", "linux",
1718 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1719
1720 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1721}
1722
Alexey Samsonov86143042013-02-27 11:14:55 +00001723static void addSanitizerRTLinkFlagsLinux(
1724 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smith76e6e132013-03-23 00:30:08 +00001725 const StringRef Sanitizer, bool BeforeLibStdCXX,
1726 bool ExportSymbols = true) {
Alexey Samsonov86143042013-02-27 11:14:55 +00001727 // Sanitizer runtime is located in the Linux library directory and
1728 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1729 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1730 llvm::sys::path::append(
1731 LibSanitizer, "lib", "linux",
1732 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smith61a574f2013-03-20 23:49:07 +00001733
Alexey Samsonov86143042013-02-27 11:14:55 +00001734 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1735 // etc.) so that the linker picks custom versions of the global 'operator
1736 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournebf548552013-10-20 21:29:13 +00001737 // strategy of inserting it at the front of the link command. It also
1738 // needs to be forced to end up in the executable, so wrap it in
1739 // whole-archive.
Richard Smith61a574f2013-03-20 23:49:07 +00001740 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournebf548552013-10-20 21:29:13 +00001741 LibSanitizerArgs.push_back("-whole-archive");
Richard Smith61a574f2013-03-20 23:49:07 +00001742 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournebf548552013-10-20 21:29:13 +00001743 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smith61a574f2013-03-20 23:49:07 +00001744
1745 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1746 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1747
Alexey Samsonov86143042013-02-27 11:14:55 +00001748 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov3a8aff92013-05-24 14:28:03 +00001749 CmdArgs.push_back("-lrt");
Alexey Samsonov86143042013-02-27 11:14:55 +00001750 CmdArgs.push_back("-ldl");
Richard Smith76e6e132013-03-23 00:30:08 +00001751
1752 // If possible, use a dynamic symbols file to export the symbols from the
1753 // runtime library. If we can't do so, use -export-dynamic instead to export
1754 // all symbols from the binary.
1755 if (ExportSymbols) {
1756 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1757 CmdArgs.push_back(
1758 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1759 else
1760 CmdArgs.push_back("-export-dynamic");
1761 }
Alexey Samsonov86143042013-02-27 11:14:55 +00001762}
1763
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001764/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1765/// This needs to be called before we add the C run-time (malloc, etc).
1766static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00001767 ArgStringList &CmdArgs) {
Nick Lewyckyd4705682013-10-11 03:33:53 +00001768 if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov8ba75412012-09-12 09:09:08 +00001769 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1770 llvm::sys::path::append(LibAsan, "lib", "linux",
1771 (Twine("libclang_rt.asan-") +
1772 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay45b27382012-12-04 21:18:26 +00001773 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001774 } else {
Sergey Matveev050309f2013-05-27 11:17:01 +00001775 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001776 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001777 }
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001778}
1779
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001780/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1781/// This needs to be called before we add the C run-time (malloc, etc).
1782static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1783 ArgStringList &CmdArgs) {
Sergey Matveev050309f2013-05-27 11:17:01 +00001784 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001785 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001786}
1787
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00001788/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1789/// This needs to be called before we add the C run-time (malloc, etc).
1790static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1791 ArgStringList &CmdArgs) {
Sergey Matveev050309f2013-05-27 11:17:01 +00001792 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001793 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev050309f2013-05-27 11:17:01 +00001794}
1795
1796/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1797/// This needs to be called before we add the C run-time (malloc, etc).
1798static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1799 ArgStringList &CmdArgs) {
1800 if (!Args.hasArg(options::OPT_shared))
1801 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00001802}
1803
Richard Smith4def70d2012-10-09 19:52:38 +00001804/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1805/// (Linux).
1806static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smith61a574f2013-03-20 23:49:07 +00001807 ArgStringList &CmdArgs, bool IsCXX,
1808 bool HasOtherSanitizerRt) {
Nick Lewycky63d29e22013-10-19 00:27:23 +00001809 // Need a copy of sanitizer_common. This could come from another sanitizer
1810 // runtime; if we're not including one, include our own copy.
1811 if (!HasOtherSanitizerRt)
Peter Collingbournebf548552013-10-20 21:29:13 +00001812 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
1813
1814 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
1815
1816 // Only include the bits of the runtime which need a C++ ABI library if
1817 // we're linking in C++ mode.
1818 if (IsCXX)
1819 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smith4def70d2012-10-09 19:52:38 +00001820}
1821
Peter Collingbourne2eeed712013-08-07 22:47:34 +00001822static void addDfsanRTLinux(const ToolChain &TC, const ArgList &Args,
1823 ArgStringList &CmdArgs) {
1824 if (!Args.hasArg(options::OPT_shared))
1825 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "dfsan", true);
1826}
1827
Benjamin Kramer5322a552013-10-16 17:42:39 +00001828static bool shouldUseFramePointerForTarget(const ArgList &Args,
1829 const llvm::Triple &Triple) {
1830 switch (Triple.getArch()) {
1831 // Don't use a frame pointer on linux if optimizing for certain targets.
1832 case llvm::Triple::mips64:
1833 case llvm::Triple::mips64el:
1834 case llvm::Triple::mips:
1835 case llvm::Triple::mipsel:
1836 case llvm::Triple::systemz:
1837 case llvm::Triple::x86:
1838 case llvm::Triple::x86_64:
1839 if (Triple.isOSLinux())
1840 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1841 if (!A->getOption().matches(options::OPT_O0))
1842 return false;
1843 return true;
1844 case llvm::Triple::xcore:
1845 return false;
1846 default:
1847 return true;
1848 }
1849}
1850
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001851static bool shouldUseFramePointer(const ArgList &Args,
1852 const llvm::Triple &Triple) {
1853 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1854 options::OPT_fomit_frame_pointer))
1855 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1856
Benjamin Kramer5322a552013-10-16 17:42:39 +00001857 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001858}
1859
Eric Christopherd3e22df2013-04-03 01:58:53 +00001860static bool shouldUseLeafFramePointer(const ArgList &Args,
1861 const llvm::Triple &Triple) {
1862 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1863 options::OPT_momit_leaf_frame_pointer))
1864 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1865
Benjamin Kramer5322a552013-10-16 17:42:39 +00001866 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherd3e22df2013-04-03 01:58:53 +00001867}
1868
Rafael Espindolaa2148242013-08-10 01:40:10 +00001869/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruthd566df62012-12-17 21:40:04 +00001870static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer6089adc2013-04-27 08:12:29 +00001871 SmallString<128> cwd;
1872 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosierb1c81222013-04-26 20:49:50 +00001873 CmdArgs.push_back("-fdebug-compilation-dir");
1874 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruthd566df62012-12-17 21:40:04 +00001875 }
1876}
1877
Eric Christopher80190392013-02-22 20:12:52 +00001878static const char *SplitDebugName(const ArgList &Args,
1879 const InputInfoList &Inputs) {
1880 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1881 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1882 SmallString<128> T(FinalOutput->getValue());
1883 llvm::sys::path::replace_extension(T, "dwo");
1884 return Args.MakeArgString(T);
1885 } else {
1886 // Use the compilation dir.
1887 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1888 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1889 llvm::sys::path::replace_extension(F, "dwo");
1890 T += F;
1891 return Args.MakeArgString(F);
1892 }
1893}
1894
1895static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1896 const Tool &T, const JobAction &JA,
1897 const ArgList &Args, const InputInfo &Output,
1898 const char *OutFile) {
Eric Christopher59320e72013-02-21 22:35:01 +00001899 ArgStringList ExtractArgs;
1900 ExtractArgs.push_back("--extract-dwo");
1901
1902 ArgStringList StripArgs;
1903 StripArgs.push_back("--strip-dwo");
1904
1905 // Grabbing the output of the earlier compile step.
1906 StripArgs.push_back(Output.getFilename());
1907 ExtractArgs.push_back(Output.getFilename());
Eric Christopher59320e72013-02-21 22:35:01 +00001908 ExtractArgs.push_back(OutFile);
1909
1910 const char *Exec =
Eric Christopher80190392013-02-22 20:12:52 +00001911 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher59320e72013-02-21 22:35:01 +00001912
1913 // First extract the dwo sections.
Eric Christopher80190392013-02-22 20:12:52 +00001914 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00001915
1916 // Then remove them from the original .o file.
Eric Christopher80190392013-02-22 20:12:52 +00001917 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00001918}
1919
Chad Rosierb82e1172013-04-24 18:09:54 +00001920static bool isOptimizationLevelFast(const ArgList &Args) {
1921 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1922 if (A->getOption().matches(options::OPT_Ofast))
1923 return true;
1924 return false;
1925}
1926
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001927/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
1928static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
1929 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindola55ee1eb2013-08-27 16:58:15 +00001930 if (A->getOption().matches(options::OPT_O4) ||
1931 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001932 return true;
1933
1934 if (A->getOption().matches(options::OPT_O0))
1935 return false;
1936
1937 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
1938
Rafael Espindola168de192013-08-26 14:05:41 +00001939 // Vectorize -Os.
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001940 StringRef S(A->getValue());
Rafael Espindola168de192013-08-26 14:05:41 +00001941 if (S == "s")
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001942 return true;
1943
1944 // Don't vectorize -Oz.
1945 if (S == "z")
1946 return false;
1947
1948 unsigned OptLevel = 0;
1949 if (S.getAsInteger(10, OptLevel))
1950 return false;
1951
1952 return OptLevel > 1;
1953 }
1954
1955 return false;
1956}
1957
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001958void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar871adcf2009-03-18 07:06:02 +00001959 const InputInfo &Output,
Daniel Dunbar62cf6012009-03-18 06:07:59 +00001960 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00001961 const ArgList &Args,
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001962 const char *LinkingOutput) const {
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00001963 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1964 options::OPT_fapple_kext);
Daniel Dunbaree788e72009-12-21 18:54:17 +00001965 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001966 ArgStringList CmdArgs;
1967
Daniel Dunbar077ba6a2009-03-31 20:53:55 +00001968 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1969
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00001970 // Invoke ourselves in -cc1 mode.
1971 //
1972 // FIXME: Implement custom jobs for internal actions.
1973 CmdArgs.push_back("-cc1");
1974
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001975 // Add the "effective" target triple.
Daniel Dunbaraf07f932009-03-31 17:35:15 +00001976 CmdArgs.push_back("-triple");
Daniel Dunbar00577ad2010-08-23 22:35:37 +00001977 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001978 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbar728a5122009-09-10 06:49:20 +00001979
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001980 // Select the appropriate action.
John McCall260611a2012-06-20 06:18:46 +00001981 RewriteKind rewriteKind = RK_None;
Fariborz Jahaniane982cc02012-04-04 18:50:28 +00001982
Daniel Dunbar1d460332009-03-18 10:01:51 +00001983 if (isa<AnalyzeJobAction>(JA)) {
1984 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1985 CmdArgs.push_back("-analyze");
Ted Kremenek30660a82012-03-06 20:06:33 +00001986 } else if (isa<MigrateJobAction>(JA)) {
1987 CmdArgs.push_back("-migrate");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001988 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00001989 if (Output.getType() == types::TY_Dependencies)
1990 CmdArgs.push_back("-Eonly");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00001991 else {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00001992 CmdArgs.push_back("-E");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00001993 if (Args.hasArg(options::OPT_rewrite_objc) &&
1994 !Args.hasArg(options::OPT_g_Group))
1995 CmdArgs.push_back("-P");
1996 }
Daniel Dunbar8767cbc2010-02-03 03:07:56 +00001997 } else if (isa<AssembleJobAction>(JA)) {
1998 CmdArgs.push_back("-emit-obj");
Daniel Dunbar99298002010-05-27 06:18:05 +00001999
David Blaikie73168db2013-07-25 21:19:01 +00002000 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbard02bba82010-11-19 16:23:35 +00002001
2002 // Also ignore explicit -force_cpusubtype_ALL option.
2003 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002004 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +00002005 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00002006 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00002007
Aaron Ballman761322b2012-07-31 01:21:00 +00002008 if (JA.getType() == types::TY_Nothing)
2009 CmdArgs.push_back("-fsyntax-only");
2010 else if (UsePCH)
Douglas Gregordf91ef32009-04-18 00:34:01 +00002011 CmdArgs.push_back("-emit-pch");
2012 else
2013 CmdArgs.push_back("-emit-pth");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002014 } else {
2015 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002016
Daniel Dunbar1d460332009-03-18 10:01:51 +00002017 if (JA.getType() == types::TY_Nothing) {
2018 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00002019 } else if (JA.getType() == types::TY_LLVM_IR ||
2020 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002021 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00002022 } else if (JA.getType() == types::TY_LLVM_BC ||
2023 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002024 CmdArgs.push_back("-emit-llvm-bc");
2025 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbare3b8d072009-09-17 00:47:53 +00002026 CmdArgs.push_back("-S");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00002027 } else if (JA.getType() == types::TY_AST) {
2028 CmdArgs.push_back("-emit-pch");
Douglas Gregorc544ba02013-03-27 16:47:18 +00002029 } else if (JA.getType() == types::TY_ModuleFile) {
2030 CmdArgs.push_back("-module-file-info");
Daniel Dunbar64952502010-02-11 03:16:21 +00002031 } else if (JA.getType() == types::TY_RewrittenObjC) {
2032 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00002033 rewriteKind = RK_NonFragile;
Fariborz Jahanian582b3952012-04-02 15:59:19 +00002034 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2035 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00002036 rewriteKind = RK_Fragile;
Daniel Dunbar64952502010-02-11 03:16:21 +00002037 } else {
2038 assert(JA.getType() == types::TY_PP_Asm &&
2039 "Unexpected output type!");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002040 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002041 }
2042
Daniel Dunbar1d460332009-03-18 10:01:51 +00002043 // The make clang go fast button.
2044 CmdArgs.push_back("-disable-free");
2045
John McCallb689afb2010-02-13 03:50:24 +00002046 // Disable the verification pass in -asserts builds.
2047#ifdef NDEBUG
2048 CmdArgs.push_back("-disable-llvm-verifier");
2049#endif
2050
Daniel Dunbarc9abc042009-04-08 05:11:16 +00002051 // Set the main file name, so that debug info works even with
2052 // -save-temps.
2053 CmdArgs.push_back("-main-file-name");
Bob Wilson66b8a662012-11-23 06:14:39 +00002054 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbarc9abc042009-04-08 05:11:16 +00002055
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00002056 // Some flags which affect the language (via preprocessor
Bob Wilson66b8a662012-11-23 06:14:39 +00002057 // defines).
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00002058 if (Args.hasArg(options::OPT_static))
2059 CmdArgs.push_back("-static-define");
2060
Daniel Dunbar1d460332009-03-18 10:01:51 +00002061 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenekb8bb3e72009-09-25 05:55:59 +00002062 // Enable region store model by default.
2063 CmdArgs.push_back("-analyzer-store=region");
2064
Ted Kremenekb40d06d2009-12-07 22:26:14 +00002065 // Treat blocks as analysis entry points.
2066 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2067
Ted Kremenek51885072011-03-24 00:28:47 +00002068 CmdArgs.push_back("-analyzer-eagerly-assume");
2069
Daniel Dunbar1d460332009-03-18 10:01:51 +00002070 // Add default argument set.
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002071 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002072 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek51885072011-03-24 00:28:47 +00002073
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002074 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2075 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek51885072011-03-24 00:28:47 +00002076
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002077 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek51885072011-03-24 00:28:47 +00002078 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremeneka8180e52012-01-20 06:00:17 +00002079
2080 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek8dc05062012-01-26 02:27:38 +00002081
Jordan Rosee449edc2013-04-05 17:55:07 +00002082 if (types::isCXX(Inputs[0].getType()))
2083 CmdArgs.push_back("-analyzer-checker=cplusplus");
2084
Ted Kremenek8dc05062012-01-26 02:27:38 +00002085 // Enable the following experimental checkers for testing.
Ted Kremenek8dc05062012-01-26 02:27:38 +00002086 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2087 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2088 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2089 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2090 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2091 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002092 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002093
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002094 // Set the output format. The default is plist, for (lame) historical
2095 // reasons.
2096 CmdArgs.push_back("-analyzer-output");
2097 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smith1d489cf2012-11-01 04:30:05 +00002098 CmdArgs.push_back(A->getValue());
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002099 else
2100 CmdArgs.push_back("plist");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002101
Ted Kremenek0647a7b2010-03-22 22:32:05 +00002102 // Disable the presentation of standard compiler warnings when
2103 // using --analyze. We only want to show static analyzer diagnostics
2104 // or frontend errors.
2105 CmdArgs.push_back("-w");
2106
Daniel Dunbar1d460332009-03-18 10:01:51 +00002107 // Add -Xanalyzer arguments when running as analyzer.
2108 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump1eb44332009-09-09 15:08:12 +00002109 }
2110
Daniel Dunbare2fd6642009-09-10 01:21:12 +00002111 CheckCodeGenerationOptions(D, Args);
2112
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002113 bool PIE = getToolChain().isPIEDefault();
2114 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002115 bool IsPICLevelTwo = PIC;
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002116
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002117 // For the PIC and PIE flag options, this logic is different from the
2118 // legacy logic in very old versions of GCC, as that logic was just
2119 // a bug no one had ever fixed. This logic is both more rational and
2120 // consistent with GCC's new logic now that the bugs are fixed. The last
2121 // argument relating to either PIC or PIE wins, and no other argument is
2122 // used. If the last argument is any flavor of the '-fno-...' arguments,
2123 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2124 // at the same level.
2125 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2126 options::OPT_fpic, options::OPT_fno_pic,
2127 options::OPT_fPIE, options::OPT_fno_PIE,
2128 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002129 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2130 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002131 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002132 if (LastPICArg) {
2133 Option O = LastPICArg->getOption();
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002134 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2135 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2136 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2137 PIC = PIE || O.matches(options::OPT_fPIC) ||
2138 O.matches(options::OPT_fpic);
2139 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2140 O.matches(options::OPT_fPIC);
2141 } else {
2142 PIE = PIC = false;
2143 }
2144 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002145 }
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002146
Nick Lewyckyd4705682013-10-11 03:33:53 +00002147 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002148 // specified while enabling PIC enabled level 1 PIC, just force it back to
2149 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2150 // informal testing).
2151 if (PIC && getToolChain().getTriple().isOSDarwin())
2152 IsPICLevelTwo |= getToolChain().isPICDefault();
2153
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002154 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2155 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00002156 llvm::Triple Triple(TripleStr);
Eric Christopher6c7db892013-02-18 01:16:37 +00002157 if (KernelOrKext &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00002158 (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002159 PIC = PIE = false;
Simon Atanasyanc0e83642013-10-04 11:46:54 +00002160 if (Args.hasArg(options::OPT_static))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002161 PIC = PIE = false;
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002162
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002163 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2164 // This is a very special mode. It trumps the other modes, almost no one
2165 // uses it, and it isn't even valid on any OS but Darwin.
2166 if (!getToolChain().getTriple().isOSDarwin())
2167 D.Diag(diag::err_drv_unsupported_opt_for_target)
2168 << A->getSpelling() << getToolChain().getTriple().str();
2169
2170 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2171
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002172 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002173 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002174
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002175 // Only a forced PIC mode can cause the actual compile to have PIC defines
2176 // etc., no flags are sufficient. This behavior was selected to closely
2177 // match that of llvm-gcc and Apple GCC before that.
2178 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2179 CmdArgs.push_back("-pic-level");
2180 CmdArgs.push_back("2");
2181 }
2182 } else {
2183 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2184 // handled in Clang's IRGen by the -pie-level flag.
2185 CmdArgs.push_back("-mrelocation-model");
2186 CmdArgs.push_back(PIC ? "pic" : "static");
2187
2188 if (PIC) {
2189 CmdArgs.push_back("-pic-level");
2190 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2191 if (PIE) {
2192 CmdArgs.push_back("-pie-level");
2193 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2194 }
2195 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002196 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002197
Tanya Lattner59876c22009-11-04 01:18:09 +00002198 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2199 options::OPT_fno_merge_all_constants))
Chris Lattnerf44a1a02011-04-08 18:06:54 +00002200 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002201
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002202 // LLVM Code Generator Options.
2203
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002204 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2205 CmdArgs.push_back("-mregparm");
Richard Smith1d489cf2012-11-01 04:30:05 +00002206 CmdArgs.push_back(A->getValue());
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002207 }
2208
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00002209 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2210 options::OPT_freg_struct_return)) {
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002211 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCallb8b52972013-06-18 02:46:29 +00002212 D.Diag(diag::err_drv_unsupported_opt_for_target)
2213 << A->getSpelling() << getToolChain().getTriple().str();
2214 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2215 CmdArgs.push_back("-fpcc-struct-return");
2216 } else {
2217 assert(A->getOption().matches(options::OPT_freg_struct_return));
2218 CmdArgs.push_back("-freg-struct-return");
2219 }
2220 }
2221
Roman Divackycfe9af22011-03-01 17:40:53 +00002222 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2223 CmdArgs.push_back("-mrtd");
2224
Rafael Espindola6af27ec2011-12-14 21:02:23 +00002225 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002226 CmdArgs.push_back("-mdisable-fp-elim");
2227 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2228 options::OPT_fno_zero_initialized_in_bss))
2229 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb82e1172013-04-24 18:09:54 +00002230
2231 bool OFastEnabled = isOptimizationLevelFast(Args);
2232 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2233 // enabled. This alias option is being used to simplify the hasFlag logic.
2234 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2235 options::OPT_fstrict_aliasing;
2236 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Daniel Dunbar398c6102011-02-04 02:20:39 +00002237 options::OPT_fno_strict_aliasing,
2238 getToolChain().IsStrictAliasingDefault()))
Dan Gohman4d5625e2010-10-14 22:36:56 +00002239 CmdArgs.push_back("-relaxed-aliasing");
Manman Ren96d6c452013-10-11 20:48:38 +00002240 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2241 options::OPT_fno_struct_path_tbaa))
2242 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth82fe6ae2012-03-27 23:58:37 +00002243 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2244 false))
2245 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1db772b2012-01-23 08:29:12 +00002246 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2247 options::OPT_fno_optimize_sibling_calls))
2248 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002249
Eric Christopher31056272013-04-04 06:29:47 +00002250 // Handle segmented stacks.
2251 if (Args.hasArg(options::OPT_fsplit_stack))
2252 CmdArgs.push_back("-split-stacks");
Chad Rosierb82e1172013-04-24 18:09:54 +00002253
2254 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2255 // This alias option is being used to simplify the getLastArg logic.
2256 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2257 options::OPT_ffast_math;
Eric Christopher31056272013-04-04 06:29:47 +00002258
Chandler Carruthabf07a72012-01-02 14:19:45 +00002259 // Handle various floating point optimization flags, mapping them to the
2260 // appropriate LLVM code generation flags. The pattern for all of these is to
2261 // default off the codegen optimizations, and if any flag enables them and no
2262 // flag disables them after the flag enabling them, enable the codegen
2263 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb82e1172013-04-24 18:09:54 +00002264 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002265 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002266 options::OPT_ffinite_math_only,
2267 options::OPT_fno_finite_math_only,
2268 options::OPT_fhonor_infinities,
2269 options::OPT_fno_honor_infinities))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002270 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2271 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002272 A->getOption().getID() != options::OPT_fhonor_infinities)
2273 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb82e1172013-04-24 18:09:54 +00002274 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002275 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002276 options::OPT_ffinite_math_only,
2277 options::OPT_fno_finite_math_only,
2278 options::OPT_fhonor_nans,
2279 options::OPT_fno_honor_nans))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002280 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2281 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002282 A->getOption().getID() != options::OPT_fhonor_nans)
2283 CmdArgs.push_back("-menable-no-nans");
2284
Benjamin Kramer769aa2d2012-05-02 14:55:48 +00002285 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2286 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb82e1172013-04-24 18:09:54 +00002287 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002288 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002289 options::OPT_fmath_errno,
Chandler Carruthb69557e2013-05-18 20:47:36 +00002290 options::OPT_fno_math_errno)) {
2291 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2292 // However, turning *off* -ffast_math merely restores the toolchain default
2293 // (which may be false).
2294 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2295 A->getOption().getID() == options::OPT_ffast_math ||
2296 A->getOption().getID() == options::OPT_Ofast)
2297 MathErrno = false;
2298 else if (A->getOption().getID() == options::OPT_fmath_errno)
2299 MathErrno = true;
2300 }
Chandler Carruth4f50c502012-04-26 02:10:51 +00002301 if (MathErrno)
2302 CmdArgs.push_back("-fmath-errno");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002303
2304 // There are several flags which require disabling very specific
2305 // optimizations. Any of these being disabled forces us to turn off the
2306 // entire set of LLVM optimizations, so collect them through all the flag
2307 // madness.
2308 bool AssociativeMath = false;
Chad Rosierb82e1172013-04-24 18:09:54 +00002309 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002310 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002311 options::OPT_funsafe_math_optimizations,
2312 options::OPT_fno_unsafe_math_optimizations,
2313 options::OPT_fassociative_math,
2314 options::OPT_fno_associative_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002315 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2316 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002317 A->getOption().getID() != options::OPT_fno_associative_math)
2318 AssociativeMath = true;
2319 bool ReciprocalMath = false;
Chad Rosierb82e1172013-04-24 18:09:54 +00002320 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002321 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002322 options::OPT_funsafe_math_optimizations,
2323 options::OPT_fno_unsafe_math_optimizations,
2324 options::OPT_freciprocal_math,
2325 options::OPT_fno_reciprocal_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002326 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2327 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002328 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2329 ReciprocalMath = true;
2330 bool SignedZeros = true;
Chad Rosierb82e1172013-04-24 18:09:54 +00002331 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002332 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002333 options::OPT_funsafe_math_optimizations,
2334 options::OPT_fno_unsafe_math_optimizations,
2335 options::OPT_fsigned_zeros,
2336 options::OPT_fno_signed_zeros))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002337 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2338 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002339 A->getOption().getID() != options::OPT_fsigned_zeros)
2340 SignedZeros = false;
2341 bool TrappingMath = true;
Chad Rosierb82e1172013-04-24 18:09:54 +00002342 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002343 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002344 options::OPT_funsafe_math_optimizations,
2345 options::OPT_fno_unsafe_math_optimizations,
2346 options::OPT_ftrapping_math,
2347 options::OPT_fno_trapping_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002348 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2349 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002350 A->getOption().getID() != options::OPT_ftrapping_math)
2351 TrappingMath = false;
2352 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2353 !TrappingMath)
2354 CmdArgs.push_back("-menable-unsafe-fp-math");
2355
Lang Hamesc9686712012-07-06 00:59:19 +00002356
2357 // Validate and pass through -fp-contract option.
Chad Rosierb82e1172013-04-24 18:09:54 +00002358 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002359 options::OPT_fno_fast_math,
Lang Hamesc9686712012-07-06 00:59:19 +00002360 options::OPT_ffp_contract)) {
2361 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002362 StringRef Val = A->getValue();
Lang Hamesc9686712012-07-06 00:59:19 +00002363 if (Val == "fast" || Val == "on" || Val == "off") {
2364 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2365 } else {
2366 D.Diag(diag::err_drv_unsupported_option_argument)
2367 << A->getOption().getName() << Val;
2368 }
Chad Rosierb82e1172013-04-24 18:09:54 +00002369 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2370 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesc9686712012-07-06 00:59:19 +00002371 // If fast-math is set then set the fp-contract mode to fast.
2372 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2373 }
2374 }
2375
Bob Wilson455e72e2012-07-19 03:52:53 +00002376 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2377 // and if we find them, tell the frontend to provide the appropriate
2378 // preprocessor macros. This is distinct from enabling any optimizations as
2379 // these options induce language changes which must survive serialization
2380 // and deserialization, etc.
Chad Rosierb82e1172013-04-24 18:09:54 +00002381 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2382 options::OPT_fno_fast_math))
2383 if (!A->getOption().matches(options::OPT_fno_fast_math))
2384 CmdArgs.push_back("-ffast-math");
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002385 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2386 if (A->getOption().matches(options::OPT_ffinite_math_only))
2387 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002388
Daniel Dunbar1b718482010-05-14 22:00:22 +00002389 // Decide whether to use verbose asm. Verbose assembly is the default on
2390 // toolchains which have the integrated assembler on by default.
2391 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2392 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer20249a12010-10-21 03:16:25 +00002393 IsVerboseAsmDefault) ||
Daniel Dunbar1b718482010-05-14 22:00:22 +00002394 Args.hasArg(options::OPT_dA))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002395 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002396
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002397 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2398 CmdArgs.push_back("-mdebug-pass");
2399 CmdArgs.push_back("Structure");
2400 }
2401 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2402 CmdArgs.push_back("-mdebug-pass");
2403 CmdArgs.push_back("Arguments");
2404 }
2405
John McCalld0c2ec42010-02-19 02:45:38 +00002406 // Enable -mconstructor-aliases except on darwin, where we have to
2407 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson905c45f2011-10-14 05:03:44 +00002408 if (!getToolChain().getTriple().isOSDarwin())
John McCalld0c2ec42010-02-19 02:45:38 +00002409 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00002410
John McCall32096692011-03-18 02:56:14 +00002411 // Darwin's kernel doesn't support guard variables; just die if we
2412 // try to use them.
Bob Wilson905c45f2011-10-14 05:03:44 +00002413 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall32096692011-03-18 02:56:14 +00002414 CmdArgs.push_back("-fforbid-guard-variables");
2415
Douglas Gregor6f755502011-02-01 15:15:22 +00002416 if (Args.hasArg(options::OPT_mms_bitfields)) {
2417 CmdArgs.push_back("-mms-bitfields");
2418 }
John McCalld0c2ec42010-02-19 02:45:38 +00002419
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002420 // This is a coarse approximation of what llvm-gcc actually does, both
2421 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2422 // complicated ways.
2423 bool AsynchronousUnwindTables =
2424 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2425 options::OPT_fno_asynchronous_unwind_tables,
2426 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002427 !KernelOrKext);
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002428 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2429 AsynchronousUnwindTables))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002430 CmdArgs.push_back("-munwind-tables");
2431
Chandler Carrutha6b25812012-11-21 23:40:23 +00002432 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola8af669f2012-06-19 01:26:10 +00002433
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002434 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2435 CmdArgs.push_back("-mlimit-float-precision");
Richard Smith1d489cf2012-11-01 04:30:05 +00002436 CmdArgs.push_back(A->getValue());
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002437 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002438
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002439 // FIXME: Handle -mtune=.
2440 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002441
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002442 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002443 CmdArgs.push_back("-mcode-model");
Richard Smith1d489cf2012-11-01 04:30:05 +00002444 CmdArgs.push_back(A->getValue());
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002445 }
2446
Rafael Espindolab330e402013-08-20 22:12:08 +00002447 // Add the target cpu
2448 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2449 llvm::Triple ETriple(ETripleStr);
2450 std::string CPU = getCPUName(Args, ETriple);
2451 if (!CPU.empty()) {
2452 CmdArgs.push_back("-target-cpu");
2453 CmdArgs.push_back(Args.MakeArgString(CPU));
2454 }
2455
Rafael Espindola5389b842013-08-21 21:59:03 +00002456 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2457 CmdArgs.push_back("-mfpmath");
2458 CmdArgs.push_back(A->getValue());
2459 }
2460
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002461 // Add the target features
2462 getTargetFeatures(D, ETriple, Args, CmdArgs);
2463
Rafael Espindolab330e402013-08-20 22:12:08 +00002464 // Add target specific flags.
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002465 switch(getToolChain().getArch()) {
Daniel Dunbar6acda162009-09-09 22:33:08 +00002466 default:
2467 break;
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002468
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002469 case llvm::Triple::arm:
2470 case llvm::Triple::thumb:
Daniel Dunbarfa41d692011-03-17 17:10:06 +00002471 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002472 break;
2473
Eric Christophered734732010-03-02 02:41:08 +00002474 case llvm::Triple::mips:
2475 case llvm::Triple::mipsel:
Akira Hatanaka7ec02582011-09-21 02:13:07 +00002476 case llvm::Triple::mips64:
2477 case llvm::Triple::mips64el:
Eric Christophered734732010-03-02 02:41:08 +00002478 AddMIPSTargetArgs(Args, CmdArgs);
2479 break;
2480
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002481 case llvm::Triple::sparc:
2482 AddSparcTargetArgs(Args, CmdArgs);
2483 break;
2484
Daniel Dunbar6acda162009-09-09 22:33:08 +00002485 case llvm::Triple::x86:
2486 case llvm::Triple::x86_64:
2487 AddX86TargetArgs(Args, CmdArgs);
2488 break;
Tony Linthicum96319392011-12-12 21:14:55 +00002489
2490 case llvm::Triple::hexagon:
2491 AddHexagonTargetArgs(Args, CmdArgs);
2492 break;
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002493 }
2494
Hans Wennborgb3574792013-08-08 00:17:41 +00002495 // Add clang-cl arguments.
2496 if (getToolChain().getDriver().IsCLMode())
2497 AddClangCLArgs(Args, CmdArgs);
2498
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002499 // Pass the linker version in use.
2500 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2501 CmdArgs.push_back("-target-linker-version");
Richard Smith1d489cf2012-11-01 04:30:05 +00002502 CmdArgs.push_back(A->getValue());
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002503 }
2504
Eric Christopherd3e22df2013-04-03 01:58:53 +00002505 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbar1ad66482010-07-01 01:31:45 +00002506 CmdArgs.push_back("-momit-leaf-frame-pointer");
2507
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002508 // Explicitly error on some things we know we don't support and can't just
2509 // ignore.
2510 types::ID InputType = Inputs[0].getType();
Daniel Dunbare94db472010-09-24 19:39:37 +00002511 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2512 Arg *Unsupported;
Daniel Dunbare94db472010-09-24 19:39:37 +00002513 if (types::isCXX(InputType) &&
Bob Wilson905c45f2011-10-14 05:03:44 +00002514 getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002515 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilsona544aee2011-08-13 23:48:55 +00002516 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2517 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002518 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbare94db472010-09-24 19:39:37 +00002519 << Unsupported->getOption().getName();
2520 }
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002521 }
2522
Daniel Dunbar1d460332009-03-18 10:01:51 +00002523 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbarf7c16d92010-08-24 22:44:13 +00002524 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosier2b819102011-08-02 17:58:04 +00002525 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbar322c29f2011-02-02 21:11:35 +00002526 CmdArgs.push_back("-header-include-file");
2527 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2528 D.CCPrintHeadersFilename : "-");
2529 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002530 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump1eb44332009-09-09 15:08:12 +00002531 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002532
Chad Rosier2b819102011-08-02 17:58:04 +00002533 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00002534 CmdArgs.push_back("-diagnostic-log-file");
2535 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2536 D.CCLogDiagnosticsFilename : "-");
2537 }
2538
Eric Christopherc706c8e2013-02-05 07:29:57 +00002539 // Use the last option from "-g" group. "-gline-tables-only"
2540 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola18f36d92010-03-07 04:46:18 +00002541 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002542 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopherc706c8e2013-02-05 07:29:57 +00002543 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002544 CmdArgs.push_back("-gline-tables-only");
Manman Renfc0f91c2013-06-19 01:46:49 +00002545 else if (A->getOption().matches(options::OPT_gdwarf_2))
2546 CmdArgs.push_back("-gdwarf-2");
2547 else if (A->getOption().matches(options::OPT_gdwarf_3))
2548 CmdArgs.push_back("-gdwarf-3");
2549 else if (A->getOption().matches(options::OPT_gdwarf_4))
2550 CmdArgs.push_back("-gdwarf-4");
Eric Christopherc706c8e2013-02-05 07:29:57 +00002551 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren8ed38d82013-07-02 23:15:25 +00002552 !A->getOption().matches(options::OPT_ggdb0)) {
2553 // Default is dwarf-2 for darwin.
2554 if (getToolChain().getTriple().isOSDarwin())
2555 CmdArgs.push_back("-gdwarf-2");
2556 else
2557 CmdArgs.push_back("-g");
2558 }
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002559 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002560
Alexey Samsonov7f326072012-06-21 08:22:39 +00002561 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2562 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christopherda3301e2012-10-18 21:52:18 +00002563 if (Args.hasArg(options::OPT_gcolumn_info))
2564 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonov7f326072012-06-21 08:22:39 +00002565
Eric Christopher0f43a6d2013-09-13 22:37:55 +00002566 // FIXME: Move backend command line options to the module.
Eric Christopherc706c8e2013-02-05 07:29:57 +00002567 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2568 // splitting and extraction.
Eric Christopherf870e122013-02-21 22:35:05 +00002569 // FIXME: Currently only works on Linux.
Cameron Esfahani57b1da12013-09-14 01:09:11 +00002570 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherf870e122013-02-21 22:35:05 +00002571 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopherc706c8e2013-02-05 07:29:57 +00002572 CmdArgs.push_back("-g");
2573 CmdArgs.push_back("-backend-option");
2574 CmdArgs.push_back("-split-dwarf=Enable");
2575 }
2576
Eric Christopher0f43a6d2013-09-13 22:37:55 +00002577 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2578 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2579 CmdArgs.push_back("-backend-option");
2580 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2581 }
Eric Christopher3e8ac1b2013-06-18 00:03:50 +00002582
2583 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2584
Rafael Espindola9cf933a2010-05-06 21:06:04 +00002585 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2586 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2587
Chris Lattner7255a2d2010-06-22 00:03:40 +00002588 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2589
Nick Lewyckye8ba8d72011-04-21 23:44:07 +00002590 if (Args.hasArg(options::OPT_ftest_coverage) ||
2591 Args.hasArg(options::OPT_coverage))
2592 CmdArgs.push_back("-femit-coverage-notes");
2593 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2594 Args.hasArg(options::OPT_coverage))
2595 CmdArgs.push_back("-femit-coverage-data");
2596
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002597 if (C.getArgs().hasArg(options::OPT_c) ||
2598 C.getArgs().hasArg(options::OPT_S)) {
2599 if (Output.isFilename()) {
Nick Lewycky3dc05412011-05-05 00:08:20 +00002600 CmdArgs.push_back("-coverage-file");
Eric Christopher025b3d42013-02-22 00:24:40 +00002601 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky0f815f12013-03-07 08:28:53 +00002602 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolaa2148242013-08-10 01:40:10 +00002603 SmallString<128> Pwd;
2604 if (!llvm::sys::fs::current_path(Pwd)) {
2605 llvm::sys::path::append(Pwd, CoverageFilename.str());
2606 CoverageFilename.swap(Pwd);
Nick Lewycky0f815f12013-03-07 08:28:53 +00002607 }
2608 }
Eric Christopher025b3d42013-02-22 00:24:40 +00002609 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002610 }
2611 }
2612
Daniel Dunbara268fc02011-10-11 18:20:10 +00002613 // Pass options for controlling the default header search paths.
2614 if (Args.hasArg(options::OPT_nostdinc)) {
2615 CmdArgs.push_back("-nostdsysteminc");
2616 CmdArgs.push_back("-nobuiltininc");
2617 } else {
Daniel Dunbar92d6d402011-10-11 18:20:16 +00002618 if (Args.hasArg(options::OPT_nostdlibinc))
2619 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbara268fc02011-10-11 18:20:10 +00002620 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2621 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2622 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002623
Daniel Dunbar5f122322009-12-15 01:02:52 +00002624 // Pass the path to compiler resource files.
Daniel Dunbar5f122322009-12-15 01:02:52 +00002625 CmdArgs.push_back("-resource-dir");
Daniel Dunbar225c4172010-01-20 02:35:16 +00002626 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar2ac9fc22009-04-07 21:42:00 +00002627
Argyrios Kyrtzidis389db162010-11-03 22:45:23 +00002628 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2629
Ted Kremenek30660a82012-03-06 20:06:33 +00002630 bool ARCMTEnabled = false;
Argyrios Kyrtzidisdce3ce32013-09-17 19:14:29 +00002631 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002632 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002633 options::OPT_ccc_arcmt_modify,
2634 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002635 ARCMTEnabled = true;
John McCall8f0e8d22011-06-15 23:25:17 +00002636 switch (A->getOption().getID()) {
2637 default:
2638 llvm_unreachable("missed a case");
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002639 case options::OPT_ccc_arcmt_check:
John McCall8f0e8d22011-06-15 23:25:17 +00002640 CmdArgs.push_back("-arcmt-check");
2641 break;
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002642 case options::OPT_ccc_arcmt_modify:
John McCall8f0e8d22011-06-15 23:25:17 +00002643 CmdArgs.push_back("-arcmt-modify");
2644 break;
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002645 case options::OPT_ccc_arcmt_migrate:
2646 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenek30660a82012-03-06 20:06:33 +00002647 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002648 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidis7ee20492011-07-19 17:20:03 +00002649
2650 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2651 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002652 break;
John McCall8f0e8d22011-06-15 23:25:17 +00002653 }
2654 }
Argyrios Kyrtzidisf75ece42013-06-24 19:01:18 +00002655 } else {
2656 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2657 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2658 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCall8f0e8d22011-06-15 23:25:17 +00002659 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002660
Ted Kremenek30660a82012-03-06 20:06:33 +00002661 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2662 if (ARCMTEnabled) {
2663 D.Diag(diag::err_drv_argument_not_allowed_with)
2664 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2665 }
2666 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002667 CmdArgs.push_back(A->getValue());
Ted Kremenek30660a82012-03-06 20:06:33 +00002668
2669 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand4129992013-07-09 16:59:14 +00002670 options::OPT_objcmt_migrate_subscripting,
2671 options::OPT_objcmt_migrate_property)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002672 // None specified, means enable them all.
2673 CmdArgs.push_back("-objcmt-migrate-literals");
2674 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand4129992013-07-09 16:59:14 +00002675 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenek30660a82012-03-06 20:06:33 +00002676 } else {
2677 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2678 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand4129992013-07-09 16:59:14 +00002679 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenek30660a82012-03-06 20:06:33 +00002680 }
2681 }
2682
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002683 // Add preprocessing options like -I, -D, etc. if we are using the
2684 // preprocessor.
2685 //
2686 // FIXME: Support -fpreprocessed
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002687 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier9d718632013-01-24 19:14:47 +00002688 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002689
Rafael Espindola19d9d2e2011-07-21 23:40:37 +00002690 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2691 // that "The compiler can only warn and ignore the option if not recognized".
2692 // When building with ccache, it will pass -D options to clang even on
2693 // preprocessed inputs and configure concludes that -fPIC is not supported.
2694 Args.ClaimAllArgs(options::OPT_D);
2695
Rafael Espindola55ee1eb2013-08-27 16:58:15 +00002696 // Manually translate -O4 to -O3; let clang reject others.
2697 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2698 if (A->getOption().matches(options::OPT_O4)) {
2699 CmdArgs.push_back("-O3");
2700 D.Diag(diag::warn_O4_is_O3);
2701 } else {
2702 A->render(Args, CmdArgs);
2703 }
2704 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002705
Chad Rosierb2c08872012-12-12 20:06:31 +00002706 // Don't warn about unused -flto. This can happen when we're preprocessing or
2707 // precompiling.
2708 Args.ClaimAllArgs(options::OPT_flto);
2709
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002710 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremeneke8cf7d12012-07-07 05:53:30 +00002711 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2712 CmdArgs.push_back("-pedantic");
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002713 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002714 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard573d262009-04-07 22:13:21 +00002715
2716 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgadbb4552013-07-31 16:57:56 +00002717 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbard573d262009-04-07 22:13:21 +00002718 //
2719 // If a std is supplied, only add -trigraphs if it follows the
2720 // option.
2721 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2722 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes528365d2009-10-16 14:28:06 +00002723 if (types::isCXX(InputType))
Daniel Dunbar294691e2009-11-04 06:24:38 +00002724 CmdArgs.push_back("-std=c++98");
Nuno Lopes528365d2009-10-16 14:28:06 +00002725 else
Daniel Dunbar294691e2009-11-04 06:24:38 +00002726 CmdArgs.push_back("-std=c89");
Daniel Dunbard573d262009-04-07 22:13:21 +00002727 else
2728 Std->render(Args, CmdArgs);
2729
Daniel Dunbar0e100312010-06-14 21:23:08 +00002730 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2731 options::OPT_trigraphs))
2732 if (A != Std)
Daniel Dunbard573d262009-04-07 22:13:21 +00002733 A->render(Args, CmdArgs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002734 } else {
2735 // Honor -std-default.
Daniel Dunbar4a5290e2010-01-29 21:03:02 +00002736 //
2737 // FIXME: Clang doesn't correctly handle -std= when the input language
2738 // doesn't match. For the time being just ignore this for C++ inputs;
2739 // eventually we want to do all the standard defaulting here instead of
2740 // splitting it between the driver and clang -cc1.
2741 if (!types::isCXX(InputType))
Nico Weber50f88b92012-08-30 02:08:31 +00002742 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2743 "-std=", /*Joined=*/true);
2744 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2745 CmdArgs.push_back("-std=c++11");
2746
Daniel Dunbard573d262009-04-07 22:13:21 +00002747 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002748 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002749
Richard Smithe9813b32013-09-04 22:50:31 +00002750 // GCC's behavior for -Wwrite-strings is a bit strange:
2751 // * In C, this "warning flag" changes the types of string literals from
2752 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
2753 // for the discarded qualifier.
2754 // * In C++, this is just a normal warning flag.
2755 //
2756 // Implementing this warning correctly in C is hard, so we follow GCC's
2757 // behavior for now. FIXME: Directly diagnose uses of a string literal as
2758 // a non-const char* in C, rather than using this crude hack.
2759 if (!types::isCXX(InputType)) {
2760 // FIXME: This should behave just like a warning flag, and thus should also
2761 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
2762 Arg *WriteStrings =
2763 Args.getLastArg(options::OPT_Wwrite_strings,
2764 options::OPT_Wno_write_strings, options::OPT_w);
2765 if (WriteStrings &&
2766 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
2767 CmdArgs.push_back("-fconst-strings");
Chandler Carruth50465d12011-04-23 06:30:43 +00002768 }
2769
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002770 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruthf8c247d2011-04-23 19:48:40 +00002771 // during C++ compilation, which it is by default. GCC keeps this define even
2772 // in the presence of '-w', match this behavior bug-for-bug.
2773 if (types::isCXX(InputType) &&
2774 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2775 true)) {
2776 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002777 }
2778
Chandler Carruthc304ba32010-05-22 02:21:53 +00002779 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2780 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2781 if (Asm->getOption().matches(options::OPT_fasm))
2782 CmdArgs.push_back("-fgnu-keywords");
2783 else
2784 CmdArgs.push_back("-fno-gnu-keywords");
2785 }
2786
Rafael Espindola61b1efe2011-05-02 17:43:32 +00002787 if (ShouldDisableCFI(Args, getToolChain()))
2788 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolaf24a1512011-04-30 18:35:43 +00002789
Nick Lewyckyea523d72011-10-17 23:05:52 +00002790 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2791 CmdArgs.push_back("-fno-dwarf-directory-asm");
2792
Daniel Dunbarf4910132013-04-16 18:21:19 +00002793 if (ShouldDisableAutolink(Args, getToolChain()))
2794 CmdArgs.push_back("-fno-autolink");
2795
Chandler Carruthd566df62012-12-17 21:40:04 +00002796 // Add in -fdebug-compilation-dir if necessary.
2797 addDebugCompDirArg(Args, CmdArgs);
Nick Lewycky7c4fd912011-10-21 02:32:14 +00002798
Richard Smithc18c4232011-11-21 19:36:32 +00002799 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2800 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002801 CmdArgs.push_back("-ftemplate-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002802 CmdArgs.push_back(A->getValue());
Daniel Dunbar1d460332009-03-18 10:01:51 +00002803 }
2804
Richard Smithc18c4232011-11-21 19:36:32 +00002805 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2806 CmdArgs.push_back("-fconstexpr-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002807 CmdArgs.push_back(A->getValue());
Richard Smithc18c4232011-11-21 19:36:32 +00002808 }
2809
Richard Smithe7565632013-05-08 02:12:03 +00002810 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2811 CmdArgs.push_back("-fconstexpr-steps");
2812 CmdArgs.push_back(A->getValue());
2813 }
2814
Richard Smith9e738cc2013-02-22 01:59:51 +00002815 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2816 CmdArgs.push_back("-fbracket-depth");
2817 CmdArgs.push_back(A->getValue());
2818 }
2819
Argyrios Kyrtzidis1380a142010-11-18 00:20:36 +00002820 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2821 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002822 if (A->getNumValues()) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002823 StringRef bytes = A->getValue();
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002824 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2825 } else
2826 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidis3532fdd2010-11-17 23:11:54 +00002827 }
2828
Nuno Lopesb3198a82012-05-08 22:10:46 +00002829
Michael J. Spencerc6357102012-10-22 22:13:48 +00002830 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar66861e02009-11-20 22:21:36 +00002831 CmdArgs.push_back("-relocatable-pch");
Mike Stump1eb44332009-09-09 15:08:12 +00002832
Daniel Dunbar294691e2009-11-04 06:24:38 +00002833 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2834 CmdArgs.push_back("-fconstant-string-class");
Richard Smith1d489cf2012-11-01 04:30:05 +00002835 CmdArgs.push_back(A->getValue());
Daniel Dunbar294691e2009-11-04 06:24:38 +00002836 }
David Chisnall8a5a9aa2009-08-31 16:41:57 +00002837
Chris Lattner124fca52010-01-09 21:54:33 +00002838 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2839 CmdArgs.push_back("-ftabstop");
Richard Smith1d489cf2012-11-01 04:30:05 +00002840 CmdArgs.push_back(A->getValue());
Chris Lattner124fca52010-01-09 21:54:33 +00002841 }
2842
Chris Lattner0f0c9632010-04-07 20:49:23 +00002843 CmdArgs.push_back("-ferror-limit");
2844 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smith1d489cf2012-11-01 04:30:05 +00002845 CmdArgs.push_back(A->getValue());
Chris Lattner0f0c9632010-04-07 20:49:23 +00002846 else
2847 CmdArgs.push_back("19");
Douglas Gregor575cf372010-04-20 07:18:24 +00002848
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002849 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2850 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002851 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002852 }
2853
2854 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2855 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002856 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002857 }
2858
Richard Smith08d6e032011-12-16 19:06:07 +00002859 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2860 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002861 CmdArgs.push_back(A->getValue());
Richard Smith08d6e032011-12-16 19:06:07 +00002862 }
2863
Daniel Dunbar55efe142009-11-04 06:24:47 +00002864 // Pass -fmessage-length=.
Daniel Dunbara28690e2009-11-30 08:40:54 +00002865 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar55efe142009-11-04 06:24:47 +00002866 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002867 CmdArgs.push_back(A->getValue());
Daniel Dunbar55efe142009-11-04 06:24:47 +00002868 } else {
2869 // If -fmessage-length=N was not specified, determine whether this is a
2870 // terminal and, if so, implicitly define -fmessage-length appropriately.
2871 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner5f9e2722011-07-23 10:55:15 +00002872 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar55efe142009-11-04 06:24:47 +00002873 }
2874
John McCalla880b192013-02-19 01:57:35 +00002875 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2876 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2877 options::OPT_fvisibility_ms_compat)) {
2878 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2879 CmdArgs.push_back("-fvisibility");
2880 CmdArgs.push_back(A->getValue());
2881 } else {
2882 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2883 CmdArgs.push_back("-fvisibility");
2884 CmdArgs.push_back("hidden");
2885 CmdArgs.push_back("-ftype-visibility");
2886 CmdArgs.push_back("default");
2887 }
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002888 }
2889
Douglas Gregor7cf84d62010-06-15 17:05:35 +00002890 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002891
Hans Wennborgde981f32012-06-28 08:01:44 +00002892 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2893
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002894 // -fhosted is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002895 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2896 KernelOrKext)
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002897 CmdArgs.push_back("-ffreestanding");
2898
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002899 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002900 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002901 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patelc69e1cf2010-09-30 19:05:55 +00002902 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel033be8b2011-11-04 20:05:58 +00002903 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christophere88c4512011-10-25 07:13:06 +00002904 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidt9e0b6472013-07-03 15:36:02 +00002905 // AltiVec language extensions aren't relevant for assembling.
2906 if (!isa<PreprocessJobAction>(JA) ||
2907 Output.getType() != types::TY_PP_Asm)
2908 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu246b6aa2012-06-26 18:18:47 +00002909 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2910 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier4574c3d2012-03-13 23:45:51 +00002911
Alexey Samsonov1b8f12d2013-08-19 09:14:21 +00002912 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Alexey Samsonov8bdc92c2013-08-09 07:42:13 +00002913 Sanitize.addArgs(getToolChain(), Args, CmdArgs);
Richard Smithc4dabad2012-11-05 22:04:41 +00002914
Will Dietz2d382d12012-12-30 20:53:28 +00002915 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2916 options::OPT_fno_sanitize_recover,
2917 true))
2918 CmdArgs.push_back("-fno-sanitize-recover");
2919
Chad Rosier78d85b12013-01-29 23:31:22 +00002920 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2921 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2922 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2923 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2924
Eric Christopher98654c92013-02-19 06:16:53 +00002925 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier4574c3d2012-03-13 23:45:51 +00002926 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002927 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00002928 getToolChain().getArch() == llvm::Triple::ppc64 ||
2929 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier4574c3d2012-03-13 23:45:51 +00002930 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00002931 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier4574c3d2012-03-13 23:45:51 +00002932
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00002933 if (getToolChain().SupportsProfiling())
2934 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00002935
2936 // -flax-vector-conversions is default.
2937 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2938 options::OPT_fno_lax_vector_conversions))
2939 CmdArgs.push_back("-fno-lax-vector-conversions");
2940
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002941 if (Args.getLastArg(options::OPT_fapple_kext))
2942 CmdArgs.push_back("-fapple-kext");
2943
David Blaikie940152f2012-06-14 18:55:27 +00002944 if (Args.hasFlag(options::OPT_frewrite_includes,
2945 options::OPT_fno_rewrite_includes, false))
2946 CmdArgs.push_back("-frewrite-includes");
2947
Fariborz Jahanian34e65772009-05-22 20:17:16 +00002948 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner182e0922009-04-21 05:34:31 +00002949 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregor4786c152010-08-19 20:24:43 +00002950 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002951 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2952 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnall7f18e672010-09-17 18:29:54 +00002953
2954 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2955 CmdArgs.push_back("-ftrapv-handler");
Richard Smith1d489cf2012-11-01 04:30:05 +00002956 CmdArgs.push_back(A->getValue());
David Chisnall7f18e672010-09-17 18:29:54 +00002957 }
2958
Bob Wilson71fd6cc2012-02-03 06:27:22 +00002959 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng49af1f32011-04-08 21:37:45 +00002960
Chandler Carruth5adb5a82011-03-27 00:04:55 +00002961 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2962 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2963 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2964 options::OPT_fno_wrapv)) {
2965 if (A->getOption().matches(options::OPT_fwrapv))
2966 CmdArgs.push_back("-fwrapv");
2967 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2968 options::OPT_fno_strict_overflow)) {
2969 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2970 CmdArgs.push_back("-fwrapv");
2971 }
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002972 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruthb26404a2013-08-08 08:34:35 +00002973 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
2974 options::OPT_fno_unroll_loops);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002975
Daniel Dunbar5345c392009-09-03 04:54:28 +00002976 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2977
Mahesha Sf3b52312012-10-27 07:47:56 +00002978
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002979 // -stack-protector=0 is default.
2980 unsigned StackProtectorLevel = 0;
Bill Wendling45483f72009-06-28 07:36:13 +00002981 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2982 options::OPT_fstack_protector_all,
2983 options::OPT_fstack_protector)) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002984 if (A->getOption().matches(options::OPT_fstack_protector))
2985 StackProtectorLevel = 1;
2986 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2987 StackProtectorLevel = 2;
Nico Weber2fef1112011-08-23 07:38:27 +00002988 } else {
2989 StackProtectorLevel =
2990 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2991 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002992 if (StackProtectorLevel) {
2993 CmdArgs.push_back("-stack-protector");
Chris Lattner5f9e2722011-07-23 10:55:15 +00002994 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002995 }
Chad Rosiera7afeb02012-08-21 16:16:06 +00002996
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002997 // --param ssp-buffer-size=
2998 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2999 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003000 StringRef Str((*it)->getValue());
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003001 if (Str.startswith("ssp-buffer-size=")) {
3002 if (StackProtectorLevel) {
Chad Rosiera7afeb02012-08-21 16:16:06 +00003003 CmdArgs.push_back("-stack-protector-buffer-size");
3004 // FIXME: Verify the argument is a valid integer.
3005 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosiera7afeb02012-08-21 16:16:06 +00003006 }
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003007 (*it)->claim();
Chad Rosiera7afeb02012-08-21 16:16:06 +00003008 }
Bill Wendling45483f72009-06-28 07:36:13 +00003009 }
3010
Nick Lewycky4e785c92011-12-06 03:33:03 +00003011 // Translate -mstackrealign
3012 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3013 false)) {
3014 CmdArgs.push_back("-backend-option");
3015 CmdArgs.push_back("-force-align-stack");
3016 }
3017 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3018 false)) {
3019 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3020 }
3021
Joerg Sonnenbergere9d11db2011-12-05 23:05:23 +00003022 if (Args.hasArg(options::OPT_mstack_alignment)) {
3023 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3024 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopher1a584022011-05-02 21:18:22 +00003025 }
Chad Rosier586a0612012-11-29 00:42:06 +00003026 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golin02ab7d32013-08-24 14:44:41 +00003027 if (!KernelOrKext) {
Renato Golinb69f9e02013-08-28 23:56:07 +00003028 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3029 options::OPT_munaligned_access)) {
3030 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3031 CmdArgs.push_back("-backend-option");
3032 CmdArgs.push_back("-arm-strict-align");
3033 } else {
3034 CmdArgs.push_back("-backend-option");
3035 CmdArgs.push_back("-arm-no-strict-align");
3036 }
Renato Golin02ab7d32013-08-24 14:44:41 +00003037 }
Chad Rosier7e293272012-11-09 17:29:19 +00003038 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00003039
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003040 // Forward -f options with positive and negative forms; we translate
3041 // these by hand.
3042
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003043 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar2843c192011-02-04 17:24:47 +00003044 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003045 CmdArgs.push_back("-fapple-kext");
3046 if (!Args.hasArg(options::OPT_fbuiltin))
3047 CmdArgs.push_back("-fno-builtin");
Chad Rosier3d265502012-03-26 21:29:17 +00003048 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003049 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003050 // -fbuiltin is default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003051 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar53e84842009-11-19 04:55:23 +00003052 CmdArgs.push_back("-fno-builtin");
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003053
Nuno Lopesfc284482009-12-16 16:59:22 +00003054 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3055 options::OPT_fno_assume_sane_operator_new))
3056 CmdArgs.push_back("-fno-assume-sane-operator-new");
3057
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003058 // -fblocks=0 is default.
3059 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnalle6533ff2011-02-28 17:11:43 +00003060 getToolChain().IsBlocksDefault()) ||
3061 (Args.hasArg(options::OPT_fgnu_runtime) &&
3062 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3063 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003064 CmdArgs.push_back("-fblocks");
John McCall13db5cf2011-09-09 20:41:01 +00003065
3066 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3067 !getToolChain().hasBlocksRuntime())
3068 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall5e530af2009-11-17 19:33:30 +00003069 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003070
Douglas Gregor64554ba2012-01-18 15:19:58 +00003071 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3072 // users must also pass -fcxx-modules. The latter flag will disappear once the
3073 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorf43b7212013-01-16 01:23:41 +00003074 bool HaveModules = false;
Douglas Gregor64554ba2012-01-18 15:19:58 +00003075 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3076 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3077 options::OPT_fno_cxx_modules,
3078 false);
Douglas Gregorf43b7212013-01-16 01:23:41 +00003079 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor64554ba2012-01-18 15:19:58 +00003080 CmdArgs.push_back("-fmodules");
Douglas Gregorf43b7212013-01-16 01:23:41 +00003081 HaveModules = true;
3082 }
3083 }
3084
Daniel Jasper056ec122013-08-05 20:26:17 +00003085 // -fmodule-maps enables module map processing (off by default) for header
3086 // checking. It is implied by -fmodules.
3087 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3088 false)) {
3089 CmdArgs.push_back("-fmodule-maps");
3090 }
3091
Daniel Jasper95411412013-10-21 06:34:34 +00003092 // -fmodules-decluse checks that modules used are declared so (off by
3093 // default).
Daniel Jasperddd2dfc2013-09-24 09:14:14 +00003094 if (Args.hasFlag(options::OPT_fmodules_decluse,
3095 options::OPT_fno_modules_decluse,
3096 false)) {
Daniel Jasper097595a2013-09-29 12:40:54 +00003097 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperddd2dfc2013-09-24 09:14:14 +00003098 }
3099
Daniel Jasper95411412013-10-21 06:34:34 +00003100 // -fmodule-name specifies the module that is currently being built (or
3101 // used for header checking by -fmodule-maps).
3102 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3103 A->claim();
3104 A->render(Args, CmdArgs);
3105 }
3106
3107 // -fmodule-map-file can be used to specify a file containing module
3108 // definitions.
3109 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3110 A->claim();
3111 A->render(Args, CmdArgs);
3112 }
3113
Douglas Gregor953a61f2013-02-07 19:01:24 +00003114 // If a module path was provided, pass it along. Otherwise, use a temporary
3115 // directory.
3116 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3117 A->claim();
3118 if (HaveModules) {
3119 A->render(Args, CmdArgs);
3120 }
3121 } else if (HaveModules) {
3122 SmallString<128> DefaultModuleCache;
3123 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3124 DefaultModuleCache);
Douglas Gregor892b6fb2013-03-21 21:48:48 +00003125 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3126 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor250172a2013-02-07 22:59:12 +00003127 const char Arg[] = "-fmodules-cache-path=";
3128 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3129 Arg, Arg + strlen(Arg));
Douglas Gregor953a61f2013-02-07 19:01:24 +00003130 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3131 }
3132
3133 // Pass through all -fmodules-ignore-macro arguments.
3134 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregord44d2872013-03-25 21:19:16 +00003135 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3136 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor953a61f2013-02-07 19:01:24 +00003137
John McCall32579cf2010-04-09 19:12:06 +00003138 // -faccess-control is default.
John McCall7002f4c2010-04-09 19:03:51 +00003139 if (Args.hasFlag(options::OPT_fno_access_control,
3140 options::OPT_faccess_control,
John McCall32579cf2010-04-09 19:12:06 +00003141 false))
John McCall7002f4c2010-04-09 19:03:51 +00003142 CmdArgs.push_back("-fno-access-control");
John McCall3ddd6e02010-03-17 01:32:13 +00003143
Anders Carlssona4c24752010-11-21 00:09:52 +00003144 // -felide-constructors is the default.
3145 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3146 options::OPT_felide_constructors,
3147 false))
3148 CmdArgs.push_back("-fno-elide-constructors");
3149
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003150 // -frtti is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00003151 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smithc4dabad2012-11-05 22:04:41 +00003152 KernelOrKext) {
Daniel Dunbar53e84842009-11-19 04:55:23 +00003153 CmdArgs.push_back("-fno-rtti");
Mike Stump738f8c22009-07-31 23:15:31 +00003154
Richard Smithc4dabad2012-11-05 22:04:41 +00003155 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonovbb1071c2012-11-06 15:09:03 +00003156 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumi03c60762012-11-06 22:02:00 +00003157 std::string NoRttiArg =
Richard Smithc4dabad2012-11-05 22:04:41 +00003158 Args.getLastArg(options::OPT_mkernel,
3159 options::OPT_fapple_kext,
Richard Smith04fd3822012-11-06 01:12:02 +00003160 options::OPT_fno_rtti)->getAsString(Args);
Richard Smithc4dabad2012-11-05 22:04:41 +00003161 D.Diag(diag::err_drv_argument_not_allowed_with)
3162 << "-fsanitize=vptr" << NoRttiArg;
3163 }
3164 }
3165
Tony Linthicum96319392011-12-12 21:14:55 +00003166 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00003167 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum96319392011-12-12 21:14:55 +00003168 options::OPT_fno_short_enums,
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003169 getToolChain().getArch() ==
Tony Linthicum96319392011-12-12 21:14:55 +00003170 llvm::Triple::hexagon))
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00003171 CmdArgs.push_back("-fshort-enums");
3172
Daniel Dunbar1f95e652009-11-17 06:37:03 +00003173 // -fsigned-char is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00003174 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbar1f95e652009-11-17 06:37:03 +00003175 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar76743522009-11-29 02:39:08 +00003176 CmdArgs.push_back("-fno-signed-char");
Eli Friedman5a779732009-06-05 07:21:14 +00003177
Anders Carlssona508b7d2010-02-06 23:23:06 +00003178 // -fthreadsafe-static is default.
Michael J. Spencer20249a12010-10-21 03:16:25 +00003179 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssona508b7d2010-02-06 23:23:06 +00003180 options::OPT_fno_threadsafe_statics))
3181 CmdArgs.push_back("-fno-threadsafe-statics");
3182
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00003183 // -fuse-cxa-atexit is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00003184 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3185 options::OPT_fno_use_cxa_atexit,
3186 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum96319392011-12-12 21:14:55 +00003187 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003188 getToolChain().getArch() != llvm::Triple::hexagon) ||
Chad Rosierafc4baa2012-03-26 22:04:46 +00003189 KernelOrKext)
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00003190 CmdArgs.push_back("-fno-use-cxa-atexit");
3191
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003192 // -fms-extensions=0 is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00003193 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003194 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3195 CmdArgs.push_back("-fms-extensions");
3196
Francois Pichetae556082011-09-17 04:32:15 +00003197 // -fms-compatibility=0 is default.
Douglas Gregorba97b6e2011-10-24 15:49:38 +00003198 if (Args.hasFlag(options::OPT_fms_compatibility,
3199 options::OPT_fno_ms_compatibility,
3200 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3201 Args.hasFlag(options::OPT_fms_extensions,
3202 options::OPT_fno_ms_extensions,
3203 true))))
Francois Pichetae556082011-09-17 04:32:15 +00003204 CmdArgs.push_back("-fms-compatibility");
3205
Reid Kleckner8c64c182013-09-18 00:33:59 +00003206 // -fmsc-version=1700 is default.
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003207 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3208 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3209 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00003210 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003211 if (msc_ver.empty())
Reid Kleckner8c64c182013-09-18 00:33:59 +00003212 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003213 else
3214 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3215 }
3216
3217
Eric Christophercfc01e42013-02-18 00:38:31 +00003218 // -fno-borland-extensions is default.
Dawn Perchik400b6072010-09-02 23:59:25 +00003219 if (Args.hasFlag(options::OPT_fborland_extensions,
3220 options::OPT_fno_borland_extensions, false))
3221 CmdArgs.push_back("-fborland-extensions");
3222
Francois Pichet8efcc012011-09-01 16:38:08 +00003223 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3224 // needs it.
Francois Pichet8387e2a2011-04-22 22:18:13 +00003225 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3226 options::OPT_fno_delayed_template_parsing,
Francois Pichet8efcc012011-09-01 16:38:08 +00003227 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet805bc1f2011-08-26 00:22:34 +00003228 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet8387e2a2011-04-22 22:18:13 +00003229
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00003230 // -fgnu-keywords default varies depending on language; only pass if
3231 // specified.
3232 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbar40788d92010-04-24 17:56:39 +00003233 options::OPT_fno_gnu_keywords))
3234 A->render(Args, CmdArgs);
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00003235
Rafael Espindola01ba8542011-06-02 17:30:53 +00003236 if (Args.hasFlag(options::OPT_fgnu89_inline,
3237 options::OPT_fno_gnu89_inline,
3238 false))
Rafael Espindolafb3f4aa2011-06-02 16:13:27 +00003239 CmdArgs.push_back("-fgnu89-inline");
3240
Chad Rosierfc055f92012-03-15 22:31:42 +00003241 if (Args.hasArg(options::OPT_fno_inline))
3242 CmdArgs.push_back("-fno-inline");
3243
Chad Rosier634a4b12012-03-06 21:17:19 +00003244 if (Args.hasArg(options::OPT_fno_inline_functions))
3245 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier250008b2012-03-06 18:49:20 +00003246
John McCall260611a2012-06-20 06:18:46 +00003247 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall9f084a32011-07-06 00:26:06 +00003248
John McCall260611a2012-06-20 06:18:46 +00003249 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahaniana6f5cc32013-10-15 17:16:30 +00003250 // legacy is the default. Next runtime is always legacy dispatch and
3251 // -fno-objc-legacy-dispatch gets ignored silently.
3252 if (objcRuntime.isNonFragile() && !objcRuntime.isNeXTFamily()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003253 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3254 options::OPT_fno_objc_legacy_dispatch,
David Chisnall2c7886d2012-07-04 11:52:24 +00003255 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003256 getToolChain().getArch()))) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003257 if (getToolChain().UseObjCMixedDispatch())
3258 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3259 else
3260 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3261 }
3262 }
3263
Fariborz Jahanian3d145f62012-11-15 19:02:45 +00003264 // -fencode-extended-block-signature=1 is default.
3265 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3266 CmdArgs.push_back("-fencode-extended-block-signature");
3267 }
3268
John McCall9f084a32011-07-06 00:26:06 +00003269 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3270 // NOTE: This logic is duplicated in ToolChains.cpp.
3271 bool ARC = isObjCAutoRefCount(Args);
3272 if (ARC) {
John McCall0a7dd782012-08-21 02:47:43 +00003273 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis5840dd92012-02-29 03:43:52 +00003274
John McCall9f084a32011-07-06 00:26:06 +00003275 CmdArgs.push_back("-fobjc-arc");
3276
Chandler Carruth7ffa0322011-11-04 07:34:47 +00003277 // FIXME: It seems like this entire block, and several around it should be
3278 // wrapped in isObjC, but for now we just use it here as this is where it
3279 // was being used previously.
3280 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3281 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3282 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3283 else
3284 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3285 }
3286
John McCall9f084a32011-07-06 00:26:06 +00003287 // Allow the user to enable full exceptions code emission.
3288 // We define off for Objective-CC, on for Objective-C++.
3289 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3290 options::OPT_fno_objc_arc_exceptions,
3291 /*default*/ types::isCXX(InputType)))
3292 CmdArgs.push_back("-fobjc-arc-exceptions");
3293 }
3294
3295 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3296 // rewriter.
John McCall260611a2012-06-20 06:18:46 +00003297 if (rewriteKind != RK_None)
John McCall9f084a32011-07-06 00:26:06 +00003298 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003299
John McCall9f084a32011-07-06 00:26:06 +00003300 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3301 // takes precedence.
3302 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3303 if (!GCArg)
3304 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3305 if (GCArg) {
3306 if (ARC) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00003307 D.Diag(diag::err_drv_objc_gc_arr)
John McCall9f084a32011-07-06 00:26:06 +00003308 << GCArg->getAsString(Args);
3309 } else if (getToolChain().SupportsObjCGC()) {
3310 GCArg->render(Args, CmdArgs);
3311 } else {
3312 // FIXME: We should move this to a hard error.
Chris Lattner5f9e2722011-07-23 10:55:15 +00003313 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall9f084a32011-07-06 00:26:06 +00003314 << GCArg->getAsString(Args);
3315 }
3316 }
3317
John McCalld71315c2011-06-22 00:53:57 +00003318 // Add exception args.
3319 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall260611a2012-06-20 06:18:46 +00003320 KernelOrKext, objcRuntime, CmdArgs);
John McCalld71315c2011-06-22 00:53:57 +00003321
3322 if (getToolChain().UseSjLjExceptions())
3323 CmdArgs.push_back("-fsjlj-exceptions");
3324
3325 // C++ "sane" operator new.
Daniel Dunbar984eb862010-02-01 21:07:25 +00003326 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3327 options::OPT_fno_assume_sane_operator_new))
3328 CmdArgs.push_back("-fno-assume-sane-operator-new");
3329
Daniel Dunbarf35f14d2010-04-27 15:34:57 +00003330 // -fconstant-cfstrings is default, and may be subject to argument translation
3331 // on Darwin.
3332 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3333 options::OPT_fno_constant_cfstrings) ||
3334 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3335 options::OPT_mno_constant_cfstrings))
3336 CmdArgs.push_back("-fno-constant-cfstrings");
3337
John Thompsona6fda122009-11-05 20:14:16 +00003338 // -fshort-wchar default varies depending on platform; only
3339 // pass if specified.
Daniel Dunbar1744a352010-04-27 15:35:03 +00003340 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3341 A->render(Args, CmdArgs);
John Thompsona6fda122009-11-05 20:14:16 +00003342
Hans Wennborgb087a5d2013-07-31 23:39:13 +00003343 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003344 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00003345 options::OPT_fno_pascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00003346 false))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003347 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00003348
Daniel Dunbar88934e82011-10-05 21:04:55 +00003349 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3350 // -fno-pack-struct doesn't apply to -fpack-struct=.
3351 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloy8049c442012-05-02 07:56:14 +00003352 std::string PackStructStr = "-fpack-struct=";
Richard Smith1d489cf2012-11-01 04:30:05 +00003353 PackStructStr += A->getValue();
James Molloy8049c442012-05-02 07:56:14 +00003354 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar88934e82011-10-05 21:04:55 +00003355 } else if (Args.hasFlag(options::OPT_fpack_struct,
3356 options::OPT_fno_pack_struct, false)) {
James Molloy8049c442012-05-02 07:56:14 +00003357 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar88934e82011-10-05 21:04:55 +00003358 }
3359
Robert Lytton5f15f4d2013-08-13 09:43:10 +00003360 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003361 if (!Args.hasArg(options::OPT_fcommon))
3362 CmdArgs.push_back("-fno-common");
Chad Rosierec09b3e2012-03-26 21:35:40 +00003363 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003364 }
Daniel Dunbar88934e82011-10-05 21:04:55 +00003365
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003366 // -fcommon is default, only pass non-default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003367 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003368 CmdArgs.push_back("-fno-common");
3369
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003370 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003371 // -funsigned-bitfields.
Mike Stump1eb44332009-09-09 15:08:12 +00003372 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003373 options::OPT_funsigned_bitfields))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003374 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003375 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3376
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003377 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3378 if (!Args.hasFlag(options::OPT_ffor_scope,
3379 options::OPT_fno_for_scope))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003380 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003381 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3382
Jeffrey Yasskin0ea22fd2010-06-08 04:56:20 +00003383 // -fcaret-diagnostics is default.
3384 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3385 options::OPT_fno_caret_diagnostics, true))
3386 CmdArgs.push_back("-fno-caret-diagnostics");
3387
Daniel Dunbar49138fc2009-04-19 21:09:34 +00003388 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump1eb44332009-09-09 15:08:12 +00003389 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar49138fc2009-04-19 21:09:34 +00003390 options::OPT_fno_diagnostics_fixit_info))
3391 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003392
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003393 // Enable -fdiagnostics-show-option by default.
Mike Stump1eb44332009-09-09 15:08:12 +00003394 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003395 options::OPT_fno_diagnostics_show_option))
3396 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar838be482009-11-04 06:24:57 +00003397
Chris Lattner6fbe8392010-05-04 21:55:25 +00003398 if (const Arg *A =
3399 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3400 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smith1d489cf2012-11-01 04:30:05 +00003401 CmdArgs.push_back(A->getValue());
Chris Lattner6fbe8392010-05-04 21:55:25 +00003402 }
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003403
Douglas Gregorc9471b02011-05-21 17:07:29 +00003404 if (const Arg *A =
3405 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3406 CmdArgs.push_back("-fdiagnostics-format");
Richard Smith1d489cf2012-11-01 04:30:05 +00003407 CmdArgs.push_back(A->getValue());
Douglas Gregorc9471b02011-05-21 17:07:29 +00003408 }
3409
Chandler Carruthabaca7a2011-03-27 01:50:55 +00003410 if (Arg *A = Args.getLastArg(
3411 options::OPT_fdiagnostics_show_note_include_stack,
3412 options::OPT_fno_diagnostics_show_note_include_stack)) {
3413 if (A->getOption().matches(
3414 options::OPT_fdiagnostics_show_note_include_stack))
3415 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3416 else
3417 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3418 }
3419
Daniel Dunbar838be482009-11-04 06:24:57 +00003420 // Color diagnostics are the default, unless the terminal doesn't support
3421 // them.
Nico Weber9753d462013-04-17 21:52:44 +00003422 // Support both clang's -f[no-]color-diagnostics and gcc's
3423 // -f[no-]diagnostics-colors[=never|always|auto].
3424 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3425 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3426 it != ie; ++it) {
3427 const Option &O = (*it)->getOption();
3428 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3429 !O.matches(options::OPT_fdiagnostics_color) &&
3430 !O.matches(options::OPT_fno_color_diagnostics) &&
3431 !O.matches(options::OPT_fno_diagnostics_color) &&
3432 !O.matches(options::OPT_fdiagnostics_color_EQ))
3433 continue;
3434
3435 (*it)->claim();
3436 if (O.matches(options::OPT_fcolor_diagnostics) ||
3437 O.matches(options::OPT_fdiagnostics_color)) {
3438 ShowColors = Colors_On;
3439 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3440 O.matches(options::OPT_fno_diagnostics_color)) {
3441 ShowColors = Colors_Off;
3442 } else {
3443 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3444 StringRef value((*it)->getValue());
3445 if (value == "always")
3446 ShowColors = Colors_On;
3447 else if (value == "never")
3448 ShowColors = Colors_Off;
3449 else if (value == "auto")
3450 ShowColors = Colors_Auto;
3451 else
3452 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3453 << ("-fdiagnostics-color=" + value).str();
3454 }
3455 }
3456 if (ShowColors == Colors_On ||
3457 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar838be482009-11-04 06:24:57 +00003458 CmdArgs.push_back("-fcolor-diagnostics");
3459
Nico Rieck2956ef42013-09-11 00:38:02 +00003460 if (Args.hasArg(options::OPT_fansi_escape_codes))
3461 CmdArgs.push_back("-fansi-escape-codes");
3462
Daniel Dunbar75eb1d62009-06-08 21:13:54 +00003463 if (!Args.hasFlag(options::OPT_fshow_source_location,
3464 options::OPT_fno_show_source_location))
3465 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003466
Douglas Gregorc9471b02011-05-21 17:07:29 +00003467 if (!Args.hasFlag(options::OPT_fshow_column,
3468 options::OPT_fno_show_column,
3469 true))
3470 CmdArgs.push_back("-fno-show-column");
3471
Douglas Gregora0068fc2010-07-09 17:35:33 +00003472 if (!Args.hasFlag(options::OPT_fspell_checking,
3473 options::OPT_fno_spell_checking))
3474 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003475
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00003476
Chad Rosier15490fd2012-12-05 21:08:21 +00003477 // -fno-asm-blocks is default.
3478 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3479 false))
3480 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00003481
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003482 // Enable vectorization per default according to the optimization level
3483 // selected. For optimization levels that want vectorization we use the alias
3484 // option to simplify the hasFlag logic.
3485 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3486 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier31422792013-04-24 18:29:59 +00003487 options::OPT_fvectorize;
Chad Rosier31422792013-04-24 18:29:59 +00003488 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkelcf5691e2013-08-28 05:21:45 +00003489 options::OPT_fno_vectorize, EnableVec))
Chad Rosierc04d0932012-12-11 17:12:28 +00003490 CmdArgs.push_back("-vectorize-loops");
Chad Rosierc04d0932012-12-11 17:12:28 +00003491
Rafael Espindolad8360612013-08-01 23:56:42 +00003492 // -fslp-vectorize is default.
3493 if (Args.hasFlag(options::OPT_fslp_vectorize,
3494 options::OPT_fno_slp_vectorize, true))
Nadav Rotem50ea9632013-04-15 04:57:18 +00003495 CmdArgs.push_back("-vectorize-slp");
Hal Finkel443c9992012-12-11 19:59:32 +00003496
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003497 // -fno-slp-vectorize-aggressive is default.
3498 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00003499 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003500 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003501
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00003502 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3503 A->render(Args, CmdArgs);
3504
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003505 // -fdollars-in-identifiers default varies depending on platform and
3506 // language; only pass if specified.
Mike Stump1eb44332009-09-09 15:08:12 +00003507 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003508 options::OPT_fno_dollars_in_identifiers)) {
3509 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar8663b182009-12-16 20:10:18 +00003510 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003511 else
Daniel Dunbar8663b182009-12-16 20:10:18 +00003512 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003513 }
3514
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003515 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3516 // practical purposes.
Mike Stump1eb44332009-09-09 15:08:12 +00003517 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003518 options::OPT_fno_unit_at_a_time)) {
3519 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003520 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003521 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00003522
Eli Friedman19bda3a2011-11-02 01:53:16 +00003523 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3524 options::OPT_fno_apple_pragma_pack, false))
3525 CmdArgs.push_back("-fapple-pragma-pack");
3526
Eli Benderskyf3ecf892013-07-24 18:20:14 +00003527 // le32-specific flags:
3528 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3529 // by default.
3530 if (getToolChain().getArch() == llvm::Triple::le32) {
3531 CmdArgs.push_back("-fno-math-builtin");
3532 }
3533
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003534 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003535 //
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00003536 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003537#if 0
Bob Wilson905c45f2011-10-14 05:03:44 +00003538 if (getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003539 (getToolChain().getArch() == llvm::Triple::arm ||
3540 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003541 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3542 CmdArgs.push_back("-fno-builtin-strcat");
3543 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3544 CmdArgs.push_back("-fno-builtin-strcpy");
3545 }
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003546#endif
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003547
Daniel Dunbard98750f2011-03-18 21:23:40 +00003548 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump1eb44332009-09-09 15:08:12 +00003549 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbard98750f2011-03-18 21:23:40 +00003550 options::OPT_traditional_cpp)) {
3551 if (isa<PreprocessJobAction>(JA))
3552 CmdArgs.push_back("-traditional-cpp");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003553 else
Chris Lattner5f9e2722011-07-23 10:55:15 +00003554 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbard98750f2011-03-18 21:23:40 +00003555 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00003556
Daniel Dunbar1d460332009-03-18 10:01:51 +00003557 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnerd82df3a2009-04-12 01:56:53 +00003558 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremenek36f6e302011-11-11 00:07:43 +00003559
3560 // Handle serialized diagnostics.
3561 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3562 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smith1d489cf2012-11-01 04:30:05 +00003563 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremenek36f6e302011-11-11 00:07:43 +00003564 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003565
Ted Kremenek127ff2e2012-09-13 06:41:18 +00003566 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3567 CmdArgs.push_back("-fretain-comments-from-system-headers");
3568
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00003569 // Forward -fcomment-block-commands to -cc1.
3570 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenko6fd7d302013-04-10 15:35:17 +00003571 // Forward -fparse-all-comments to -cc1.
3572 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00003573
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003574 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3575 // parser.
Daniel Dunbar1d460332009-03-18 10:01:51 +00003576 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003577 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3578 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003579 (*it)->claim();
Daniel Dunbarfb36d212010-04-17 06:10:00 +00003580
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003581 // We translate this by hand to the -cc1 argument, since nightly test uses
3582 // it and developers have been trained to spell it with -mllvm.
Richard Smith1d489cf2012-11-01 04:30:05 +00003583 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003584 CmdArgs.push_back("-disable-llvm-optzns");
3585 else
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003586 (*it)->render(Args, CmdArgs);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003587 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003588
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00003589 if (Output.getType() == types::TY_Dependencies) {
3590 // Handled with other dependency code.
Daniel Dunbar115a7922009-03-19 07:29:38 +00003591 } else if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003592 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003593 CmdArgs.push_back(Output.getFilename());
3594 } else {
3595 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003596 }
3597
Daniel Dunbar1d460332009-03-18 10:01:51 +00003598 for (InputInfoList::const_iterator
3599 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3600 const InputInfo &II = *it;
3601 CmdArgs.push_back("-x");
Fariborz Jahaniana5ee0892012-09-28 19:05:17 +00003602 if (Args.hasArg(options::OPT_rewrite_objc))
3603 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3604 else
3605 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003606 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00003607 CmdArgs.push_back(II.getFilename());
Daniel Dunbar1d460332009-03-18 10:01:51 +00003608 else
Daniel Dunbar115a7922009-03-19 07:29:38 +00003609 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00003610 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003611
Chris Lattnere6113de2009-11-03 19:50:27 +00003612 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3613
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003614 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003615
3616 // Optionally embed the -cc1 level arguments into the debug info, for build
3617 // analysis.
3618 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar6e900472010-06-04 18:47:06 +00003619 ArgStringList OriginalArgs;
3620 for (ArgList::const_iterator it = Args.begin(),
3621 ie = Args.end(); it != ie; ++it)
3622 (*it)->render(Args, OriginalArgs);
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003623
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003624 SmallString<256> Flags;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003625 Flags += Exec;
Daniel Dunbar6e900472010-06-04 18:47:06 +00003626 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003627 Flags += " ";
Daniel Dunbar6e900472010-06-04 18:47:06 +00003628 Flags += OriginalArgs[i];
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003629 }
3630 CmdArgs.push_back("-dwarf-debug-flags");
3631 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3632 }
3633
Eric Christopher80190392013-02-22 20:12:52 +00003634 // Add the split debug info name to the command lines here so we
3635 // can propagate it to the backend.
3636 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00003637 getToolChain().getTriple().isOSLinux() &&
Eric Christopherff971d72013-02-22 23:50:16 +00003638 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopher80190392013-02-22 20:12:52 +00003639 const char *SplitDwarfOut;
3640 if (SplitDwarf) {
3641 CmdArgs.push_back("-split-dwarf-file");
3642 SplitDwarfOut = SplitDebugName(Args, Inputs);
3643 CmdArgs.push_back(SplitDwarfOut);
3644 }
3645
3646 // Finally add the compile command to the compilation.
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00003647 if (Args.hasArg(options::OPT__SLASH_fallback)) {
3648 tools::visualstudio::Compile CL(getToolChain());
3649 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3650 LinkingOutput);
3651 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3652 } else {
3653 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3654 }
3655
Daniel Dunbara880db02009-03-23 19:03:36 +00003656
Eric Christopherff971d72013-02-22 23:50:16 +00003657 // Handle the debug info splitting at object creation time if we're
3658 // creating an object.
Eric Christopher59320e72013-02-21 22:35:01 +00003659 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherff971d72013-02-22 23:50:16 +00003660 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopher80190392013-02-22 20:12:52 +00003661 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher59320e72013-02-21 22:35:01 +00003662
Roman Divackybe4c8702011-02-10 16:52:03 +00003663 if (Arg *A = Args.getLastArg(options::OPT_pg))
3664 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003665 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divackybe4c8702011-02-10 16:52:03 +00003666 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer20249a12010-10-21 03:16:25 +00003667
Daniel Dunbar68fb4692009-04-03 20:51:31 +00003668 // Claim some arguments which clang supports automatically.
3669
Daniel Dunbarf4046862010-04-15 06:18:42 +00003670 // -fpch-preprocess is used with gcc to add a special marker in the output to
3671 // include the PCH file. Clang's PTH solution is completely transparent, so we
3672 // do not need to deal with it at all.
Daniel Dunbar68fb4692009-04-03 20:51:31 +00003673 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003674
Daniel Dunbara880db02009-03-23 19:03:36 +00003675 // Claim some arguments which clang doesn't support, but we don't
3676 // care to warn the user about.
Daniel Dunbarcdd96862009-11-25 11:53:23 +00003677 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3678 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola035ff0c2011-02-28 23:29:45 +00003679
Rafael Espindola6155fbe2013-09-04 19:37:35 +00003680 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003681 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003682}
3683
John McCall260611a2012-06-20 06:18:46 +00003684/// Add options related to the Objective-C runtime/ABI.
3685///
3686/// Returns true if the runtime is non-fragile.
3687ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3688 ArgStringList &cmdArgs,
3689 RewriteKind rewriteKind) const {
3690 // Look for the controlling runtime option.
3691 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3692 options::OPT_fgnu_runtime,
3693 options::OPT_fobjc_runtime_EQ);
3694
3695 // Just forward -fobjc-runtime= to the frontend. This supercedes
3696 // options about fragility.
3697 if (runtimeArg &&
3698 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3699 ObjCRuntime runtime;
Richard Smith1d489cf2012-11-01 04:30:05 +00003700 StringRef value = runtimeArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003701 if (runtime.tryParse(value)) {
3702 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3703 << value;
3704 }
3705
3706 runtimeArg->render(args, cmdArgs);
3707 return runtime;
3708 }
3709
3710 // Otherwise, we'll need the ABI "version". Version numbers are
3711 // slightly confusing for historical reasons:
3712 // 1 - Traditional "fragile" ABI
3713 // 2 - Non-fragile ABI, version 1
3714 // 3 - Non-fragile ABI, version 2
3715 unsigned objcABIVersion = 1;
3716 // If -fobjc-abi-version= is present, use that to set the version.
3717 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003718 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003719 if (value == "1")
3720 objcABIVersion = 1;
3721 else if (value == "2")
3722 objcABIVersion = 2;
3723 else if (value == "3")
3724 objcABIVersion = 3;
3725 else
3726 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3727 << value;
3728 } else {
3729 // Otherwise, determine if we are using the non-fragile ABI.
3730 bool nonFragileABIIsDefault =
3731 (rewriteKind == RK_NonFragile ||
3732 (rewriteKind == RK_None &&
3733 getToolChain().IsObjCNonFragileABIDefault()));
3734 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3735 options::OPT_fno_objc_nonfragile_abi,
3736 nonFragileABIIsDefault)) {
3737 // Determine the non-fragile ABI version to use.
3738#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3739 unsigned nonFragileABIVersion = 1;
3740#else
3741 unsigned nonFragileABIVersion = 2;
3742#endif
3743
3744 if (Arg *abiArg = args.getLastArg(
3745 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003746 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003747 if (value == "1")
3748 nonFragileABIVersion = 1;
3749 else if (value == "2")
3750 nonFragileABIVersion = 2;
3751 else
3752 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3753 << value;
3754 }
3755
3756 objcABIVersion = 1 + nonFragileABIVersion;
3757 } else {
3758 objcABIVersion = 1;
3759 }
3760 }
3761
3762 // We don't actually care about the ABI version other than whether
3763 // it's non-fragile.
3764 bool isNonFragile = objcABIVersion != 1;
3765
3766 // If we have no runtime argument, ask the toolchain for its default runtime.
3767 // However, the rewriter only really supports the Mac runtime, so assume that.
3768 ObjCRuntime runtime;
3769 if (!runtimeArg) {
3770 switch (rewriteKind) {
3771 case RK_None:
3772 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3773 break;
3774 case RK_Fragile:
3775 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3776 break;
3777 case RK_NonFragile:
3778 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3779 break;
3780 }
3781
3782 // -fnext-runtime
3783 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3784 // On Darwin, make this use the default behavior for the toolchain.
3785 if (getToolChain().getTriple().isOSDarwin()) {
3786 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3787
3788 // Otherwise, build for a generic macosx port.
3789 } else {
3790 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3791 }
3792
3793 // -fgnu-runtime
3794 } else {
3795 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnalla422cd02012-07-04 10:37:03 +00003796 // Legacy behaviour is to target the gnustep runtime if we are i
3797 // non-fragile mode or the GCC runtime in fragile mode.
3798 if (isNonFragile)
David Chisnall891dac72012-10-16 15:11:55 +00003799 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnalla422cd02012-07-04 10:37:03 +00003800 else
3801 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall260611a2012-06-20 06:18:46 +00003802 }
3803
3804 cmdArgs.push_back(args.MakeArgString(
3805 "-fobjc-runtime=" + runtime.getAsString()));
3806 return runtime;
3807}
3808
Hans Wennborgb3574792013-08-08 00:17:41 +00003809void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
3810 unsigned RTOptionID = options::OPT__SLASH_MT;
3811
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00003812 if (Args.hasArg(options::OPT__SLASH_LDd))
3813 // The /LDd option implies /MTd. The dependent lib part can be overridden,
3814 // but defining _DEBUG is sticky.
3815 RTOptionID = options::OPT__SLASH_MTd;
3816
Hans Wennborg76da1782013-09-18 22:26:39 +00003817 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborgb3574792013-08-08 00:17:41 +00003818 RTOptionID = A->getOption().getID();
Hans Wennborg42ade492013-09-11 16:38:41 +00003819
Hans Wennborgb3574792013-08-08 00:17:41 +00003820 switch(RTOptionID) {
3821 case options::OPT__SLASH_MD:
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00003822 if (Args.hasArg(options::OPT__SLASH_LDd))
3823 CmdArgs.push_back("-D_DEBUG");
Hans Wennborgb3574792013-08-08 00:17:41 +00003824 CmdArgs.push_back("-D_MT");
3825 CmdArgs.push_back("-D_DLL");
3826 CmdArgs.push_back("--dependent-lib=msvcrt");
3827 break;
3828 case options::OPT__SLASH_MDd:
3829 CmdArgs.push_back("-D_DEBUG");
3830 CmdArgs.push_back("-D_MT");
3831 CmdArgs.push_back("-D_DLL");
3832 CmdArgs.push_back("--dependent-lib=msvcrtd");
3833 break;
3834 case options::OPT__SLASH_MT:
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00003835 if (Args.hasArg(options::OPT__SLASH_LDd))
3836 CmdArgs.push_back("-D_DEBUG");
Hans Wennborgb3574792013-08-08 00:17:41 +00003837 CmdArgs.push_back("-D_MT");
3838 CmdArgs.push_back("--dependent-lib=libcmt");
3839 break;
3840 case options::OPT__SLASH_MTd:
3841 CmdArgs.push_back("-D_DEBUG");
3842 CmdArgs.push_back("-D_MT");
3843 CmdArgs.push_back("--dependent-lib=libcmtd");
3844 break;
3845 default:
3846 llvm_unreachable("Unexpected option ID.");
3847 }
3848
Reid Klecknera32c5232013-08-08 19:33:10 +00003849 // This provides POSIX compatibility (maps 'open' to '_open'), which most
3850 // users want. The /Za flag to cl.exe turns this off, but it's not
3851 // implemented in clang.
3852 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborgf0f98912013-08-08 19:54:30 +00003853
3854 // FIXME: Make this default for the win32 triple.
3855 CmdArgs.push_back("-cxx-abi");
3856 CmdArgs.push_back("microsoft");
Hans Wennborg708002e2013-08-09 00:32:23 +00003857
3858 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
3859 A->render(Args, CmdArgs);
Hans Wennborgb6475522013-09-10 01:07:07 +00003860
3861 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
3862 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborg89e32742013-09-24 00:08:55 +00003863 if (Args.hasArg(options::OPT__SLASH_fallback))
3864 CmdArgs.push_back("msvc-fallback");
3865 else
3866 CmdArgs.push_back("msvc");
Hans Wennborgb6475522013-09-10 01:07:07 +00003867 }
Hans Wennborgb3574792013-08-08 00:17:41 +00003868}
3869
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003870void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003871 const InputInfo &Output,
3872 const InputInfoList &Inputs,
3873 const ArgList &Args,
3874 const char *LinkingOutput) const {
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003875 ArgStringList CmdArgs;
3876
3877 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3878 const InputInfo &Input = Inputs[0];
3879
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003880 // Don't warn about "clang -w -c foo.s"
3881 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003882 // and "clang -emit-llvm -c foo.s"
3883 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003884
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003885 // Invoke ourselves in -cc1as mode.
3886 //
3887 // FIXME: Implement custom jobs for internal actions.
3888 CmdArgs.push_back("-cc1as");
3889
3890 // Add the "effective" target triple.
3891 CmdArgs.push_back("-triple");
Chad Rosier61ab80a2011-09-20 20:44:06 +00003892 std::string TripleStr =
3893 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003894 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3895
3896 // Set the output mode, we currently only expect to be used as a real
3897 // assembler.
3898 CmdArgs.push_back("-filetype");
3899 CmdArgs.push_back("obj");
3900
Eric Christopher27e2b982012-12-18 00:31:10 +00003901 // Set the main file name, so that debug info works even with
3902 // -save-temps or preprocessed assembly.
3903 CmdArgs.push_back("-main-file-name");
3904 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3905
Rafael Espindolab330e402013-08-20 22:12:08 +00003906 // Add the target cpu
Rafael Espindola146dbbf2013-08-21 16:39:20 +00003907 const llvm::Triple &Triple = getToolChain().getTriple();
3908 std::string CPU = getCPUName(Args, Triple);
Rafael Espindolab330e402013-08-20 22:12:08 +00003909 if (!CPU.empty()) {
3910 CmdArgs.push_back("-target-cpu");
3911 CmdArgs.push_back(Args.MakeArgString(CPU));
3912 }
3913
Rafael Espindola146dbbf2013-08-21 16:39:20 +00003914 // Add the target features
3915 const Driver &D = getToolChain().getDriver();
3916 getTargetFeatures(D, Triple, Args, CmdArgs);
Jim Grosbachfc308292012-02-10 20:37:10 +00003917
Daniel Dunbar7f6f8c82011-03-17 17:37:29 +00003918 // Ignore explicit -force_cpusubtype_ALL option.
3919 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003920
Eric Christopher8f0a4032012-01-10 00:38:01 +00003921 // Determine the original source input.
3922 const Action *SourceAction = &JA;
3923 while (SourceAction->getKind() != Action::InputClass) {
3924 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3925 SourceAction = SourceAction->getInputs()[0];
3926 }
3927
Chandler Carruthd566df62012-12-17 21:40:04 +00003928 // Forward -g and handle debug info related flags, assuming we are dealing
3929 // with an actual assembly file.
Eric Christopher8f0a4032012-01-10 00:38:01 +00003930 if (SourceAction->getType() == types::TY_Asm ||
3931 SourceAction->getType() == types::TY_PP_Asm) {
3932 Args.ClaimAllArgs(options::OPT_g_Group);
3933 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3934 if (!A->getOption().matches(options::OPT_g0))
3935 CmdArgs.push_back("-g");
Chandler Carruthd566df62012-12-17 21:40:04 +00003936
3937 // Add the -fdebug-compilation-dir flag if needed.
3938 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderby02341792013-01-17 21:38:06 +00003939
3940 // Set the AT_producer to the clang version when using the integrated
3941 // assembler on assembly source files.
3942 CmdArgs.push_back("-dwarf-debug-producer");
3943 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopher8f0a4032012-01-10 00:38:01 +00003944 }
Kevin Enderby567003e2011-12-22 19:31:58 +00003945
3946 // Optionally embed the -cc1as level arguments into the debug info, for build
3947 // analysis.
3948 if (getToolChain().UseDwarfDebugFlags()) {
3949 ArgStringList OriginalArgs;
3950 for (ArgList::const_iterator it = Args.begin(),
3951 ie = Args.end(); it != ie; ++it)
3952 (*it)->render(Args, OriginalArgs);
3953
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003954 SmallString<256> Flags;
Kevin Enderby567003e2011-12-22 19:31:58 +00003955 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3956 Flags += Exec;
3957 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3958 Flags += " ";
3959 Flags += OriginalArgs[i];
3960 }
3961 CmdArgs.push_back("-dwarf-debug-flags");
3962 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3963 }
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003964
3965 // FIXME: Add -static support, once we have it.
3966
David Blaikie73168db2013-07-25 21:19:01 +00003967 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
3968 getToolChain().getDriver());
3969
Daniel Dunbar3df23252011-04-29 17:53:18 +00003970 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003971
3972 assert(Output.isFilename() && "Unexpected lipo output.");
3973 CmdArgs.push_back("-o");
3974 CmdArgs.push_back(Output.getFilename());
3975
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003976 assert(Input.isFilename() && "Invalid input.");
3977 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003978
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003979 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003980 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher708d72a2013-04-10 21:30:40 +00003981
3982 // Handle the debug info splitting at object creation time if we're
3983 // creating an object.
3984 // TODO: Currently only works on linux with newer objcopy.
3985 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00003986 getToolChain().getTriple().isOSLinux())
Eric Christopher708d72a2013-04-10 21:30:40 +00003987 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
3988 SplitDebugName(Args, Inputs));
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003989}
3990
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003991void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003992 const InputInfo &Output,
3993 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00003994 const ArgList &Args,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003995 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003996 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003997 ArgStringList CmdArgs;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003998
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003999 for (ArgList::const_iterator
Daniel Dunbar1d460332009-03-18 10:01:51 +00004000 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004001 Arg *A = *it;
Michael J. Spencer91e06da2012-10-19 22:37:06 +00004002 if (forwardToGCC(A->getOption())) {
Daniel Dunbar2dffe2d2010-08-03 16:14:14 +00004003 // Don't forward any -g arguments to assembly steps.
4004 if (isa<AssembleJobAction>(JA) &&
4005 A->getOption().matches(options::OPT_g_Group))
4006 continue;
4007
NAKAMURA Takumi3c6c8222013-08-19 11:51:51 +00004008 // Don't forward any -W arguments to assembly and link steps.
4009 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4010 A->getOption().matches(options::OPT_W_Group))
4011 continue;
4012
Daniel Dunbar75877192009-03-19 07:55:12 +00004013 // It is unfortunate that we have to claim here, as this means
4014 // we will basically never report anything interesting for
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004015 // platforms using a generic gcc, even if we are just using gcc
4016 // to get to the assembler.
Daniel Dunbar75877192009-03-19 07:55:12 +00004017 A->claim();
Daniel Dunbar1d460332009-03-18 10:01:51 +00004018 A->render(Args, CmdArgs);
Daniel Dunbar75877192009-03-19 07:55:12 +00004019 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004020 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004021
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004022 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004023
4024 // If using a driver driver, force the arch.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004025 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson905c45f2011-10-14 05:03:44 +00004026 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004027 CmdArgs.push_back("-arch");
Daniel Dunbarbf54a062009-04-01 20:33:11 +00004028
4029 // FIXME: Remove these special cases.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004030 if (Arch == llvm::Triple::ppc)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004031 CmdArgs.push_back("ppc");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004032 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004033 CmdArgs.push_back("ppc64");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00004034 else if (Arch == llvm::Triple::ppc64le)
4035 CmdArgs.push_back("ppc64le");
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004036 else
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004037 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004038 }
4039
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004040 // Try to force gcc to match the tool chain we want, if we recognize
4041 // the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004042 //
4043 // FIXME: The triple class should directly provide the information we want
4044 // here.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004045 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004046 CmdArgs.push_back("-m32");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00004047 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4048 Arch == llvm::Triple::ppc64le)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004049 CmdArgs.push_back("-m64");
4050
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004051 if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004052 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00004053 CmdArgs.push_back(Output.getFilename());
4054 } else {
4055 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004056 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar115a7922009-03-19 07:29:38 +00004057 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004058
Tony Linthicum96319392011-12-12 21:14:55 +00004059 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4060 options::OPT_Xassembler);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004061
4062 // Only pass -x if gcc will understand it; otherwise hope gcc
4063 // understands the suffix correctly. The main use case this would go
4064 // wrong in is for linker inputs if they happened to have an odd
4065 // suffix; really the only way to get this to happen is a command
4066 // like '-x foobar a.c' which will treat a.c like a linker input.
4067 //
4068 // FIXME: For the linker case specifically, can we safely convert
4069 // inputs into '-Wl,' options?
4070 for (InputInfoList::const_iterator
4071 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4072 const InputInfo &II = *it;
Daniel Dunbara8304f62009-05-02 20:14:53 +00004073
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004074 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00004075 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4076 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004077 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004078 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004079 else if (II.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004080 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004081 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00004082 else if (II.getType() == types::TY_ModuleFile)
4083 D.Diag(diag::err_drv_no_module_support)
4084 << getToolChain().getTripleString();
Daniel Dunbara8304f62009-05-02 20:14:53 +00004085
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004086 if (types::canTypeBeUserSpecified(II.getType())) {
4087 CmdArgs.push_back("-x");
4088 CmdArgs.push_back(types::getTypeName(II.getType()));
4089 }
4090
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004091 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00004092 CmdArgs.push_back(II.getFilename());
Daniel Dunbar48f99942010-09-25 18:10:05 +00004093 else {
4094 const Arg &A = II.getInputArg();
4095
4096 // Reverse translate some rewritten options.
4097 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4098 CmdArgs.push_back("-lstdc++");
4099 continue;
4100 }
4101
Daniel Dunbar115a7922009-03-19 07:29:38 +00004102 // Don't render as input, we need gcc to do the translations.
Daniel Dunbar48f99942010-09-25 18:10:05 +00004103 A.render(Args, CmdArgs);
4104 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004105 }
4106
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00004107 const std::string customGCCName = D.getCCCGenericGCCName();
4108 const char *GCCName;
4109 if (!customGCCName.empty())
4110 GCCName = customGCCName.c_str();
Hans Wennborg76b86c22013-07-18 20:29:38 +00004111 else if (D.CCCIsCXX()) {
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00004112 GCCName = "g++";
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00004113 } else
4114 GCCName = "gcc";
4115
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004116 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004117 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004118 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004119}
4120
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004121void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4122 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004123 CmdArgs.push_back("-E");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004124}
4125
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004126void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
4127 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004128 // The type is good enough.
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004129}
4130
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004131void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4132 ArgStringList &CmdArgs) const {
Daniel Dunbar64952502010-02-11 03:16:21 +00004133 const Driver &D = getToolChain().getDriver();
4134
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004135 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00004136 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4137 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004138 CmdArgs.push_back("-c");
Daniel Dunbar64952502010-02-11 03:16:21 +00004139 else {
4140 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004141 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00004142 << getTypeName(JA.getType());
Michael J. Spencer20249a12010-10-21 03:16:25 +00004143
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004144 CmdArgs.push_back("-S");
Daniel Dunbar64952502010-02-11 03:16:21 +00004145 }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004146}
4147
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004148void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
4149 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004150 CmdArgs.push_back("-c");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004151}
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004152
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004153void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4154 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004155 // The types are (hopefully) good enough.
4156}
4157
Tony Linthicum96319392011-12-12 21:14:55 +00004158// Hexagon tools start.
4159void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4160 ArgStringList &CmdArgs) const {
4161
4162}
4163void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4164 const InputInfo &Output,
4165 const InputInfoList &Inputs,
4166 const ArgList &Args,
4167 const char *LinkingOutput) const {
4168
4169 const Driver &D = getToolChain().getDriver();
4170 ArgStringList CmdArgs;
4171
4172 std::string MarchString = "-march=";
Matthew Curtis67814152012-12-06 14:16:43 +00004173 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum96319392011-12-12 21:14:55 +00004174 CmdArgs.push_back(Args.MakeArgString(MarchString));
4175
4176 RenderExtraToolArgs(JA, CmdArgs);
4177
4178 if (Output.isFilename()) {
4179 CmdArgs.push_back("-o");
4180 CmdArgs.push_back(Output.getFilename());
4181 } else {
4182 assert(Output.isNothing() && "Unexpected output");
4183 CmdArgs.push_back("-fsyntax-only");
4184 }
4185
Matthew Curtis33c95f12012-12-06 17:49:03 +00004186 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4187 if (!SmallDataThreshold.empty())
4188 CmdArgs.push_back(
4189 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00004190
Matthew Curtis3d8d4222012-12-07 17:23:04 +00004191 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4192 options::OPT_Xassembler);
4193
Tony Linthicum96319392011-12-12 21:14:55 +00004194 // Only pass -x if gcc will understand it; otherwise hope gcc
4195 // understands the suffix correctly. The main use case this would go
4196 // wrong in is for linker inputs if they happened to have an odd
4197 // suffix; really the only way to get this to happen is a command
4198 // like '-x foobar a.c' which will treat a.c like a linker input.
4199 //
4200 // FIXME: For the linker case specifically, can we safely convert
4201 // inputs into '-Wl,' options?
4202 for (InputInfoList::const_iterator
4203 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4204 const InputInfo &II = *it;
4205
4206 // Don't try to pass LLVM or AST inputs to a generic gcc.
4207 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4208 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4209 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4210 << getToolChain().getTripleString();
4211 else if (II.getType() == types::TY_AST)
4212 D.Diag(clang::diag::err_drv_no_ast_support)
4213 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00004214 else if (II.getType() == types::TY_ModuleFile)
4215 D.Diag(diag::err_drv_no_module_support)
4216 << getToolChain().getTripleString();
Tony Linthicum96319392011-12-12 21:14:55 +00004217
4218 if (II.isFilename())
4219 CmdArgs.push_back(II.getFilename());
4220 else
4221 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4222 II.getInputArg().render(Args, CmdArgs);
4223 }
4224
4225 const char *GCCName = "hexagon-as";
4226 const char *Exec =
4227 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4228 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4229
4230}
4231void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4232 ArgStringList &CmdArgs) const {
4233 // The types are (hopefully) good enough.
4234}
4235
4236void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4237 const InputInfo &Output,
4238 const InputInfoList &Inputs,
4239 const ArgList &Args,
4240 const char *LinkingOutput) const {
4241
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004242 const toolchains::Hexagon_TC& ToolChain =
4243 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4244 const Driver &D = ToolChain.getDriver();
4245
Tony Linthicum96319392011-12-12 21:14:55 +00004246 ArgStringList CmdArgs;
4247
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004248 //----------------------------------------------------------------------------
4249 //
4250 //----------------------------------------------------------------------------
4251 bool hasStaticArg = Args.hasArg(options::OPT_static);
4252 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtis33c95f12012-12-06 17:49:03 +00004253 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004254 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4255 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4256 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4257 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum96319392011-12-12 21:14:55 +00004258
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004259 //----------------------------------------------------------------------------
4260 // Silence warnings for various options
4261 //----------------------------------------------------------------------------
Tony Linthicum96319392011-12-12 21:14:55 +00004262
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004263 Args.ClaimAllArgs(options::OPT_g_Group);
4264 Args.ClaimAllArgs(options::OPT_emit_llvm);
4265 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4266 // handled somewhere else.
4267 Args.ClaimAllArgs(options::OPT_static_libgcc);
4268
4269 //----------------------------------------------------------------------------
4270 //
4271 //----------------------------------------------------------------------------
4272 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4273 e = ToolChain.ExtraOpts.end();
4274 i != e; ++i)
4275 CmdArgs.push_back(i->c_str());
Tony Linthicum96319392011-12-12 21:14:55 +00004276
Matthew Curtis67814152012-12-06 14:16:43 +00004277 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4278 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop43115d42012-01-13 20:37:10 +00004279
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004280 if (buildingLib) {
4281 CmdArgs.push_back("-shared");
4282 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4283 // hexagon-gcc does
Tony Linthicum96319392011-12-12 21:14:55 +00004284 }
4285
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004286 if (hasStaticArg)
4287 CmdArgs.push_back("-static");
Tony Linthicum96319392011-12-12 21:14:55 +00004288
Matthew Curtis33c95f12012-12-06 17:49:03 +00004289 if (buildPIE && !buildingLib)
4290 CmdArgs.push_back("-pie");
4291
4292 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4293 if (!SmallDataThreshold.empty()) {
4294 CmdArgs.push_back(
4295 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4296 }
4297
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004298 //----------------------------------------------------------------------------
4299 //
4300 //----------------------------------------------------------------------------
4301 CmdArgs.push_back("-o");
4302 CmdArgs.push_back(Output.getFilename());
Tony Linthicum96319392011-12-12 21:14:55 +00004303
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004304 const std::string MarchSuffix = "/" + MarchString;
4305 const std::string G0Suffix = "/G0";
4306 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4307 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4308 + "/";
4309 const std::string StartFilesDir = RootDir
4310 + "hexagon/lib"
4311 + (buildingLib
4312 ? MarchG0Suffix : MarchSuffix);
4313
4314 //----------------------------------------------------------------------------
4315 // moslib
4316 //----------------------------------------------------------------------------
4317 std::vector<std::string> oslibs;
4318 bool hasStandalone= false;
4319
4320 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4321 ie = Args.filtered_end(); it != ie; ++it) {
4322 (*it)->claim();
4323 oslibs.push_back((*it)->getValue());
4324 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum96319392011-12-12 21:14:55 +00004325 }
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004326 if (oslibs.empty()) {
4327 oslibs.push_back("standalone");
4328 hasStandalone = true;
4329 }
Tony Linthicum96319392011-12-12 21:14:55 +00004330
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004331 //----------------------------------------------------------------------------
4332 // Start Files
4333 //----------------------------------------------------------------------------
4334 if (incStdLib && incStartFiles) {
4335
4336 if (!buildingLib) {
4337 if (hasStandalone) {
4338 CmdArgs.push_back(
4339 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4340 }
4341 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4342 }
4343 std::string initObj = useShared ? "/initS.o" : "/init.o";
4344 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4345 }
4346
4347 //----------------------------------------------------------------------------
4348 // Library Search Paths
4349 //----------------------------------------------------------------------------
4350 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4351 for (ToolChain::path_list::const_iterator
4352 i = LibPaths.begin(),
4353 e = LibPaths.end();
4354 i != e;
4355 ++i)
4356 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4357
4358 //----------------------------------------------------------------------------
4359 //
4360 //----------------------------------------------------------------------------
4361 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4362 Args.AddAllArgs(CmdArgs, options::OPT_e);
4363 Args.AddAllArgs(CmdArgs, options::OPT_s);
4364 Args.AddAllArgs(CmdArgs, options::OPT_t);
4365 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4366
4367 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4368
4369 //----------------------------------------------------------------------------
4370 // Libraries
4371 //----------------------------------------------------------------------------
4372 if (incStdLib && incDefLibs) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00004373 if (D.CCCIsCXX()) {
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004374 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4375 CmdArgs.push_back("-lm");
4376 }
4377
4378 CmdArgs.push_back("--start-group");
4379
4380 if (!buildingLib) {
4381 for(std::vector<std::string>::iterator i = oslibs.begin(),
4382 e = oslibs.end(); i != e; ++i)
4383 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4384 CmdArgs.push_back("-lc");
4385 }
4386 CmdArgs.push_back("-lgcc");
4387
4388 CmdArgs.push_back("--end-group");
4389 }
4390
4391 //----------------------------------------------------------------------------
4392 // End files
4393 //----------------------------------------------------------------------------
4394 if (incStdLib && incStartFiles) {
4395 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4396 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4397 }
4398
4399 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00004400 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum96319392011-12-12 21:14:55 +00004401}
4402// Hexagon tools end.
4403
Rafael Espindolacfed8282012-10-31 18:51:07 +00004404llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4405 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4406 // archs which Darwin doesn't use.
4407
4408 // The matching this routine does is fairly pointless, since it is neither the
4409 // complete architecture list, nor a reasonable subset. The problem is that
4410 // historically the driver driver accepts this and also ties its -march=
4411 // handling to the architecture name, so we need to be careful before removing
4412 // support for it.
4413
4414 // This code must be kept in sync with Clang's Darwin specific argument
4415 // translation.
4416
4417 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4418 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4419 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4420 .Case("ppc64", llvm::Triple::ppc64)
4421 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4422 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4423 llvm::Triple::x86)
4424 .Case("x86_64", llvm::Triple::x86_64)
4425 // This is derived from the driver driver.
Bob Wilson2503ebd2013-03-04 22:37:49 +00004426 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4427 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4428 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindolacfed8282012-10-31 18:51:07 +00004429 .Case("r600", llvm::Triple::r600)
4430 .Case("nvptx", llvm::Triple::nvptx)
4431 .Case("nvptx64", llvm::Triple::nvptx64)
4432 .Case("amdil", llvm::Triple::amdil)
4433 .Case("spir", llvm::Triple::spir)
4434 .Default(llvm::Triple::UnknownArch);
4435}
Tony Linthicum96319392011-12-12 21:14:55 +00004436
Bob Wilson66b8a662012-11-23 06:14:39 +00004437const char *Clang::getBaseInputName(const ArgList &Args,
4438 const InputInfoList &Inputs) {
Michael J. Spencer472ccff2010-12-18 00:19:12 +00004439 return Args.MakeArgString(
4440 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004441}
4442
Bob Wilson66b8a662012-11-23 06:14:39 +00004443const char *Clang::getBaseInputStem(const ArgList &Args,
4444 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004445 const char *Str = getBaseInputName(Args, Inputs);
4446
Chris Lattner657ca662011-01-16 08:14:11 +00004447 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar88137642009-09-09 22:32:48 +00004448 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004449
4450 return Str;
4451}
4452
Bob Wilson66b8a662012-11-23 06:14:39 +00004453const char *Clang::getDependencyFileName(const ArgList &Args,
4454 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004455 // FIXME: Think about this more.
4456 std::string Res;
4457
4458 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00004459 std::string Str(OutputOpt->getValue());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004460 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier30601782011-08-17 23:08:45 +00004461 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +00004462 Res = getBaseInputStem(Args, Inputs);
Chad Rosier30601782011-08-17 23:08:45 +00004463 }
Daniel Dunbar88137642009-09-09 22:32:48 +00004464 return Args.MakeArgString(Res + ".d");
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004465}
4466
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004467void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004468 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004469 const InputInfoList &Inputs,
4470 const ArgList &Args,
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004471 const char *LinkingOutput) const {
4472 ArgStringList CmdArgs;
4473
4474 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4475 const InputInfo &Input = Inputs[0];
4476
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004477 // Determine the original source input.
4478 const Action *SourceAction = &JA;
4479 while (SourceAction->getKind() != Action::InputClass) {
4480 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4481 SourceAction = SourceAction->getInputs()[0];
4482 }
4483
4484 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher88b7cf02011-08-19 00:30:14 +00004485 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004486 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004487 if (Args.hasArg(options::OPT_gstabs))
4488 CmdArgs.push_back("--gstabs");
4489 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson591ff152011-11-02 05:10:45 +00004490 CmdArgs.push_back("-g");
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004491 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004492
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004493 // Derived from asm spec.
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004494 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004495
Daniel Dunbarf5438e32010-07-22 01:47:22 +00004496 // Use -force_cpusubtype_ALL on x86 by default.
Eli Bendersky8f4269a2013-07-24 22:20:49 +00004497 if (getToolChain().getArch() == llvm::Triple::x86 ||
4498 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004499 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4500 CmdArgs.push_back("-force_cpusubtype_ALL");
4501
Eli Bendersky8f4269a2013-07-24 22:20:49 +00004502 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004503 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher59320e72013-02-21 22:35:01 +00004504 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004505 (!getDarwinToolChain().isTargetIPhoneOS() ||
4506 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4507 Args.hasArg(options::OPT_static)))
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004508 CmdArgs.push_back("-static");
4509
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004510 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4511 options::OPT_Xassembler);
4512
4513 assert(Output.isFilename() && "Unexpected lipo output.");
4514 CmdArgs.push_back("-o");
4515 CmdArgs.push_back(Output.getFilename());
4516
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004517 assert(Input.isFilename() && "Invalid input.");
4518 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004519
4520 // asm_final spec is empty.
4521
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004522 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004523 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004524 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004525}
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004526
David Blaikie99ba9e32011-12-20 02:48:34 +00004527void darwin::DarwinTool::anchor() {}
4528
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +00004529void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4530 ArgStringList &CmdArgs) const {
Chris Lattner5f9e2722011-07-23 10:55:15 +00004531 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbareeff4062010-01-22 02:04:58 +00004532
Daniel Dunbar02633b52009-03-26 16:23:12 +00004533 // Derived from darwin_arch spec.
4534 CmdArgs.push_back("-arch");
Daniel Dunbareeff4062010-01-22 02:04:58 +00004535 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004536
Daniel Dunbareeff4062010-01-22 02:04:58 +00004537 // FIXME: Is this needed anymore?
4538 if (ArchName == "arm")
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004539 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004540}
4541
Bill Wendling6acf8b42012-10-02 18:02:50 +00004542bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4543 // We only need to generate a temp path for LTO if we aren't compiling object
4544 // files. When compiling source files, we run 'dsymutil' after linking. We
4545 // don't run 'dsymutil' when compiling object files.
4546 for (InputInfoList::const_iterator
4547 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4548 if (it->getType() != types::TY_Object)
4549 return true;
4550
4551 return false;
4552}
4553
Daniel Dunbar748de8e2010-09-09 21:51:05 +00004554void darwin::Link::AddLinkArgs(Compilation &C,
4555 const ArgList &Args,
Bill Wendling6acf8b42012-10-02 18:02:50 +00004556 ArgStringList &CmdArgs,
4557 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004558 const Driver &D = getToolChain().getDriver();
Daniel Dunbarce911f52011-04-28 21:23:41 +00004559 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbar02633b52009-03-26 16:23:12 +00004560
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004561 unsigned Version[3] = { 0, 0, 0 };
4562 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4563 bool HadExtra;
Richard Smith1d489cf2012-11-01 04:30:05 +00004564 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004565 Version[1], Version[2], HadExtra) ||
4566 HadExtra)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004567 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004568 << A->getAsString(Args);
4569 }
4570
4571 // Newer linkers support -demangle, pass it if supported and not disabled by
4572 // the user.
Daniel Dunbard2d20882012-01-04 21:45:27 +00004573 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004574 // Don't pass -demangle to ld_classic.
4575 //
4576 // FIXME: This is a temporary workaround, ld should be handling this.
4577 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4578 Args.hasArg(options::OPT_static));
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004579 if (getToolChain().getArch() == llvm::Triple::x86) {
4580 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4581 options::OPT_Wl_COMMA),
4582 ie = Args.filtered_end(); it != ie; ++it) {
4583 const Arg *A = *it;
4584 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smith1d489cf2012-11-01 04:30:05 +00004585 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004586 UsesLdClassic = true;
4587 }
4588 }
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004589 if (!UsesLdClassic)
4590 CmdArgs.push_back("-demangle");
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004591 }
4592
Bob Wilsonbd77c592013-08-02 22:25:34 +00004593 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4594 CmdArgs.push_back("-export_dynamic");
4595
Bill Wendlingc35f9082012-11-16 23:03:00 +00004596 // If we are using LTO, then automatically create a temporary file path for
4597 // the linker to use, so that it's lifetime will extend past a possible
4598 // dsymutil step.
4599 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4600 const char *TmpPath = C.getArgs().MakeArgString(
4601 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4602 C.addTempFile(TmpPath);
4603 CmdArgs.push_back("-object_path_lto");
4604 CmdArgs.push_back(TmpPath);
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004605 }
4606
Daniel Dunbar02633b52009-03-26 16:23:12 +00004607 // Derived from the "link" spec.
4608 Args.AddAllArgs(CmdArgs, options::OPT_static);
4609 if (!Args.hasArg(options::OPT_static))
4610 CmdArgs.push_back("-dynamic");
4611 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4612 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4613 // here. How do we wish to handle such things?
4614 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004615
Daniel Dunbar02633b52009-03-26 16:23:12 +00004616 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara6d38492010-01-22 02:04:52 +00004617 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara6d38492010-01-22 02:04:52 +00004618 // FIXME: Why do this only on this path?
Daniel Dunbar8917dd42010-01-22 03:37:33 +00004619 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004620
4621 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4622 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4623 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4624
4625 Arg *A;
4626 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4627 (A = Args.getLastArg(options::OPT_current__version)) ||
4628 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004629 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004630 << A->getAsString(Args) << "-dynamiclib";
4631
4632 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4633 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4634 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4635 } else {
4636 CmdArgs.push_back("-dylib");
4637
4638 Arg *A;
4639 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4640 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4641 (A = Args.getLastArg(options::OPT_client__name)) ||
4642 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4643 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4644 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004645 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004646 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004647
Daniel Dunbar02633b52009-03-26 16:23:12 +00004648 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4649 "-dylib_compatibility_version");
4650 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4651 "-dylib_current_version");
4652
Daniel Dunbara6d38492010-01-22 02:04:52 +00004653 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004654
4655 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4656 "-dylib_install_name");
4657 }
4658
4659 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4660 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4661 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarce911f52011-04-28 21:23:41 +00004662 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004663 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004664 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4665 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4666 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4667 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4668 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4669 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar99ca47b2011-06-28 20:16:02 +00004670 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004671 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4672 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4673 Args.AddAllArgs(CmdArgs, options::OPT_init);
4674
Daniel Dunbarce911f52011-04-28 21:23:41 +00004675 // Add the deployment target.
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004676 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbarb7f5ef72011-04-30 04:22:58 +00004677
4678 // If we had an explicit -mios-simulator-version-min argument, honor that,
4679 // otherwise use the traditional deployment targets. We can't just check the
4680 // is-sim attribute because existing code follows this path, and the linker
4681 // may not handle the argument.
4682 //
4683 // FIXME: We may be able to remove this, once we can verify no one depends on
4684 // it.
4685 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4686 CmdArgs.push_back("-ios_simulator_version_min");
4687 else if (DarwinTC.isTargetIPhoneOS())
4688 CmdArgs.push_back("-iphoneos_version_min");
4689 else
4690 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004691 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarce911f52011-04-28 21:23:41 +00004692
Daniel Dunbar02633b52009-03-26 16:23:12 +00004693 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4694 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4695 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4696 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4697 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004698
Daniel Dunbar47e879d2010-07-13 23:31:40 +00004699 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4700 options::OPT_fno_pie,
4701 options::OPT_fno_PIE)) {
4702 if (A->getOption().matches(options::OPT_fpie) ||
4703 A->getOption().matches(options::OPT_fPIE))
4704 CmdArgs.push_back("-pie");
4705 else
4706 CmdArgs.push_back("-no_pie");
4707 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004708
4709 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4710 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4711 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4712 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4713 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4714 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4715 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4716 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4717 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4718 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4719 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4720 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4721 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4722 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4723 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4724 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004725
Daniel Dunbarcc957192011-05-02 21:03:47 +00004726 // Give --sysroot= preference, over the Apple specific behavior to also use
4727 // --isysroot as the syslibroot.
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004728 StringRef sysroot = C.getSysRoot();
4729 if (sysroot != "") {
Daniel Dunbarcc957192011-05-02 21:03:47 +00004730 CmdArgs.push_back("-syslibroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004731 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbarcc957192011-05-02 21:03:47 +00004732 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4733 CmdArgs.push_back("-syslibroot");
Richard Smith1d489cf2012-11-01 04:30:05 +00004734 CmdArgs.push_back(A->getValue());
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004735 }
4736
Daniel Dunbar02633b52009-03-26 16:23:12 +00004737 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4738 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4739 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4740 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4741 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004742 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004743 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4744 Args.AddAllArgs(CmdArgs, options::OPT_y);
4745 Args.AddLastArg(CmdArgs, options::OPT_w);
4746 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4747 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4748 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4749 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4750 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4751 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4752 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4753 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4754 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4755 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4756 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4757 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4758}
4759
4760void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004761 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004762 const InputInfoList &Inputs,
4763 const ArgList &Args,
Daniel Dunbar02633b52009-03-26 16:23:12 +00004764 const char *LinkingOutput) const {
4765 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbare0be8b12009-09-08 16:39:16 +00004766
Daniel Dunbar02633b52009-03-26 16:23:12 +00004767 // The logic here is derived from gcc's behavior; most of which
4768 // comes from specs (starting with link_command). Consult gcc for
4769 // more information.
Daniel Dunbar02633b52009-03-26 16:23:12 +00004770 ArgStringList CmdArgs;
4771
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00004772 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4773 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4774 options::OPT_ccc_arcmt_migrate)) {
4775 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4776 (*I)->claim();
4777 const char *Exec =
4778 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4779 CmdArgs.push_back(Output.getFilename());
4780 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4781 return;
4782 }
4783
Daniel Dunbar02633b52009-03-26 16:23:12 +00004784 // I'm not sure why this particular decomposition exists in gcc, but
4785 // we follow suite for ease of comparison.
Bill Wendling6acf8b42012-10-02 18:02:50 +00004786 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004787
Daniel Dunbar02633b52009-03-26 16:23:12 +00004788 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4789 Args.AddAllArgs(CmdArgs, options::OPT_s);
4790 Args.AddAllArgs(CmdArgs, options::OPT_t);
4791 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4792 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004793 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004794 Args.AddAllArgs(CmdArgs, options::OPT_r);
4795
Daniel Dunbar270073c2010-10-18 22:08:36 +00004796 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4797 // members of static archive libraries which implement Objective-C classes or
4798 // categories.
4799 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4800 CmdArgs.push_back("-ObjC");
Michael J. Spencer20249a12010-10-21 03:16:25 +00004801
Daniel Dunbar02633b52009-03-26 16:23:12 +00004802 CmdArgs.push_back("-o");
4803 CmdArgs.push_back(Output.getFilename());
4804
Chad Rosier18937312012-05-16 23:45:12 +00004805 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004806 !Args.hasArg(options::OPT_nostartfiles)) {
4807 // Derived from startfile spec.
4808 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004809 // Derived from darwin_dylib1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004810 if (getDarwinToolChain().isTargetIOSSimulator()) {
4811 // The simulator doesn't have a versioned crt1 file.
4812 CmdArgs.push_back("-ldylib1.o");
4813 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004814 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4815 CmdArgs.push_back("-ldylib1.o");
4816 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004817 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004818 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004819 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004820 CmdArgs.push_back("-ldylib1.10.5.o");
4821 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004822 } else {
4823 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004824 if (!Args.hasArg(options::OPT_static)) {
4825 // Derived from darwin_bundle1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004826 if (getDarwinToolChain().isTargetIOSSimulator()) {
4827 // The simulator doesn't have a versioned crt1 file.
4828 CmdArgs.push_back("-lbundle1.o");
4829 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004830 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4831 CmdArgs.push_back("-lbundle1.o");
4832 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004833 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004834 CmdArgs.push_back("-lbundle1.o");
4835 }
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004836 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004837 } else {
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00004838 if (Args.hasArg(options::OPT_pg) &&
4839 getToolChain().SupportsProfiling()) {
Daniel Dunbar02633b52009-03-26 16:23:12 +00004840 if (Args.hasArg(options::OPT_static) ||
4841 Args.hasArg(options::OPT_object) ||
4842 Args.hasArg(options::OPT_preload)) {
4843 CmdArgs.push_back("-lgcrt0.o");
4844 } else {
4845 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004846
Daniel Dunbar02633b52009-03-26 16:23:12 +00004847 // darwin_crt2 spec is empty.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004848 }
Bob Wilson4e6e7912012-07-04 00:18:41 +00004849 // By default on OS X 10.8 and later, we don't link with a crt1.o
4850 // file and the linker knows to use _main as the entry point. But,
4851 // when compiling with -pg, we need to link with the gcrt1.o file,
4852 // so pass the -no_new_main option to tell the linker to use the
4853 // "start" symbol as the entry point.
Bob Wilson1fc6e4f2012-07-03 20:42:10 +00004854 if (getDarwinToolChain().isTargetMacOS() &&
4855 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4856 CmdArgs.push_back("-no_new_main");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004857 } else {
4858 if (Args.hasArg(options::OPT_static) ||
4859 Args.hasArg(options::OPT_object) ||
4860 Args.hasArg(options::OPT_preload)) {
4861 CmdArgs.push_back("-lcrt0.o");
4862 } else {
4863 // Derived from darwin_crt1 spec.
Daniel Dunbar40355802011-03-31 17:12:33 +00004864 if (getDarwinToolChain().isTargetIOSSimulator()) {
4865 // The simulator doesn't have a versioned crt1 file.
4866 CmdArgs.push_back("-lcrt1.o");
4867 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004868 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4869 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004870 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004871 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004872 } else {
4873 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4874 CmdArgs.push_back("-lcrt1.o");
4875 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4876 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004877 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004878 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004879
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004880 // darwin_crt2 spec is empty.
4881 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004882 }
4883 }
4884 }
4885 }
4886
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004887 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4888 Args.hasArg(options::OPT_shared_libgcc) &&
4889 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar88137642009-09-09 22:32:48 +00004890 const char *Str =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004891 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar88137642009-09-09 22:32:48 +00004892 CmdArgs.push_back(Str);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004893 }
4894 }
4895
4896 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004897
Daniel Dunbar02633b52009-03-26 16:23:12 +00004898 if (Args.hasArg(options::OPT_fopenmp))
4899 // This is more complicated in gcc...
4900 CmdArgs.push_back("-lgomp");
4901
Douglas Gregor04e326b2012-05-15 21:00:27 +00004902 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4903
Bob Wilson63d9f3c2012-05-15 18:57:39 +00004904 if (isObjCRuntimeLinked(Args) &&
4905 !Args.hasArg(options::OPT_nostdlib) &&
4906 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004907 // Avoid linking compatibility stubs on i386 mac.
4908 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004909 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004910 // If we don't have ARC or subscripting runtime support, link in the
4911 // runtime stubs. We have to do this *before* adding any of the normal
4912 // linker inputs so that its initializer gets run first.
John McCall260611a2012-06-20 06:18:46 +00004913 ObjCRuntime runtime =
4914 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004915 // We use arclite library for both ARC and subscripting support.
John McCall0a7dd782012-08-21 02:47:43 +00004916 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall260611a2012-06-20 06:18:46 +00004917 !runtime.hasSubscripting())
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004918 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004919 }
Bob Wilson0b1c7152012-04-21 00:21:42 +00004920 CmdArgs.push_back("-framework");
4921 CmdArgs.push_back("Foundation");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004922 // Link libobj.
4923 CmdArgs.push_back("-lobjc");
John McCall9f084a32011-07-06 00:26:06 +00004924 }
John McCallf85e1932011-06-15 23:02:42 +00004925
Daniel Dunbar02633b52009-03-26 16:23:12 +00004926 if (LinkingOutput) {
4927 CmdArgs.push_back("-arch_multiple");
4928 CmdArgs.push_back("-final_output");
4929 CmdArgs.push_back(LinkingOutput);
4930 }
4931
Daniel Dunbar02633b52009-03-26 16:23:12 +00004932 if (Args.hasArg(options::OPT_fnested_functions))
4933 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004934
Daniel Dunbar02633b52009-03-26 16:23:12 +00004935 if (!Args.hasArg(options::OPT_nostdlib) &&
4936 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00004937 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar132e35d2010-09-17 01:20:05 +00004938 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbaredfa02b2009-04-08 06:06:21 +00004939
Daniel Dunbar02633b52009-03-26 16:23:12 +00004940 // link_ssp spec is empty.
4941
Daniel Dunbar6cd41542009-09-18 08:15:03 +00004942 // Let the tool chain choose which runtime library to link.
4943 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004944 }
4945
Chad Rosier18937312012-05-16 23:45:12 +00004946 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004947 !Args.hasArg(options::OPT_nostartfiles)) {
4948 // endfile_spec is empty.
4949 }
4950
4951 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4952 Args.AddAllArgs(CmdArgs, options::OPT_F);
4953
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004954 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004955 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004956 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar02633b52009-03-26 16:23:12 +00004957}
4958
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004959void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004960 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004961 const InputInfoList &Inputs,
4962 const ArgList &Args,
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004963 const char *LinkingOutput) const {
4964 ArgStringList CmdArgs;
4965
4966 CmdArgs.push_back("-create");
4967 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbara428df82009-03-24 00:24:37 +00004968
4969 CmdArgs.push_back("-output");
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004970 CmdArgs.push_back(Output.getFilename());
Daniel Dunbara428df82009-03-24 00:24:37 +00004971
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004972 for (InputInfoList::const_iterator
4973 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4974 const InputInfo &II = *it;
4975 assert(II.isFilename() && "Unexpected lipo input.");
4976 CmdArgs.push_back(II.getFilename());
4977 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004978 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004979 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004980 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004981}
Daniel Dunbar68a31d42009-03-31 17:45:15 +00004982
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004983void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004984 const InputInfo &Output,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004985 const InputInfoList &Inputs,
4986 const ArgList &Args,
4987 const char *LinkingOutput) const {
4988 ArgStringList CmdArgs;
4989
Daniel Dunbar03e92302011-05-09 17:23:16 +00004990 CmdArgs.push_back("-o");
4991 CmdArgs.push_back(Output.getFilename());
4992
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004993 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4994 const InputInfo &Input = Inputs[0];
4995 assert(Input.isFilename() && "Unexpected dsymutil input.");
4996 CmdArgs.push_back(Input.getFilename());
4997
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004998 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004999 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005000 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00005001}
5002
Eric Christopherf8571862011-08-23 17:56:55 +00005003void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher27e2b982012-12-18 00:31:10 +00005004 const InputInfo &Output,
5005 const InputInfoList &Inputs,
5006 const ArgList &Args,
5007 const char *LinkingOutput) const {
Eric Christopherf8571862011-08-23 17:56:55 +00005008 ArgStringList CmdArgs;
5009 CmdArgs.push_back("--verify");
Eric Christopher1c79dc42012-02-06 19:13:09 +00005010 CmdArgs.push_back("--debug-info");
5011 CmdArgs.push_back("--eh-frame");
Eric Christopherb822f722012-02-06 19:43:51 +00005012 CmdArgs.push_back("--quiet");
Eric Christopherf8571862011-08-23 17:56:55 +00005013
5014 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5015 const InputInfo &Input = Inputs[0];
5016 assert(Input.isFilename() && "Unexpected verify input");
5017
5018 // Grabbing the output of the earlier dsymutil run.
5019 CmdArgs.push_back(Input.getFilename());
5020
5021 const char *Exec =
5022 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5023 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5024}
5025
David Chisnall31c46902012-02-15 13:39:01 +00005026void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5027 const InputInfo &Output,
5028 const InputInfoList &Inputs,
5029 const ArgList &Args,
5030 const char *LinkingOutput) const {
5031 ArgStringList CmdArgs;
5032
5033 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5034 options::OPT_Xassembler);
5035
5036 CmdArgs.push_back("-o");
5037 CmdArgs.push_back(Output.getFilename());
5038
5039 for (InputInfoList::const_iterator
5040 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5041 const InputInfo &II = *it;
5042 CmdArgs.push_back(II.getFilename());
5043 }
5044
5045 const char *Exec =
5046 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5047 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5048}
5049
5050
5051void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5052 const InputInfo &Output,
5053 const InputInfoList &Inputs,
5054 const ArgList &Args,
5055 const char *LinkingOutput) const {
5056 // FIXME: Find a real GCC, don't hard-code versions here
5057 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5058 const llvm::Triple &T = getToolChain().getTriple();
5059 std::string LibPath = "/usr/lib/";
5060 llvm::Triple::ArchType Arch = T.getArch();
5061 switch (Arch) {
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00005062 case llvm::Triple::x86:
5063 GCCLibPath +=
5064 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5065 break;
5066 case llvm::Triple::x86_64:
5067 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5068 GCCLibPath += "/4.5.2/amd64/";
5069 LibPath += "amd64/";
5070 break;
5071 default:
5072 llvm_unreachable("Unsupported architecture");
David Chisnall31c46902012-02-15 13:39:01 +00005073 }
5074
5075 ArgStringList CmdArgs;
5076
David Chisnall41d476d2012-02-29 15:06:12 +00005077 // Demangle C++ names in errors
5078 CmdArgs.push_back("-C");
5079
David Chisnall31c46902012-02-15 13:39:01 +00005080 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5081 (!Args.hasArg(options::OPT_shared))) {
5082 CmdArgs.push_back("-e");
5083 CmdArgs.push_back("_start");
5084 }
5085
5086 if (Args.hasArg(options::OPT_static)) {
5087 CmdArgs.push_back("-Bstatic");
5088 CmdArgs.push_back("-dn");
5089 } else {
5090 CmdArgs.push_back("-Bdynamic");
5091 if (Args.hasArg(options::OPT_shared)) {
5092 CmdArgs.push_back("-shared");
5093 } else {
5094 CmdArgs.push_back("--dynamic-linker");
5095 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5096 }
5097 }
5098
5099 if (Output.isFilename()) {
5100 CmdArgs.push_back("-o");
5101 CmdArgs.push_back(Output.getFilename());
5102 } else {
5103 assert(Output.isNothing() && "Invalid output.");
5104 }
5105
5106 if (!Args.hasArg(options::OPT_nostdlib) &&
5107 !Args.hasArg(options::OPT_nostartfiles)) {
5108 if (!Args.hasArg(options::OPT_shared)) {
5109 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5110 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00005111 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005112 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5113 } else {
5114 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00005115 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5116 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005117 }
Hans Wennborg76b86c22013-07-18 20:29:38 +00005118 if (getToolChain().getDriver().CCCIsCXX())
David Chisnalle6dd6832012-03-13 14:14:54 +00005119 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005120 }
5121
5122 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5123
5124 Args.AddAllArgs(CmdArgs, options::OPT_L);
5125 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5126 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall165329c2012-02-28 17:10:04 +00005127 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnall31c46902012-02-15 13:39:01 +00005128
5129 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5130
5131 if (!Args.hasArg(options::OPT_nostdlib) &&
5132 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005133 if (getToolChain().getDriver().CCCIsCXX())
David Chisnalle58e6f92012-04-10 11:49:50 +00005134 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnallb6229592012-02-15 18:24:31 +00005135 CmdArgs.push_back("-lgcc_s");
David Chisnall165329c2012-02-28 17:10:04 +00005136 if (!Args.hasArg(options::OPT_shared)) {
5137 CmdArgs.push_back("-lgcc");
David Chisnall31c46902012-02-15 13:39:01 +00005138 CmdArgs.push_back("-lc");
David Chisnall7dbefe12012-02-28 20:06:45 +00005139 CmdArgs.push_back("-lm");
David Chisnall165329c2012-02-28 17:10:04 +00005140 }
David Chisnall31c46902012-02-15 13:39:01 +00005141 }
5142
5143 if (!Args.hasArg(options::OPT_nostdlib) &&
5144 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall165329c2012-02-28 17:10:04 +00005145 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005146 }
David Chisnalld1ac03e2012-02-16 16:00:47 +00005147 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005148
5149 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5150
5151 const char *Exec =
5152 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5153 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5154}
5155
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005156void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005157 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00005158 const InputInfoList &Inputs,
5159 const ArgList &Args,
5160 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005161 ArgStringList CmdArgs;
5162
5163 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5164 options::OPT_Xassembler);
5165
5166 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005167 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005168
5169 for (InputInfoList::const_iterator
5170 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5171 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005172 CmdArgs.push_back(II.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005173 }
5174
5175 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005176 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005177 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005178}
5179
5180void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005181 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00005182 const InputInfoList &Inputs,
5183 const ArgList &Args,
5184 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005185 ArgStringList CmdArgs;
5186
5187 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00005188 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005189 CmdArgs.push_back("-e");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005190 CmdArgs.push_back("_start");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005191 }
5192
5193 if (Args.hasArg(options::OPT_static)) {
5194 CmdArgs.push_back("-Bstatic");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005195 CmdArgs.push_back("-dn");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005196 } else {
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005197// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005198 CmdArgs.push_back("-Bdynamic");
5199 if (Args.hasArg(options::OPT_shared)) {
5200 CmdArgs.push_back("-shared");
5201 } else {
Edward O'Callaghan3cecc192009-10-16 19:44:18 +00005202 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005203 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5204 }
5205 }
5206
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005207 if (Output.isFilename()) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005208 CmdArgs.push_back("-o");
5209 CmdArgs.push_back(Output.getFilename());
5210 } else {
5211 assert(Output.isNothing() && "Invalid output.");
5212 }
5213
5214 if (!Args.hasArg(options::OPT_nostdlib) &&
5215 !Args.hasArg(options::OPT_nostartfiles)) {
5216 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00005217 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005218 getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005219 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005220 getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005221 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005222 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005223 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005224 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005225 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005226 }
Chris Lattner38e317d2010-07-07 16:01:42 +00005227 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005228 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005229 }
5230
Daniel Dunbar294691e2009-11-04 06:24:38 +00005231 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5232 + getToolChain().getTripleString()
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00005233 + "/4.2.4"));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005234
5235 Args.AddAllArgs(CmdArgs, options::OPT_L);
5236 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5237 Args.AddAllArgs(CmdArgs, options::OPT_e);
5238
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005239 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005240
5241 if (!Args.hasArg(options::OPT_nostdlib) &&
5242 !Args.hasArg(options::OPT_nodefaultlibs)) {
5243 // FIXME: For some reason GCC passes -lgcc before adding
5244 // the default system libraries. Just mimic this for now.
5245 CmdArgs.push_back("-lgcc");
5246
5247 if (Args.hasArg(options::OPT_pthread))
5248 CmdArgs.push_back("-pthread");
5249 if (!Args.hasArg(options::OPT_shared))
5250 CmdArgs.push_back("-lc");
5251 CmdArgs.push_back("-lgcc");
5252 }
5253
5254 if (!Args.hasArg(options::OPT_nostdlib) &&
5255 !Args.hasArg(options::OPT_nostartfiles)) {
5256 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005257 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005258 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005259 }
5260
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005261 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005262
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005263 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005264 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005265 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005266}
5267
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005268void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005269 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005270 const InputInfoList &Inputs,
5271 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005272 const char *LinkingOutput) const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005273 ArgStringList CmdArgs;
5274
5275 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5276 options::OPT_Xassembler);
5277
5278 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005279 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005280
5281 for (InputInfoList::const_iterator
5282 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5283 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005284 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005285 }
5286
5287 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005288 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005289 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005290}
5291
5292void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005293 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005294 const InputInfoList &Inputs,
5295 const ArgList &Args,
5296 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00005297 const Driver &D = getToolChain().getDriver();
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005298 ArgStringList CmdArgs;
5299
Rafael Espindola6cc2a682012-12-31 22:41:36 +00005300 // Silence warning for "clang -g foo.o -o foo"
5301 Args.ClaimAllArgs(options::OPT_g_Group);
5302 // and "clang -emit-llvm foo.o -o foo"
5303 Args.ClaimAllArgs(options::OPT_emit_llvm);
5304 // and for "clang -w foo.o -o foo". Other warning options are already
5305 // handled somewhere else.
5306 Args.ClaimAllArgs(options::OPT_w);
5307
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005308 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00005309 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005310 CmdArgs.push_back("-e");
5311 CmdArgs.push_back("__start");
5312 }
5313
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005314 if (Args.hasArg(options::OPT_static)) {
5315 CmdArgs.push_back("-Bstatic");
5316 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005317 if (Args.hasArg(options::OPT_rdynamic))
5318 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005319 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005320 CmdArgs.push_back("-Bdynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005321 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005322 CmdArgs.push_back("-shared");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005323 } else {
5324 CmdArgs.push_back("-dynamic-linker");
5325 CmdArgs.push_back("/usr/libexec/ld.so");
5326 }
5327 }
5328
Rafael Espindola9adba392013-06-05 04:28:55 +00005329 if (Args.hasArg(options::OPT_nopie))
5330 CmdArgs.push_back("-nopie");
5331
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005332 if (Output.isFilename()) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005333 CmdArgs.push_back("-o");
5334 CmdArgs.push_back(Output.getFilename());
5335 } else {
5336 assert(Output.isNothing() && "Invalid output.");
5337 }
5338
5339 if (!Args.hasArg(options::OPT_nostdlib) &&
5340 !Args.hasArg(options::OPT_nostartfiles)) {
5341 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman62d829a2011-12-15 02:15:56 +00005342 if (Args.hasArg(options::OPT_pg))
5343 CmdArgs.push_back(Args.MakeArgString(
5344 getToolChain().GetFilePath("gcrt0.o")));
5345 else
5346 CmdArgs.push_back(Args.MakeArgString(
5347 getToolChain().GetFilePath("crt0.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005348 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005349 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005350 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005351 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005352 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005353 }
5354 }
5355
Edward O'Callaghane7e18202009-10-28 15:13:08 +00005356 std::string Triple = getToolChain().getTripleString();
5357 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar294691e2009-11-04 06:24:38 +00005358 Triple.replace(0, 6, "amd64");
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00005359 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbar95c04572010-08-01 23:13:54 +00005360 "/4.2.1"));
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005361
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005362 Args.AddAllArgs(CmdArgs, options::OPT_L);
5363 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5364 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindola6cc2a682012-12-31 22:41:36 +00005365 Args.AddAllArgs(CmdArgs, options::OPT_s);
5366 Args.AddAllArgs(CmdArgs, options::OPT_t);
5367 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5368 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005369
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005370 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005371
5372 if (!Args.hasArg(options::OPT_nostdlib) &&
5373 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005374 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00005375 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman62d829a2011-12-15 02:15:56 +00005376 if (Args.hasArg(options::OPT_pg))
5377 CmdArgs.push_back("-lm_p");
5378 else
5379 CmdArgs.push_back("-lm");
Daniel Dunbar95c04572010-08-01 23:13:54 +00005380 }
5381
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005382 // FIXME: For some reason GCC passes -lgcc before adding
5383 // the default system libraries. Just mimic this for now.
5384 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005385
Eric Christopherdc6cc872012-09-13 06:32:34 +00005386 if (Args.hasArg(options::OPT_pthread)) {
5387 if (!Args.hasArg(options::OPT_shared) &&
5388 Args.hasArg(options::OPT_pg))
5389 CmdArgs.push_back("-lpthread_p");
5390 else
5391 CmdArgs.push_back("-lpthread");
5392 }
5393
Chandler Carruth657849c2011-12-17 22:32:42 +00005394 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherdc6cc872012-09-13 06:32:34 +00005395 if (Args.hasArg(options::OPT_pg))
Eli Friedman62d829a2011-12-15 02:15:56 +00005396 CmdArgs.push_back("-lc_p");
5397 else
5398 CmdArgs.push_back("-lc");
Chandler Carruth657849c2011-12-17 22:32:42 +00005399 }
Eric Christopherdc6cc872012-09-13 06:32:34 +00005400
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005401 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005402 }
5403
5404 if (!Args.hasArg(options::OPT_nostdlib) &&
5405 !Args.hasArg(options::OPT_nostartfiles)) {
5406 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005407 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005408 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005409 else
Chris Lattner38e317d2010-07-07 16:01:42 +00005410 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005411 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005412 }
5413
5414 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005415 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005416 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005417}
Ed Schoutenc66a5a32009-04-02 19:13:12 +00005418
Eli Friedman42f74f22012-08-08 23:57:20 +00005419void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5420 const InputInfo &Output,
5421 const InputInfoList &Inputs,
5422 const ArgList &Args,
5423 const char *LinkingOutput) const {
5424 ArgStringList CmdArgs;
5425
5426 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5427 options::OPT_Xassembler);
5428
5429 CmdArgs.push_back("-o");
5430 CmdArgs.push_back(Output.getFilename());
5431
5432 for (InputInfoList::const_iterator
5433 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5434 const InputInfo &II = *it;
5435 CmdArgs.push_back(II.getFilename());
5436 }
5437
5438 const char *Exec =
5439 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5440 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5441}
5442
5443void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5444 const InputInfo &Output,
5445 const InputInfoList &Inputs,
5446 const ArgList &Args,
5447 const char *LinkingOutput) const {
5448 const Driver &D = getToolChain().getDriver();
5449 ArgStringList CmdArgs;
5450
5451 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5452 (!Args.hasArg(options::OPT_shared))) {
5453 CmdArgs.push_back("-e");
5454 CmdArgs.push_back("__start");
5455 }
5456
5457 if (Args.hasArg(options::OPT_static)) {
5458 CmdArgs.push_back("-Bstatic");
5459 } else {
5460 if (Args.hasArg(options::OPT_rdynamic))
5461 CmdArgs.push_back("-export-dynamic");
5462 CmdArgs.push_back("--eh-frame-hdr");
5463 CmdArgs.push_back("-Bdynamic");
5464 if (Args.hasArg(options::OPT_shared)) {
5465 CmdArgs.push_back("-shared");
5466 } else {
5467 CmdArgs.push_back("-dynamic-linker");
5468 CmdArgs.push_back("/usr/libexec/ld.so");
5469 }
5470 }
5471
5472 if (Output.isFilename()) {
5473 CmdArgs.push_back("-o");
5474 CmdArgs.push_back(Output.getFilename());
5475 } else {
5476 assert(Output.isNothing() && "Invalid output.");
5477 }
5478
5479 if (!Args.hasArg(options::OPT_nostdlib) &&
5480 !Args.hasArg(options::OPT_nostartfiles)) {
5481 if (!Args.hasArg(options::OPT_shared)) {
5482 if (Args.hasArg(options::OPT_pg))
5483 CmdArgs.push_back(Args.MakeArgString(
5484 getToolChain().GetFilePath("gcrt0.o")));
5485 else
5486 CmdArgs.push_back(Args.MakeArgString(
5487 getToolChain().GetFilePath("crt0.o")));
5488 CmdArgs.push_back(Args.MakeArgString(
5489 getToolChain().GetFilePath("crtbegin.o")));
5490 } else {
5491 CmdArgs.push_back(Args.MakeArgString(
5492 getToolChain().GetFilePath("crtbeginS.o")));
5493 }
5494 }
5495
5496 Args.AddAllArgs(CmdArgs, options::OPT_L);
5497 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5498 Args.AddAllArgs(CmdArgs, options::OPT_e);
5499
5500 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5501
5502 if (!Args.hasArg(options::OPT_nostdlib) &&
5503 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005504 if (D.CCCIsCXX()) {
Eli Friedman42f74f22012-08-08 23:57:20 +00005505 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5506 if (Args.hasArg(options::OPT_pg))
5507 CmdArgs.push_back("-lm_p");
5508 else
5509 CmdArgs.push_back("-lm");
5510 }
5511
Rafael Espindola3667bbe2012-10-23 17:07:31 +00005512 if (Args.hasArg(options::OPT_pthread)) {
5513 if (!Args.hasArg(options::OPT_shared) &&
5514 Args.hasArg(options::OPT_pg))
5515 CmdArgs.push_back("-lpthread_p");
5516 else
5517 CmdArgs.push_back("-lpthread");
5518 }
5519
Eli Friedman42f74f22012-08-08 23:57:20 +00005520 if (!Args.hasArg(options::OPT_shared)) {
5521 if (Args.hasArg(options::OPT_pg))
5522 CmdArgs.push_back("-lc_p");
5523 else
5524 CmdArgs.push_back("-lc");
5525 }
5526
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00005527 StringRef MyArch;
5528 switch (getToolChain().getTriple().getArch()) {
5529 case llvm::Triple::arm:
5530 MyArch = "arm";
5531 break;
5532 case llvm::Triple::x86:
5533 MyArch = "i386";
5534 break;
5535 case llvm::Triple::x86_64:
5536 MyArch = "amd64";
5537 break;
5538 default:
5539 llvm_unreachable("Unsupported architecture");
5540 }
5541 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman42f74f22012-08-08 23:57:20 +00005542 }
5543
5544 if (!Args.hasArg(options::OPT_nostdlib) &&
5545 !Args.hasArg(options::OPT_nostartfiles)) {
5546 if (!Args.hasArg(options::OPT_shared))
5547 CmdArgs.push_back(Args.MakeArgString(
5548 getToolChain().GetFilePath("crtend.o")));
5549 else
5550 CmdArgs.push_back(Args.MakeArgString(
5551 getToolChain().GetFilePath("crtendS.o")));
5552 }
Eli Friedmanc9c48db2012-08-09 22:42:04 +00005553
5554 const char *Exec =
5555 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5556 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman42f74f22012-08-08 23:57:20 +00005557}
5558
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005559void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005560 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005561 const InputInfoList &Inputs,
5562 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005563 const char *LinkingOutput) const {
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005564 ArgStringList CmdArgs;
5565
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005566 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5567 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc55da4b2012-09-05 21:32:44 +00005568 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005569 CmdArgs.push_back("--32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005570 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky3393cef2011-06-04 07:37:31 +00005571 CmdArgs.push_back("-a32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005572 else if (getToolChain().getArch() == llvm::Triple::mips ||
5573 getToolChain().getArch() == llvm::Triple::mipsel ||
5574 getToolChain().getArch() == llvm::Triple::mips64 ||
5575 getToolChain().getArch() == llvm::Triple::mips64el) {
5576 StringRef CPUName;
5577 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00005578 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer20249a12010-10-21 03:16:25 +00005579
Eric Christopherc55da4b2012-09-05 21:32:44 +00005580 CmdArgs.push_back("-march");
5581 CmdArgs.push_back(CPUName.data());
5582
Eric Christopherc55da4b2012-09-05 21:32:44 +00005583 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00005584 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc55da4b2012-09-05 21:32:44 +00005585
5586 if (getToolChain().getArch() == llvm::Triple::mips ||
5587 getToolChain().getArch() == llvm::Triple::mips64)
5588 CmdArgs.push_back("-EB");
5589 else
5590 CmdArgs.push_back("-EL");
5591
5592 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5593 options::OPT_fpic, options::OPT_fno_pic,
5594 options::OPT_fPIE, options::OPT_fno_PIE,
5595 options::OPT_fpie, options::OPT_fno_pie);
5596 if (LastPICArg &&
5597 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5598 LastPICArg->getOption().matches(options::OPT_fpic) ||
5599 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5600 LastPICArg->getOption().matches(options::OPT_fpie))) {
5601 CmdArgs.push_back("-KPIC");
5602 }
Rafael Espindola27fa2362012-12-13 04:17:14 +00005603 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5604 getToolChain().getArch() == llvm::Triple::thumb) {
5605 CmdArgs.push_back("-mfpu=softvfp");
5606 switch(getToolChain().getTriple().getEnvironment()) {
5607 case llvm::Triple::GNUEABI:
5608 case llvm::Triple::EABI:
Anton Korobeynikovb234e742013-03-18 07:59:20 +00005609 CmdArgs.push_back("-meabi=5");
Rafael Espindola27fa2362012-12-13 04:17:14 +00005610 break;
5611
5612 default:
5613 CmdArgs.push_back("-matpcs");
5614 }
Eric Christopherc55da4b2012-09-05 21:32:44 +00005615 }
Eric Christophered734732010-03-02 02:41:08 +00005616
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005617 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5618 options::OPT_Xassembler);
5619
5620 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005621 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005622
5623 for (InputInfoList::const_iterator
5624 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5625 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005626 CmdArgs.push_back(II.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005627 }
5628
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005629 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005630 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005631 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005632}
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005633
5634void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005635 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005636 const InputInfoList &Inputs,
5637 const ArgList &Args,
Daniel Dunbara8304f62009-05-02 20:14:53 +00005638 const char *LinkingOutput) const {
Roman Divacky94380162012-08-28 15:09:03 +00005639 const toolchains::FreeBSD& ToolChain =
5640 static_cast<const toolchains::FreeBSD&>(getToolChain());
5641 const Driver &D = ToolChain.getDriver();
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005642 ArgStringList CmdArgs;
David Chisnalldfa210b2012-07-29 15:24:44 +00005643
5644 // Silence warning for "clang -g foo.o -o foo"
5645 Args.ClaimAllArgs(options::OPT_g_Group);
5646 // and "clang -emit-llvm foo.o -o foo"
5647 Args.ClaimAllArgs(options::OPT_emit_llvm);
5648 // and for "clang -w foo.o -o foo". Other warning options are already
5649 // handled somewhere else.
5650 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005651
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005652 if (!D.SysRoot.empty())
5653 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5654
Roman Divacky94380162012-08-28 15:09:03 +00005655 if (Args.hasArg(options::OPT_pie))
5656 CmdArgs.push_back("-pie");
5657
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005658 if (Args.hasArg(options::OPT_static)) {
5659 CmdArgs.push_back("-Bstatic");
5660 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005661 if (Args.hasArg(options::OPT_rdynamic))
5662 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005663 CmdArgs.push_back("--eh-frame-hdr");
5664 if (Args.hasArg(options::OPT_shared)) {
5665 CmdArgs.push_back("-Bshareable");
5666 } else {
5667 CmdArgs.push_back("-dynamic-linker");
5668 CmdArgs.push_back("/libexec/ld-elf.so.1");
5669 }
Roman Divacky94380162012-08-28 15:09:03 +00005670 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5671 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnalldfa210b2012-07-29 15:24:44 +00005672 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5673 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5674 CmdArgs.push_back("--hash-style=both");
5675 }
5676 }
5677 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005678 }
5679
5680 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5681 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005682 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005683 CmdArgs.push_back("-m");
5684 CmdArgs.push_back("elf_i386_fbsd");
5685 }
5686
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005687 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky000a6552011-06-04 07:40:24 +00005688 CmdArgs.push_back("-m");
Roman Divacky1052c1d2011-11-21 16:50:32 +00005689 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky000a6552011-06-04 07:40:24 +00005690 }
5691
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005692 if (Output.isFilename()) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005693 CmdArgs.push_back("-o");
5694 CmdArgs.push_back(Output.getFilename());
5695 } else {
5696 assert(Output.isNothing() && "Invalid output.");
5697 }
5698
5699 if (!Args.hasArg(options::OPT_nostdlib) &&
5700 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divacky94380162012-08-28 15:09:03 +00005701 const char *crt1 = NULL;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005702 if (!Args.hasArg(options::OPT_shared)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005703 if (Args.hasArg(options::OPT_pg))
Roman Divacky94380162012-08-28 15:09:03 +00005704 crt1 = "gcrt1.o";
5705 else if (Args.hasArg(options::OPT_pie))
5706 crt1 = "Scrt1.o";
5707 else
5708 crt1 = "crt1.o";
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005709 }
Roman Divacky94380162012-08-28 15:09:03 +00005710 if (crt1)
5711 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5712
5713 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5714
5715 const char *crtbegin = NULL;
5716 if (Args.hasArg(options::OPT_static))
5717 crtbegin = "crtbeginT.o";
5718 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5719 crtbegin = "crtbeginS.o";
5720 else
5721 crtbegin = "crtbegin.o";
5722
5723 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005724 }
5725
5726 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divacky94380162012-08-28 15:09:03 +00005727 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divacky58e5ac92011-03-01 17:53:14 +00005728 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5729 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005730 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005731 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5732 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnallc7363772010-08-15 22:58:12 +00005733 Args.AddAllArgs(CmdArgs, options::OPT_s);
5734 Args.AddAllArgs(CmdArgs, options::OPT_t);
5735 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5736 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005737
Roman Divacky94380162012-08-28 15:09:03 +00005738 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005739
5740 if (!Args.hasArg(options::OPT_nostdlib) &&
5741 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005742 if (D.CCCIsCXX()) {
Roman Divacky94380162012-08-28 15:09:03 +00005743 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divackyc16bb762011-02-10 16:59:40 +00005744 if (Args.hasArg(options::OPT_pg))
5745 CmdArgs.push_back("-lm_p");
5746 else
5747 CmdArgs.push_back("-lm");
Daniel Dunbar20022632010-02-17 08:07:51 +00005748 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005749 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5750 // the default system libraries. Just mimic this for now.
Roman Divackyc16bb762011-02-10 16:59:40 +00005751 if (Args.hasArg(options::OPT_pg))
5752 CmdArgs.push_back("-lgcc_p");
5753 else
5754 CmdArgs.push_back("-lgcc");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005755 if (Args.hasArg(options::OPT_static)) {
5756 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005757 } else if (Args.hasArg(options::OPT_pg)) {
5758 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005759 } else {
5760 CmdArgs.push_back("--as-needed");
5761 CmdArgs.push_back("-lgcc_s");
5762 CmdArgs.push_back("--no-as-needed");
5763 }
5764
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005765 if (Args.hasArg(options::OPT_pthread)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005766 if (Args.hasArg(options::OPT_pg))
5767 CmdArgs.push_back("-lpthread_p");
5768 else
5769 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005770 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005771
Roman Divackyc16bb762011-02-10 16:59:40 +00005772 if (Args.hasArg(options::OPT_pg)) {
5773 if (Args.hasArg(options::OPT_shared))
5774 CmdArgs.push_back("-lc");
5775 else
5776 CmdArgs.push_back("-lc_p");
5777 CmdArgs.push_back("-lgcc_p");
5778 } else {
5779 CmdArgs.push_back("-lc");
5780 CmdArgs.push_back("-lgcc");
5781 }
5782
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005783 if (Args.hasArg(options::OPT_static)) {
5784 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005785 } else if (Args.hasArg(options::OPT_pg)) {
5786 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005787 } else {
5788 CmdArgs.push_back("--as-needed");
5789 CmdArgs.push_back("-lgcc_s");
5790 CmdArgs.push_back("--no-as-needed");
5791 }
5792 }
5793
5794 if (!Args.hasArg(options::OPT_nostdlib) &&
5795 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyf6513812012-09-07 13:36:21 +00005796 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divacky94380162012-08-28 15:09:03 +00005797 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackyf6513812012-09-07 13:36:21 +00005798 else
5799 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divacky94380162012-08-28 15:09:03 +00005800 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005801 }
5802
Roman Divacky94380162012-08-28 15:09:03 +00005803 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005804
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005805 const char *Exec =
Roman Divacky94380162012-08-28 15:09:03 +00005806 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005807 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005808}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005809
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005810void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5811 const InputInfo &Output,
5812 const InputInfoList &Inputs,
5813 const ArgList &Args,
5814 const char *LinkingOutput) const {
5815 ArgStringList CmdArgs;
5816
5817 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5818 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005819 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005820 CmdArgs.push_back("--32");
5821
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005822 // Set byte order explicitly
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005823 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005824 CmdArgs.push_back("-EB");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005825 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005826 CmdArgs.push_back("-EL");
5827
5828 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5829 options::OPT_Xassembler);
5830
5831 CmdArgs.push_back("-o");
5832 CmdArgs.push_back(Output.getFilename());
5833
5834 for (InputInfoList::const_iterator
5835 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5836 const InputInfo &II = *it;
5837 CmdArgs.push_back(II.getFilename());
5838 }
5839
David Chisnall5adcec12011-09-27 22:03:18 +00005840 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005841 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5842}
5843
5844void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5845 const InputInfo &Output,
5846 const InputInfoList &Inputs,
5847 const ArgList &Args,
5848 const char *LinkingOutput) const {
5849 const Driver &D = getToolChain().getDriver();
5850 ArgStringList CmdArgs;
5851
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005852 if (!D.SysRoot.empty())
5853 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5854
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005855 if (Args.hasArg(options::OPT_static)) {
5856 CmdArgs.push_back("-Bstatic");
5857 } else {
5858 if (Args.hasArg(options::OPT_rdynamic))
5859 CmdArgs.push_back("-export-dynamic");
5860 CmdArgs.push_back("--eh-frame-hdr");
5861 if (Args.hasArg(options::OPT_shared)) {
5862 CmdArgs.push_back("-Bshareable");
5863 } else {
5864 CmdArgs.push_back("-dynamic-linker");
5865 CmdArgs.push_back("/libexec/ld.elf_so");
5866 }
5867 }
5868
5869 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5870 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005871 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005872 CmdArgs.push_back("-m");
5873 CmdArgs.push_back("elf_i386");
5874 }
5875
5876 if (Output.isFilename()) {
5877 CmdArgs.push_back("-o");
5878 CmdArgs.push_back(Output.getFilename());
5879 } else {
5880 assert(Output.isNothing() && "Invalid output.");
5881 }
5882
5883 if (!Args.hasArg(options::OPT_nostdlib) &&
5884 !Args.hasArg(options::OPT_nostartfiles)) {
5885 if (!Args.hasArg(options::OPT_shared)) {
5886 CmdArgs.push_back(Args.MakeArgString(
5887 getToolChain().GetFilePath("crt0.o")));
5888 CmdArgs.push_back(Args.MakeArgString(
5889 getToolChain().GetFilePath("crti.o")));
5890 CmdArgs.push_back(Args.MakeArgString(
5891 getToolChain().GetFilePath("crtbegin.o")));
5892 } else {
5893 CmdArgs.push_back(Args.MakeArgString(
5894 getToolChain().GetFilePath("crti.o")));
5895 CmdArgs.push_back(Args.MakeArgString(
5896 getToolChain().GetFilePath("crtbeginS.o")));
5897 }
5898 }
5899
5900 Args.AddAllArgs(CmdArgs, options::OPT_L);
5901 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5902 Args.AddAllArgs(CmdArgs, options::OPT_e);
5903 Args.AddAllArgs(CmdArgs, options::OPT_s);
5904 Args.AddAllArgs(CmdArgs, options::OPT_t);
5905 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5906 Args.AddAllArgs(CmdArgs, options::OPT_r);
5907
5908 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5909
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00005910 unsigned Major, Minor, Micro;
5911 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
5912 bool useLibgcc = true;
5913 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
5914 if (getToolChain().getArch() == llvm::Triple::x86 ||
5915 getToolChain().getArch() == llvm::Triple::x86_64)
5916 useLibgcc = false;
5917 }
5918
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005919 if (!Args.hasArg(options::OPT_nostdlib) &&
5920 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005921 if (D.CCCIsCXX()) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005922 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5923 CmdArgs.push_back("-lm");
5924 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005925 if (Args.hasArg(options::OPT_pthread))
5926 CmdArgs.push_back("-lpthread");
5927 CmdArgs.push_back("-lc");
5928
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00005929 if (useLibgcc) {
5930 if (Args.hasArg(options::OPT_static)) {
5931 // libgcc_eh depends on libc, so resolve as much as possible,
5932 // pull in any new requirements from libc and then get the rest
5933 // of libgcc.
5934 CmdArgs.push_back("-lgcc_eh");
5935 CmdArgs.push_back("-lc");
5936 CmdArgs.push_back("-lgcc");
5937 } else {
5938 CmdArgs.push_back("-lgcc");
5939 CmdArgs.push_back("--as-needed");
5940 CmdArgs.push_back("-lgcc_s");
5941 CmdArgs.push_back("--no-as-needed");
5942 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005943 }
5944 }
5945
5946 if (!Args.hasArg(options::OPT_nostdlib) &&
5947 !Args.hasArg(options::OPT_nostartfiles)) {
5948 if (!Args.hasArg(options::OPT_shared))
5949 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5950 "crtend.o")));
5951 else
5952 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5953 "crtendS.o")));
5954 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5955 "crtn.o")));
5956 }
5957
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005958 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005959
David Chisnall5adcec12011-09-27 22:03:18 +00005960 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005961 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5962}
5963
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00005964void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5965 const InputInfo &Output,
5966 const InputInfoList &Inputs,
5967 const ArgList &Args,
5968 const char *LinkingOutput) const {
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005969 ArgStringList CmdArgs;
5970
5971 // Add --32/--64 to make sure we get the format we want.
5972 // This is incomplete
5973 if (getToolChain().getArch() == llvm::Triple::x86) {
5974 CmdArgs.push_back("--32");
5975 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5976 CmdArgs.push_back("--64");
Eli Friedman7972c882011-11-28 23:46:52 +00005977 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5978 CmdArgs.push_back("-a32");
5979 CmdArgs.push_back("-mppc");
5980 CmdArgs.push_back("-many");
5981 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5982 CmdArgs.push_back("-a64");
5983 CmdArgs.push_back("-mppc64");
5984 CmdArgs.push_back("-many");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00005985 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
5986 CmdArgs.push_back("-a64");
5987 CmdArgs.push_back("-mppc64le");
5988 CmdArgs.push_back("-many");
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005989 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00005990 StringRef MArch = getToolChain().getArchName();
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005991 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5992 CmdArgs.push_back("-mfpu=neon");
Bernard Ogden80e90c22013-10-24 18:32:41 +00005993 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a")
5994 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00005995
5996 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5997 getToolChain().getTriple());
5998 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00005999
6000 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
6001 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
6002 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanakac85900f2011-11-30 19:31:38 +00006003 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6004 getToolChain().getArch() == llvm::Triple::mipsel ||
6005 getToolChain().getArch() == llvm::Triple::mips64 ||
6006 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan073a7802012-04-07 22:31:29 +00006007 StringRef CPUName;
6008 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00006009 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanakac85900f2011-11-30 19:31:38 +00006010
Simon Atanasyan073a7802012-04-07 22:31:29 +00006011 CmdArgs.push_back("-march");
6012 CmdArgs.push_back(CPUName.data());
6013
Simon Atanasyan073a7802012-04-07 22:31:29 +00006014 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00006015 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan5f0a1c12012-04-06 19:15:24 +00006016
6017 if (getToolChain().getArch() == llvm::Triple::mips ||
6018 getToolChain().getArch() == llvm::Triple::mips64)
6019 CmdArgs.push_back("-EB");
6020 else
6021 CmdArgs.push_back("-EL");
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00006022
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00006023 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6024 if (StringRef(A->getValue()) == "2008")
6025 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6026 }
6027
Simon Atanasyan9dbfc612013-04-30 07:47:13 +00006028 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6029 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6030 options::OPT_mno_micromips);
6031 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6032 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6033
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00006034 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6035 options::OPT_fpic, options::OPT_fno_pic,
6036 options::OPT_fPIE, options::OPT_fno_PIE,
6037 options::OPT_fpie, options::OPT_fno_pie);
6038 if (LastPICArg &&
6039 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6040 LastPICArg->getOption().matches(options::OPT_fpic) ||
6041 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6042 LastPICArg->getOption().matches(options::OPT_fpie))) {
6043 CmdArgs.push_back("-KPIC");
6044 }
Ulrich Weigandb8409212013-05-06 16:26:41 +00006045 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00006046 // Always pass an -march option, since our default of z10 is later
6047 // than the GNU assembler's default.
6048 StringRef CPUName = getSystemZTargetCPU(Args);
6049 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006050 }
6051
6052 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6053 options::OPT_Xassembler);
6054
6055 CmdArgs.push_back("-o");
6056 CmdArgs.push_back(Output.getFilename());
6057
6058 for (InputInfoList::const_iterator
6059 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6060 const InputInfo &II = *it;
6061 CmdArgs.push_back(II.getFilename());
6062 }
6063
6064 const char *Exec =
6065 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6066 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopherc47b6f32013-06-05 23:58:15 +00006067
6068 // Handle the debug info splitting at object creation time if we're
6069 // creating an object.
6070 // TODO: Currently only works on linux with newer objcopy.
6071 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00006072 getToolChain().getTriple().isOSLinux())
Eric Christopherc47b6f32013-06-05 23:58:15 +00006073 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6074 SplitDebugName(Args, Inputs));
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006075}
6076
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006077static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6078 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chien94a71422012-09-02 09:30:11 +00006079 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth68f94db2013-03-04 02:07:55 +00006080 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6081 Args.hasArg(options::OPT_static);
Hans Wennborg76b86c22013-07-18 20:29:38 +00006082 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006083 CmdArgs.push_back("-lgcc");
6084
Logan Chien529a73d2012-11-19 12:04:11 +00006085 if (StaticLibgcc || isAndroid) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006086 if (D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006087 CmdArgs.push_back("-lgcc");
6088 } else {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006089 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006090 CmdArgs.push_back("--as-needed");
6091 CmdArgs.push_back("-lgcc_s");
Hans Wennborg76b86c22013-07-18 20:29:38 +00006092 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006093 CmdArgs.push_back("--no-as-needed");
6094 }
6095
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006096 if (StaticLibgcc && !isAndroid)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006097 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg76b86c22013-07-18 20:29:38 +00006098 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006099 CmdArgs.push_back("-lgcc");
Logan Chien529a73d2012-11-19 12:04:11 +00006100
6101 // According to Android ABI, we have to link with libdl if we are
6102 // linking with non-static libgcc.
6103 //
6104 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6105 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6106 if (isAndroid && !StaticLibgcc)
6107 CmdArgs.push_back("-ldl");
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006108}
6109
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00006110static bool hasMipsN32ABIArg(const ArgList &Args) {
6111 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smith1d489cf2012-11-01 04:30:05 +00006112 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00006113}
6114
Peter Collingbournebdaa1342013-05-27 21:40:20 +00006115static StringRef getLinuxDynamicLinker(const ArgList &Args,
6116 const toolchains::Linux &ToolChain) {
6117 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6118 return "/system/bin/linker";
6119 else if (ToolChain.getArch() == llvm::Triple::x86)
6120 return "/lib/ld-linux.so.2";
6121 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6122 return "/lib/ld-linux-aarch64.so.1";
6123 else if (ToolChain.getArch() == llvm::Triple::arm ||
6124 ToolChain.getArch() == llvm::Triple::thumb) {
6125 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6126 return "/lib/ld-linux-armhf.so.3";
6127 else
6128 return "/lib/ld-linux.so.3";
6129 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6130 ToolChain.getArch() == llvm::Triple::mipsel)
6131 return "/lib/ld.so.1";
6132 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6133 ToolChain.getArch() == llvm::Triple::mips64el) {
6134 if (hasMipsN32ABIArg(Args))
6135 return "/lib32/ld.so.1";
6136 else
6137 return "/lib64/ld.so.1";
6138 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6139 return "/lib/ld.so.1";
6140 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00006141 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbournebdaa1342013-05-27 21:40:20 +00006142 ToolChain.getArch() == llvm::Triple::systemz)
6143 return "/lib64/ld64.so.1";
6144 else
6145 return "/lib64/ld-linux-x86-64.so.2";
6146}
6147
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00006148void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6149 const InputInfo &Output,
6150 const InputInfoList &Inputs,
6151 const ArgList &Args,
6152 const char *LinkingOutput) const {
Rafael Espindolac1da9812010-11-07 20:14:31 +00006153 const toolchains::Linux& ToolChain =
6154 static_cast<const toolchains::Linux&>(getToolChain());
6155 const Driver &D = ToolChain.getDriver();
Rafael Espindola715852c2012-11-02 20:41:30 +00006156 const bool isAndroid =
6157 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Alexey Samsonov1b8f12d2013-08-19 09:14:21 +00006158 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006159 const bool IsPIE =
6160 !Args.hasArg(options::OPT_shared) &&
Alexey Samsonov8bdc92c2013-08-09 07:42:13 +00006161 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow(ToolChain));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006162
Rafael Espindolac1da9812010-11-07 20:14:31 +00006163 ArgStringList CmdArgs;
6164
Rafael Espindola26f14c32010-11-15 18:28:16 +00006165 // Silence warning for "clang -g foo.o -o foo"
6166 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00006167 // and "clang -emit-llvm foo.o -o foo"
6168 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnalldfa210b2012-07-29 15:24:44 +00006169 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindola7f6458b2010-11-17 20:37:10 +00006170 // handled somewhere else.
6171 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola26f14c32010-11-15 18:28:16 +00006172
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006173 if (!D.SysRoot.empty())
6174 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006175
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006176 if (IsPIE)
Rafael Espindolafdda1712010-11-17 22:26:15 +00006177 CmdArgs.push_back("-pie");
6178
Rafael Espindoladc1b76d2010-11-07 22:57:16 +00006179 if (Args.hasArg(options::OPT_rdynamic))
6180 CmdArgs.push_back("-export-dynamic");
6181
Rafael Espindolae0e6d3b2010-11-11 19:34:42 +00006182 if (Args.hasArg(options::OPT_s))
6183 CmdArgs.push_back("-s");
6184
Rafael Espindolac1da9812010-11-07 20:14:31 +00006185 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6186 e = ToolChain.ExtraOpts.end();
6187 i != e; ++i)
6188 CmdArgs.push_back(i->c_str());
6189
6190 if (!Args.hasArg(options::OPT_static)) {
6191 CmdArgs.push_back("--eh-frame-hdr");
6192 }
6193
6194 CmdArgs.push_back("-m");
6195 if (ToolChain.getArch() == llvm::Triple::x86)
6196 CmdArgs.push_back("elf_i386");
Tim Northoverc264e162013-01-31 12:13:10 +00006197 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6198 CmdArgs.push_back("aarch64linux");
Eric Christopher88b7cf02011-08-19 00:30:14 +00006199 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregorf0594d82011-03-06 19:11:49 +00006200 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00006201 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43ac2972011-04-05 22:04:27 +00006202 else if (ToolChain.getArch() == llvm::Triple::ppc)
6203 CmdArgs.push_back("elf32ppclinux");
6204 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6205 CmdArgs.push_back("elf64ppc");
Eli Friedman5bea4f62011-11-08 19:43:37 +00006206 else if (ToolChain.getArch() == llvm::Triple::mips)
6207 CmdArgs.push_back("elf32btsmip");
6208 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6209 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00006210 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6211 if (hasMipsN32ABIArg(Args))
6212 CmdArgs.push_back("elf32btsmipn32");
6213 else
6214 CmdArgs.push_back("elf64btsmip");
6215 }
6216 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6217 if (hasMipsN32ABIArg(Args))
6218 CmdArgs.push_back("elf32ltsmipn32");
6219 else
6220 CmdArgs.push_back("elf64ltsmip");
6221 }
Ulrich Weigandb8409212013-05-06 16:26:41 +00006222 else if (ToolChain.getArch() == llvm::Triple::systemz)
6223 CmdArgs.push_back("elf64_s390");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006224 else
6225 CmdArgs.push_back("elf_x86_64");
6226
6227 if (Args.hasArg(options::OPT_static)) {
Douglas Gregorf0594d82011-03-06 19:11:49 +00006228 if (ToolChain.getArch() == llvm::Triple::arm
6229 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00006230 CmdArgs.push_back("-Bstatic");
6231 else
6232 CmdArgs.push_back("-static");
6233 } else if (Args.hasArg(options::OPT_shared)) {
6234 CmdArgs.push_back("-shared");
Rafael Espindola715852c2012-11-02 20:41:30 +00006235 if (isAndroid) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006236 CmdArgs.push_back("-Bsymbolic");
6237 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006238 }
6239
6240 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregorf0594d82011-03-06 19:11:49 +00006241 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac1da9812010-11-07 20:14:31 +00006242 (!Args.hasArg(options::OPT_static) &&
6243 !Args.hasArg(options::OPT_shared))) {
6244 CmdArgs.push_back("-dynamic-linker");
Peter Collingbournebdaa1342013-05-27 21:40:20 +00006245 CmdArgs.push_back(Args.MakeArgString(
6246 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006247 }
6248
6249 CmdArgs.push_back("-o");
6250 CmdArgs.push_back(Output.getFilename());
6251
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006252 if (!Args.hasArg(options::OPT_nostdlib) &&
6253 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006254 if (!isAndroid) {
6255 const char *crt1 = NULL;
6256 if (!Args.hasArg(options::OPT_shared)){
Eric Christopher61f08682013-06-07 23:25:01 +00006257 if (Args.hasArg(options::OPT_pg))
6258 crt1 = "gcrt1.o";
6259 else if (IsPIE)
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006260 crt1 = "Scrt1.o";
6261 else
6262 crt1 = "crt1.o";
6263 }
6264 if (crt1)
6265 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006266
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006267 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6268 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006269
Rafael Espindola89414b32010-11-12 03:00:39 +00006270 const char *crtbegin;
6271 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006272 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006273 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006274 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006275 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006276 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006277 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006278 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006279 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramere20e5082012-10-04 19:42:20 +00006280
6281 // Add crtfastmath.o if available and fast math is enabled.
6282 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola89414b32010-11-12 03:00:39 +00006283 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006284
6285 Args.AddAllArgs(CmdArgs, options::OPT_L);
6286
6287 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6288
Roman Divacky58e5ac92011-03-01 17:53:14 +00006289 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6290 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00006291 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006292
Rafael Espindolac5151542012-04-09 23:53:34 +00006293 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6294 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6295 // forward.
Rafael Espindola6155fbe2013-09-04 19:37:35 +00006296 if (D.IsUsingLTO(Args)) {
Rafael Espindolac5151542012-04-09 23:53:34 +00006297 CmdArgs.push_back("-plugin");
6298 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6299 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth700d4e42013-01-13 11:46:33 +00006300
6301 // Try to pass driver level flags relevant to LTO code generation down to
6302 // the plugin.
6303
Rafael Espindolab330e402013-08-20 22:12:08 +00006304 // Handle flags for selecting CPU variants.
6305 std::string CPU = getCPUName(Args, ToolChain.getTriple());
6306 if (!CPU.empty()) {
Chandler Carruth700d4e42013-01-13 11:46:33 +00006307 CmdArgs.push_back(
Rafael Espindolab330e402013-08-20 22:12:08 +00006308 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6309 CPU));
6310 }
Rafael Espindolac5151542012-04-09 23:53:34 +00006311 }
6312
Chandler Carruth700d4e42013-01-13 11:46:33 +00006313
Nick Lewyckye276cfc2012-08-17 03:39:16 +00006314 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6315 CmdArgs.push_back("--no-demangle");
6316
Rafael Espindolac1da9812010-11-07 20:14:31 +00006317 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6318
Eric Christopher6716d942012-11-29 18:51:05 +00006319 // Call these before we add the C++ ABI library.
Richard Smithc4dabad2012-11-05 22:04:41 +00006320 if (Sanitize.needsUbsanRt())
Hans Wennborg76b86c22013-07-18 20:29:38 +00006321 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
Richard Smith61a574f2013-03-20 23:49:07 +00006322 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev050309f2013-05-27 11:17:01 +00006323 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher6716d942012-11-29 18:51:05 +00006324 if (Sanitize.needsAsanRt())
6325 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6326 if (Sanitize.needsTsanRt())
6327 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00006328 if (Sanitize.needsMsanRt())
6329 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev050309f2013-05-27 11:17:01 +00006330 if (Sanitize.needsLsanRt())
6331 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Peter Collingbourne2eeed712013-08-07 22:47:34 +00006332 if (Sanitize.needsDfsanRt())
6333 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith8e1cee62012-10-25 02:14:12 +00006334
Chandler Carruth80a393e2013-06-24 09:38:45 +00006335 // The profile runtime also needs access to system libraries.
6336 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6337
Hans Wennborg76b86c22013-07-18 20:29:38 +00006338 if (D.CCCIsCXX() &&
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006339 !Args.hasArg(options::OPT_nostdlib) &&
6340 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola19706f82011-10-17 22:14:51 +00006341 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6342 !Args.hasArg(options::OPT_static);
6343 if (OnlyLibstdcxxStatic)
6344 CmdArgs.push_back("-Bstatic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006345 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola19706f82011-10-17 22:14:51 +00006346 if (OnlyLibstdcxxStatic)
6347 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006348 CmdArgs.push_back("-lm");
6349 }
6350
Rafael Espindola89414b32010-11-12 03:00:39 +00006351 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006352 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6353 if (Args.hasArg(options::OPT_static))
6354 CmdArgs.push_back("--start-group");
Nick Lewycky80df0252011-06-04 06:27:06 +00006355
Chandler Carruthdf96e022013-01-17 13:19:29 +00006356 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6357 if (OpenMP) {
6358 CmdArgs.push_back("-lgomp");
6359
6360 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6361 // librt. Most modern Linux platfroms require it, but some may not.
6362 CmdArgs.push_back("-lrt");
6363 }
6364
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006365 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola89414b32010-11-12 03:00:39 +00006366
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006367 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruthdf96e022013-01-17 13:19:29 +00006368 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006369 CmdArgs.push_back("-lpthread");
6370
6371 CmdArgs.push_back("-lc");
6372
6373 if (Args.hasArg(options::OPT_static))
6374 CmdArgs.push_back("--end-group");
6375 else
6376 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6377 }
Rafael Espindolafdda1712010-11-17 22:26:15 +00006378
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006379 if (!Args.hasArg(options::OPT_nostartfiles)) {
6380 const char *crtend;
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006381 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006382 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006383 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006384 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006385 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006386 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006387
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006388 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006389 if (!isAndroid)
6390 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006391 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006392 }
6393
Rafael Espindolac1da9812010-11-07 20:14:31 +00006394 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6395}
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006396
Chris Lattner38e317d2010-07-07 16:01:42 +00006397void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006398 const InputInfo &Output,
6399 const InputInfoList &Inputs,
6400 const ArgList &Args,
6401 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00006402 ArgStringList CmdArgs;
6403
6404 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6405 options::OPT_Xassembler);
6406
6407 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006408 CmdArgs.push_back(Output.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00006409
6410 for (InputInfoList::const_iterator
6411 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6412 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006413 CmdArgs.push_back(II.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00006414 }
6415
6416 const char *Exec =
Eli Friedman6d402dc2011-12-08 23:54:21 +00006417 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006418 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00006419}
6420
6421void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006422 const InputInfo &Output,
6423 const InputInfoList &Inputs,
6424 const ArgList &Args,
6425 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00006426 const Driver &D = getToolChain().getDriver();
6427 ArgStringList CmdArgs;
6428
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006429 if (Output.isFilename()) {
Chris Lattner38e317d2010-07-07 16:01:42 +00006430 CmdArgs.push_back("-o");
6431 CmdArgs.push_back(Output.getFilename());
6432 } else {
6433 assert(Output.isNothing() && "Invalid output.");
6434 }
6435
6436 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman6d402dc2011-12-08 23:54:21 +00006437 !Args.hasArg(options::OPT_nostartfiles)) {
6438 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6439 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6440 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6441 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6442 }
Chris Lattner38e317d2010-07-07 16:01:42 +00006443
6444 Args.AddAllArgs(CmdArgs, options::OPT_L);
6445 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6446 Args.AddAllArgs(CmdArgs, options::OPT_e);
6447
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006448 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00006449
Eli Friedman6d402dc2011-12-08 23:54:21 +00006450 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6451
Chris Lattner38e317d2010-07-07 16:01:42 +00006452 if (!Args.hasArg(options::OPT_nostdlib) &&
6453 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006454 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006455 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00006456 CmdArgs.push_back("-lm");
6457 }
Chris Lattner38e317d2010-07-07 16:01:42 +00006458 }
6459
6460 if (!Args.hasArg(options::OPT_nostdlib) &&
6461 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman6d402dc2011-12-08 23:54:21 +00006462 if (Args.hasArg(options::OPT_pthread))
6463 CmdArgs.push_back("-lpthread");
6464 CmdArgs.push_back("-lc");
6465 CmdArgs.push_back("-lCompilerRT-Generic");
6466 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6467 CmdArgs.push_back(
Eric Christopher27e2b982012-12-18 00:31:10 +00006468 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006469 }
6470
Eli Friedman6d402dc2011-12-08 23:54:21 +00006471 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006472 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00006473}
6474
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006475/// DragonFly Tools
6476
6477// For now, DragonFly Assemble does just about the same as for
6478// FreeBSD, but this may change soon.
6479void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006480 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00006481 const InputInfoList &Inputs,
6482 const ArgList &Args,
6483 const char *LinkingOutput) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006484 ArgStringList CmdArgs;
6485
6486 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6487 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006488 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006489 CmdArgs.push_back("--32");
6490
6491 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6492 options::OPT_Xassembler);
6493
6494 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006495 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006496
6497 for (InputInfoList::const_iterator
6498 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6499 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006500 CmdArgs.push_back(II.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006501 }
6502
6503 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006504 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006505 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006506}
6507
6508void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006509 const InputInfo &Output,
6510 const InputInfoList &Inputs,
6511 const ArgList &Args,
6512 const char *LinkingOutput) const {
John McCall8cfb7202013-04-11 22:55:55 +00006513 bool UseGCC47 = false;
Daniel Dunbaree788e72009-12-21 18:54:17 +00006514 const Driver &D = getToolChain().getDriver();
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006515 ArgStringList CmdArgs;
6516
John McCall8cfb7202013-04-11 22:55:55 +00006517 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6518 UseGCC47 = false;
6519
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006520 if (!D.SysRoot.empty())
6521 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6522
John McCall8cfb7202013-04-11 22:55:55 +00006523 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006524 if (Args.hasArg(options::OPT_static)) {
6525 CmdArgs.push_back("-Bstatic");
6526 } else {
John McCall8cfb7202013-04-11 22:55:55 +00006527 if (Args.hasArg(options::OPT_rdynamic))
6528 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006529 if (Args.hasArg(options::OPT_shared))
6530 CmdArgs.push_back("-Bshareable");
6531 else {
6532 CmdArgs.push_back("-dynamic-linker");
6533 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6534 }
John McCall8cfb7202013-04-11 22:55:55 +00006535 CmdArgs.push_back("--hash-style=both");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006536 }
6537
6538 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6539 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006540 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006541 CmdArgs.push_back("-m");
6542 CmdArgs.push_back("elf_i386");
6543 }
6544
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006545 if (Output.isFilename()) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006546 CmdArgs.push_back("-o");
6547 CmdArgs.push_back(Output.getFilename());
6548 } else {
6549 assert(Output.isNothing() && "Invalid output.");
6550 }
6551
6552 if (!Args.hasArg(options::OPT_nostdlib) &&
6553 !Args.hasArg(options::OPT_nostartfiles)) {
6554 if (!Args.hasArg(options::OPT_shared)) {
John McCall8cfb7202013-04-11 22:55:55 +00006555 if (Args.hasArg(options::OPT_pg))
6556 CmdArgs.push_back(Args.MakeArgString(
6557 getToolChain().GetFilePath("gcrt1.o")));
6558 else {
6559 if (Args.hasArg(options::OPT_pie))
6560 CmdArgs.push_back(Args.MakeArgString(
6561 getToolChain().GetFilePath("Scrt1.o")));
6562 else
6563 CmdArgs.push_back(Args.MakeArgString(
6564 getToolChain().GetFilePath("crt1.o")));
6565 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006566 }
John McCall8cfb7202013-04-11 22:55:55 +00006567 CmdArgs.push_back(Args.MakeArgString(
6568 getToolChain().GetFilePath("crti.o")));
6569 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6570 CmdArgs.push_back(Args.MakeArgString(
6571 getToolChain().GetFilePath("crtbeginS.o")));
6572 else
6573 CmdArgs.push_back(Args.MakeArgString(
6574 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006575 }
6576
6577 Args.AddAllArgs(CmdArgs, options::OPT_L);
6578 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6579 Args.AddAllArgs(CmdArgs, options::OPT_e);
6580
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006581 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006582
6583 if (!Args.hasArg(options::OPT_nostdlib) &&
6584 !Args.hasArg(options::OPT_nodefaultlibs)) {
6585 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6586 // rpaths
John McCall8cfb7202013-04-11 22:55:55 +00006587 if (UseGCC47)
6588 CmdArgs.push_back("-L/usr/lib/gcc47");
6589 else
6590 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006591
6592 if (!Args.hasArg(options::OPT_static)) {
John McCall8cfb7202013-04-11 22:55:55 +00006593 if (UseGCC47) {
6594 CmdArgs.push_back("-rpath");
6595 CmdArgs.push_back("/usr/lib/gcc47");
6596 } else {
6597 CmdArgs.push_back("-rpath");
6598 CmdArgs.push_back("/usr/lib/gcc44");
6599 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006600 }
6601
Hans Wennborg76b86c22013-07-18 20:29:38 +00006602 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006603 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola405861d2010-07-20 12:59:03 +00006604 CmdArgs.push_back("-lm");
6605 }
6606
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006607 if (Args.hasArg(options::OPT_pthread))
Mike Stump4d63f8b2009-10-31 20:11:46 +00006608 CmdArgs.push_back("-lpthread");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006609
6610 if (!Args.hasArg(options::OPT_nolibc)) {
6611 CmdArgs.push_back("-lc");
6612 }
6613
John McCall8cfb7202013-04-11 22:55:55 +00006614 if (UseGCC47) {
6615 if (Args.hasArg(options::OPT_static) ||
6616 Args.hasArg(options::OPT_static_libgcc)) {
6617 CmdArgs.push_back("-lgcc");
6618 CmdArgs.push_back("-lgcc_eh");
6619 } else {
6620 if (Args.hasArg(options::OPT_shared_libgcc)) {
6621 CmdArgs.push_back("-lgcc_pic");
6622 if (!Args.hasArg(options::OPT_shared))
6623 CmdArgs.push_back("-lgcc");
6624 } else {
6625 CmdArgs.push_back("-lgcc");
6626 CmdArgs.push_back("--as-needed");
6627 CmdArgs.push_back("-lgcc_pic");
6628 CmdArgs.push_back("--no-as-needed");
6629 }
6630 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006631 } else {
John McCall8cfb7202013-04-11 22:55:55 +00006632 if (Args.hasArg(options::OPT_shared)) {
6633 CmdArgs.push_back("-lgcc_pic");
6634 } else {
6635 CmdArgs.push_back("-lgcc");
6636 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006637 }
6638 }
6639
6640 if (!Args.hasArg(options::OPT_nostdlib) &&
6641 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall8cfb7202013-04-11 22:55:55 +00006642 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner38e317d2010-07-07 16:01:42 +00006643 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006644 getToolChain().GetFilePath("crtendS.o")));
John McCall8cfb7202013-04-11 22:55:55 +00006645 else
6646 CmdArgs.push_back(Args.MakeArgString(
6647 getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006648 CmdArgs.push_back(Args.MakeArgString(
John McCall8cfb7202013-04-11 22:55:55 +00006649 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006650 }
6651
Bill Wendling3f4be6f2011-06-27 19:15:03 +00006652 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00006653
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006654 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006655 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006656 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006657}
Michael J. Spencerff58e362010-08-21 21:55:07 +00006658
6659void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6660 const InputInfo &Output,
6661 const InputInfoList &Inputs,
6662 const ArgList &Args,
6663 const char *LinkingOutput) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006664 ArgStringList CmdArgs;
6665
6666 if (Output.isFilename()) {
Daniel Dunbare5a37f42010-09-17 00:45:02 +00006667 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6668 Output.getFilename()));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006669 } else {
6670 assert(Output.isNothing() && "Invalid output.");
6671 }
6672
6673 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg746974d2013-08-09 17:38:42 +00006674 !Args.hasArg(options::OPT_nostartfiles) &&
6675 !C.getDriver().IsCLMode()) {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006676 CmdArgs.push_back("-defaultlib:libcmt");
6677 }
6678
6679 CmdArgs.push_back("-nologo");
6680
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00006681 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
6682
6683 if (DLL) {
6684 CmdArgs.push_back(Args.MakeArgString("-dll"));
6685
6686 SmallString<128> ImplibName(Output.getFilename());
6687 llvm::sys::path::replace_extension(ImplibName, "lib");
6688 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
6689 ImplibName.str()));
6690 }
6691
Hans Wennborg3c4da0c2013-08-27 18:10:21 +00006692 if (getToolChain().getDriver().getOrParseSanitizerArgs(Args).needsAsanRt()) {
Hans Wennborg324cc032013-08-28 17:36:07 +00006693 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborg2ddffa12013-08-30 10:50:52 +00006694 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg3c4da0c2013-08-27 18:10:21 +00006695 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00006696 llvm::sys::path::append(LibSanitizer, "lib", "windows");
6697 if (DLL) {
Timur Iskhodzhanove4814132013-09-11 11:45:31 +00006698 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00006699 } else {
6700 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
6701 }
6702 // FIXME: Handle 64-bit.
Hans Wennborg3c4da0c2013-08-27 18:10:21 +00006703 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
6704 }
6705
Michael J. Spencera2284f52012-06-18 16:56:04 +00006706 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg5db95272013-08-13 23:38:57 +00006707 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencera2284f52012-06-18 16:56:04 +00006708
6709 // Add filenames immediately.
6710 for (InputInfoList::const_iterator
6711 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6712 if (it->isFilename())
6713 CmdArgs.push_back(it->getFilename());
Hans Wennborg2388b772013-08-14 01:24:35 +00006714 else
6715 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencera2284f52012-06-18 16:56:04 +00006716 }
Michael J. Spencerff58e362010-08-21 21:55:07 +00006717
6718 const char *Exec =
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006719 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006720 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6721}
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006722
6723void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
6724 const InputInfo &Output,
6725 const InputInfoList &Inputs,
6726 const ArgList &Args,
6727 const char *LinkingOutput) const {
6728 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
6729}
6730
Hans Wennborgdc40bf92013-09-20 18:16:35 +00006731// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
6732// If one cannot be found, return FallbackName.
6733// We do this special search to prevent clang-cl from falling back onto itself
6734// if it's available as cl.exe on the path.
6735static std::string FindFallback(const char *FallbackName,
6736 const char *ClangProgramPath) {
6737 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
6738 if (!OptPath.hasValue())
6739 return FallbackName;
6740
6741#ifdef LLVM_ON_WIN32
6742 const StringRef PathSeparators = ";";
6743#else
6744 const StringRef PathSeparators = ":";
6745#endif
6746
6747 SmallVector<StringRef, 8> PathSegments;
6748 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
6749
6750 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
6751 const StringRef &PathSegment = PathSegments[i];
6752 if (PathSegment.empty())
6753 continue;
6754
6755 SmallString<128> FilePath(PathSegment);
6756 llvm::sys::path::append(FilePath, FallbackName);
6757 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
6758 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
6759 return FilePath.str();
6760 }
6761
6762 return FallbackName;
6763}
6764
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006765Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
6766 const InputInfo &Output,
6767 const InputInfoList &Inputs,
6768 const ArgList &Args,
6769 const char *LinkingOutput) const {
6770 ArgStringList CmdArgs;
Hans Wennborg1413d622013-09-24 17:36:21 +00006771 CmdArgs.push_back("/nologo");
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006772 CmdArgs.push_back("/c"); // Compile only.
6773 CmdArgs.push_back("/W0"); // No warnings.
6774
6775 // The goal is to be able to invoke this tool correctly based on
6776 // any flag accepted by clang-cl.
6777
6778 // These are spelled the same way in clang and cl.exe,.
6779 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
6780 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborga8ffc162013-09-24 18:17:21 +00006781
6782 // Optimization level.
6783 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
6784 if (A->getOption().getID() == options::OPT_O0) {
6785 CmdArgs.push_back("/Od");
6786 } else {
6787 StringRef OptLevel = A->getValue();
6788 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
6789 A->render(Args, CmdArgs);
6790 else if (OptLevel == "3")
6791 CmdArgs.push_back("/Ox");
6792 }
6793 }
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006794
6795 // Flags for which clang-cl have an alias.
6796 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
6797
6798 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
6799 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
6800 : "/GR-");
6801 if (Args.hasArg(options::OPT_fsyntax_only))
6802 CmdArgs.push_back("/Zs");
6803
Hans Wennborg4fe475a2013-09-27 17:54:18 +00006804 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
6805 for (size_t I = 0, E = Includes.size(); I != E; ++I)
6806 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
6807
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006808 // Flags that can simply be passed through.
6809 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
6810 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
6811
6812 // The order of these flags is relevant, so pick the last one.
6813 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
6814 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
6815 A->render(Args, CmdArgs);
6816
6817
6818 // Input filename.
6819 assert(Inputs.size() == 1);
6820 const InputInfo &II = Inputs[0];
6821 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
6822 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
6823 if (II.isFilename())
6824 CmdArgs.push_back(II.getFilename());
6825 else
6826 II.getInputArg().renderAsInput(Args, CmdArgs);
6827
6828 // Output filename.
6829 assert(Output.getType() == types::TY_Object);
6830 const char *Fo = Args.MakeArgString(std::string("/Fo") +
6831 Output.getFilename());
6832 CmdArgs.push_back(Fo);
6833
Hans Wennborgdc40bf92013-09-20 18:16:35 +00006834 const Driver &D = getToolChain().getDriver();
6835 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006836
Hans Wennborgdc40bf92013-09-20 18:16:35 +00006837 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006838}
Robert Lytton4e490e22013-10-11 10:29:40 +00006839
6840
6841/// XCore Tools
6842// We pass assemble and link construction to the xcc tool.
6843
6844void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6845 const InputInfo &Output,
6846 const InputInfoList &Inputs,
6847 const ArgList &Args,
6848 const char *LinkingOutput) const {
6849 ArgStringList CmdArgs;
6850
6851 CmdArgs.push_back("-o");
6852 CmdArgs.push_back(Output.getFilename());
6853
6854 CmdArgs.push_back("-c");
6855
6856 if (Args.hasArg(options::OPT_g_Group)) {
6857 CmdArgs.push_back("-g");
6858 }
6859
6860 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6861 options::OPT_Xassembler);
6862
6863 for (InputInfoList::const_iterator
6864 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6865 const InputInfo &II = *it;
6866 CmdArgs.push_back(II.getFilename());
6867 }
6868
6869 const char *Exec =
6870 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6871 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6872}
6873
6874void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
6875 const InputInfo &Output,
6876 const InputInfoList &Inputs,
6877 const ArgList &Args,
6878 const char *LinkingOutput) const {
6879 ArgStringList CmdArgs;
6880
6881 if (Output.isFilename()) {
6882 CmdArgs.push_back("-o");
6883 CmdArgs.push_back(Output.getFilename());
6884 } else {
6885 assert(Output.isNothing() && "Invalid output.");
6886 }
6887
6888 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6889
6890 const char *Exec =
6891 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6892 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6893}