blob: 2294688bdfe5464f2426225c17cb5686de87a286 [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");
Joey Goulycbed3bf2013-06-27 13:19:54 +0000648 } else if (FPU == "neon-fp-armv8") {
Joey Gouly2b33b7e2013-09-13 13:48:33 +0000649 Features.push_back("+fp-armv8");
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000650 Features.push_back("+neon");
Amara Emersoncdc532c2013-09-19 13:54:03 +0000651 } else if (FPU == "crypto-neon-fp-armv8") {
652 Features.push_back("+crypto");
653 Features.push_back("+fp-armv8");
Chad Rosier99317272012-04-04 20:51:35 +0000654 } else if (FPU == "neon") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000655 Features.push_back("+neon");
Amara Emersonfe7ed042013-10-01 10:20:54 +0000656 } else if (FPU == "none") {
657 Features.push_back("-vfp2");
658 Features.push_back("-vfp3");
659 Features.push_back("-vfp4");
660 Features.push_back("-fp-armv8");
661 Features.push_back("-crypto");
662 Features.push_back("-neon");
Chad Rosier99317272012-04-04 20:51:35 +0000663 } else
664 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
665}
666
Anton Korobeynikove2571792012-04-09 13:38:30 +0000667// Select the float ABI as determined by -msoft-float, -mhard-float, and
668// -mfloat-abi=.
669static StringRef getARMFloatABI(const Driver &D,
670 const ArgList &Args,
671 const llvm::Triple &Triple) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000672 StringRef FloatABI;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000673 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
674 options::OPT_mhard_float,
675 options::OPT_mfloat_abi_EQ)) {
676 if (A->getOption().matches(options::OPT_msoft_float))
677 FloatABI = "soft";
678 else if (A->getOption().matches(options::OPT_mhard_float))
679 FloatABI = "hard";
680 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000681 FloatABI = A->getValue();
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000682 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000683 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000684 << A->getAsString(Args);
685 FloatABI = "soft";
686 }
687 }
688 }
689
690 // If unspecified, choose the default based on the platform.
691 if (FloatABI.empty()) {
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000692 switch (Triple.getOS()) {
Bob Wilson905c45f2011-10-14 05:03:44 +0000693 case llvm::Triple::Darwin:
694 case llvm::Triple::MacOSX:
695 case llvm::Triple::IOS: {
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000696 // Darwin defaults to "softfp" for v6 and v7.
697 //
698 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000699 std::string ArchName =
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000700 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000701 if (StringRef(ArchName).startswith("v6") ||
702 StringRef(ArchName).startswith("v7"))
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000703 FloatABI = "softfp";
704 else
705 FloatABI = "soft";
706 break;
707 }
708
Rafael Espindola27fa2362012-12-13 04:17:14 +0000709 case llvm::Triple::FreeBSD:
710 // FreeBSD defaults to soft float
711 FloatABI = "soft";
712 break;
713
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000714 default:
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000715 switch(Triple.getEnvironment()) {
Jiangning Liuff104a12012-07-31 08:06:29 +0000716 case llvm::Triple::GNUEABIHF:
717 FloatABI = "hard";
718 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000719 case llvm::Triple::GNUEABI:
720 FloatABI = "softfp";
721 break;
722 case llvm::Triple::EABI:
723 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
724 FloatABI = "softfp";
725 break;
Logan Chien94a71422012-09-02 09:30:11 +0000726 case llvm::Triple::Android: {
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000727 std::string ArchName =
Chandler Carruthb43550b2012-01-10 19:47:42 +0000728 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000729 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthb43550b2012-01-10 19:47:42 +0000730 FloatABI = "softfp";
731 else
732 FloatABI = "soft";
733 break;
734 }
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000735 default:
736 // Assume "soft", but warn the user we are guessing.
737 FloatABI = "soft";
Chris Lattner5f9e2722011-07-23 10:55:15 +0000738 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000739 break;
740 }
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000741 }
742 }
743
Anton Korobeynikove2571792012-04-09 13:38:30 +0000744 return FloatABI;
745}
746
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000747static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
748 const ArgList &Args,
749 std::vector<const char *> &Features) {
750 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
751 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
752 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
753 // stripped out by the ARM target.
754 // Use software floating point operations?
755 if (FloatABI == "soft")
756 Features.push_back("+soft-float");
757
758 // Use software floating point argument passing?
759 if (FloatABI != "hard")
760 Features.push_back("+soft-float-abi");
761
762 // Honor -mfpu=.
763 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emersonfe7ed042013-10-01 10:20:54 +0000764 getARMFPUFeatures(D, A, Args, Features);
Silviu Baranga1db2e272013-10-21 10:54:53 +0000765 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
766 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000767
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000768 // Setting -msoft-float effectively disables NEON because of the GCC
769 // implementation, although the same isn't true of VFP or VFP3.
770 if (FloatABI == "soft")
771 Features.push_back("-neon");
772}
Anton Korobeynikove2571792012-04-09 13:38:30 +0000773
774void Clang::AddARMTargetArgs(const ArgList &Args,
775 ArgStringList &CmdArgs,
776 bool KernelOrKext) const {
777 const Driver &D = getToolChain().getDriver();
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000778 // Get the effective triple, which takes into account the deployment target.
779 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
780 llvm::Triple Triple(TripleStr);
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000781 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikove2571792012-04-09 13:38:30 +0000782
783 // Select the ABI to use.
784 //
785 // FIXME: Support -meabi.
786 const char *ABIName = 0;
787 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000788 ABIName = A->getValue();
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000789 } else if (Triple.isOSDarwin()) {
790 // The backend is hardwired to assume AAPCS for M-class processors, ensure
791 // the frontend matches that.
Tim Northoverfc1a75b2013-10-03 14:23:28 +0000792 if (Triple.getEnvironment() == llvm::Triple::EABI ||
793 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000794 ABIName = "aapcs";
795 } else {
796 ABIName = "apcs-gnu";
797 }
Anton Korobeynikove2571792012-04-09 13:38:30 +0000798 } else {
799 // Select the default based on the platform.
800 switch(Triple.getEnvironment()) {
Logan Chien94a71422012-09-02 09:30:11 +0000801 case llvm::Triple::Android:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000802 case llvm::Triple::GNUEABI:
Jiangning Liuff104a12012-07-31 08:06:29 +0000803 case llvm::Triple::GNUEABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000804 ABIName = "aapcs-linux";
805 break;
806 case llvm::Triple::EABI:
807 ABIName = "aapcs";
808 break;
809 default:
810 ABIName = "apcs-gnu";
811 }
812 }
813 CmdArgs.push_back("-target-abi");
814 CmdArgs.push_back(ABIName);
815
Anton Korobeynikove2571792012-04-09 13:38:30 +0000816 // Determine floating point ABI from the options & target defaults.
817 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000818 if (FloatABI == "soft") {
819 // Floating point operations and argument passing are soft.
820 //
821 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbar3b315262009-11-30 08:42:00 +0000822 CmdArgs.push_back("-msoft-float");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000823 CmdArgs.push_back("-mfloat-abi");
824 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000825 } else if (FloatABI == "softfp") {
826 // Floating point operations are hard, but argument passing is soft.
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 {
830 // Floating point operations and argument passing are hard.
831 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000832 CmdArgs.push_back("-mfloat-abi");
833 CmdArgs.push_back("hard");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000834 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +0000835
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000836 // Kernel code has more strict alignment requirements.
837 if (KernelOrKext) {
Cameron Esfahani57b1da12013-09-14 01:09:11 +0000838 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000839 CmdArgs.push_back("-backend-option");
840 CmdArgs.push_back("-arm-long-calls");
841 }
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000842
Daniel Dunbar3c66d302011-03-22 16:48:17 +0000843 CmdArgs.push_back("-backend-option");
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000844 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000845
846 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000847 CmdArgs.push_back("-backend-option");
Renato Golinebc313d2013-08-15 20:54:45 +0000848 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000849 }
Chad Rosier1b906052011-08-26 00:26:29 +0000850
851 // Setting -mno-global-merge disables the codegen global merge pass. Setting
852 // -mglobal-merge has no effect as the pass is enabled by default.
853 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
854 options::OPT_mno_global_merge)) {
855 if (A->getOption().matches(options::OPT_mno_global_merge))
856 CmdArgs.push_back("-mno-global-merge");
857 }
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000858
Bob Wilsonf6f77bd2013-04-11 18:53:25 +0000859 if (!Args.hasFlag(options::OPT_mimplicit_float,
860 options::OPT_mno_implicit_float,
861 true))
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000862 CmdArgs.push_back("-no-implicit-float");
Renato Golin45bd2942013-08-24 14:44:35 +0000863
864 // llvm does not support reserving registers in general. There is support
865 // for reserving r9 on ARM though (defined as a platform-specific register
866 // in ARM EABI).
867 if (Args.hasArg(options::OPT_ffixed_r9)) {
868 CmdArgs.push_back("-backend-option");
869 CmdArgs.push_back("-arm-reserve-r9");
870 }
Daniel Dunbarb163ef72009-09-10 04:57:17 +0000871}
872
Simon Atanasyana2768be2012-04-07 22:09:23 +0000873// Get CPU and ABI names. They are not independent
874// so we have to calculate them together.
875static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindolab330e402013-08-20 22:12:08 +0000876 const llvm::Triple &Triple,
Simon Atanasyana2768be2012-04-07 22:09:23 +0000877 StringRef &CPUName,
878 StringRef &ABIName) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000879 const char *DefMips32CPU = "mips32";
880 const char *DefMips64CPU = "mips64";
Akira Hatanaka9f360622011-09-26 21:07:52 +0000881
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000882 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan66751bc2013-10-09 12:12:24 +0000883 options::OPT_mcpu_EQ))
884 CPUName = A->getValue();
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000885
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +0000886 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000887 ABIName = A->getValue();
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +0000888 // Convert a GNU style Mips ABI name to the name
889 // accepted by LLVM Mips backend.
890 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
891 .Case("32", "o32")
892 .Case("64", "n64")
893 .Default(ABIName);
894 }
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000895
896 // Setup default CPU and ABI names.
897 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindolab330e402013-08-20 22:12:08 +0000898 switch (Triple.getArch()) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000899 default:
900 llvm_unreachable("Unexpected triple arch name");
901 case llvm::Triple::mips:
902 case llvm::Triple::mipsel:
903 CPUName = DefMips32CPU;
904 break;
905 case llvm::Triple::mips64:
906 case llvm::Triple::mips64el:
907 CPUName = DefMips64CPU;
908 break;
909 }
910 }
911
912 if (!ABIName.empty()) {
913 // Deduce CPU name from ABI name.
914 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyane9616a42013-02-27 14:55:49 +0000915 .Cases("32", "o32", "eabi", DefMips32CPU)
916 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000917 .Default("");
918 }
919 else if (!CPUName.empty()) {
920 // Deduce ABI name from CPU name.
921 ABIName = llvm::StringSwitch<const char *>(CPUName)
922 .Cases("mips32", "mips32r2", "o32")
923 .Cases("mips64", "mips64r2", "n64")
924 .Default("");
925 }
926
927 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyana2768be2012-04-07 22:09:23 +0000928}
929
Simon Atanasyane9616a42013-02-27 14:55:49 +0000930// Convert ABI name to the GNU tools acceptable variant.
931static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
932 return llvm::StringSwitch<llvm::StringRef>(ABI)
933 .Case("o32", "32")
934 .Case("n64", "64")
935 .Default(ABI);
936}
937
Simon Atanasyan5e627792012-06-02 15:06:29 +0000938// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
939// and -mfloat-abi=.
940static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000941 StringRef FloatABI;
Eric Christophered734732010-03-02 02:41:08 +0000942 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000943 options::OPT_mhard_float,
944 options::OPT_mfloat_abi_EQ)) {
Eric Christophered734732010-03-02 02:41:08 +0000945 if (A->getOption().matches(options::OPT_msoft_float))
946 FloatABI = "soft";
947 else if (A->getOption().matches(options::OPT_mhard_float))
948 FloatABI = "hard";
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000949 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000950 FloatABI = A->getValue();
Simon Atanasyan2ed42b82013-04-14 08:37:15 +0000951 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan5e627792012-06-02 15:06:29 +0000952 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000953 FloatABI = "hard";
954 }
955 }
Eric Christophered734732010-03-02 02:41:08 +0000956 }
957
958 // If unspecified, choose the default based on the platform.
959 if (FloatABI.empty()) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000960 // Assume "hard", because it's a default value used by gcc.
961 // When we start to recognize specific target MIPS processors,
962 // we will be able to select the default more correctly.
963 FloatABI = "hard";
Eric Christophered734732010-03-02 02:41:08 +0000964 }
965
Simon Atanasyan5e627792012-06-02 15:06:29 +0000966 return FloatABI;
967}
968
Simon Atanasyandc536f52012-07-05 18:51:43 +0000969static void AddTargetFeature(const ArgList &Args,
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000970 std::vector<const char *> &Features,
971 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyandc536f52012-07-05 18:51:43 +0000972 StringRef FeatureName) {
973 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyandc536f52012-07-05 18:51:43 +0000974 if (A->getOption().matches(OnOpt))
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000975 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyandc536f52012-07-05 18:51:43 +0000976 else
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000977 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyandc536f52012-07-05 18:51:43 +0000978 }
979}
980
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000981static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
982 std::vector<const char *> &Features) {
983 StringRef FloatABI = getMipsFloatABI(D, Args);
984 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
985 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
986 // FIXME: Note, this is a hack. We need to pass the selected float
987 // mode to the MipsTargetInfoBase to define appropriate macros there.
988 // Now it is the only method.
989 Features.push_back("+soft-float");
990 }
991
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +0000992 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
993 if (StringRef(A->getValue()) == "2008")
994 Features.push_back("+nan2008");
995 }
996
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000997 AddTargetFeature(Args, Features, options::OPT_msingle_float,
998 options::OPT_mdouble_float, "single-float");
999 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1000 "mips16");
1001 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1002 options::OPT_mno_micromips, "micromips");
1003 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1004 "dsp");
1005 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1006 "dspr2");
1007 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1008 "msa");
Daniel Sandersaf7ed9e2013-10-17 14:55:58 +00001009 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
1010 "fp64");
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001011}
1012
Simon Atanasyan5e627792012-06-02 15:06:29 +00001013void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyana8141612013-04-14 14:07:41 +00001014 ArgStringList &CmdArgs) const {
Simon Atanasyan5e627792012-06-02 15:06:29 +00001015 const Driver &D = getToolChain().getDriver();
1016 StringRef CPUName;
1017 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00001018 const llvm::Triple &Triple = getToolChain().getTriple();
1019 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan5e627792012-06-02 15:06:29 +00001020
1021 CmdArgs.push_back("-target-abi");
1022 CmdArgs.push_back(ABIName.data());
1023
1024 StringRef FloatABI = getMipsFloatABI(D, Args);
1025
Simon Atanasyane1d792f2013-01-10 12:36:19 +00001026 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
1027
1028 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christophered734732010-03-02 02:41:08 +00001029 // Floating point operations and argument passing are soft.
Eric Christophered734732010-03-02 02:41:08 +00001030 CmdArgs.push_back("-msoft-float");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001031 CmdArgs.push_back("-mfloat-abi");
1032 CmdArgs.push_back("soft");
1033
Simon Atanasyane1d792f2013-01-10 12:36:19 +00001034 if (FloatABI == "hard" && IsMips16) {
1035 CmdArgs.push_back("-mllvm");
1036 CmdArgs.push_back("-mips16-hard-float");
1037 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001038 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001039 else {
1040 // Floating point operations and argument passing are hard.
Eric Christophered734732010-03-02 02:41:08 +00001041 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001042 CmdArgs.push_back("-mfloat-abi");
1043 CmdArgs.push_back("hard");
Eric Christophered734732010-03-02 02:41:08 +00001044 }
Simon Atanasyan0b273ef2012-07-05 14:19:39 +00001045
Simon Atanasyanbda07ac2012-12-01 18:27:21 +00001046 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1047 if (A->getOption().matches(options::OPT_mxgot)) {
1048 CmdArgs.push_back("-mllvm");
1049 CmdArgs.push_back("-mxgot");
1050 }
1051 }
1052
Simon Atanasyan6bdc4c62013-05-11 06:33:44 +00001053 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1054 options::OPT_mno_ldc1_sdc1)) {
1055 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1056 CmdArgs.push_back("-mllvm");
1057 CmdArgs.push_back("-mno-ldc1-sdc1");
1058 }
1059 }
1060
Akira Hatanakacdbc3b32013-07-19 18:58:48 +00001061 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1062 options::OPT_mno_check_zero_division)) {
1063 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1064 CmdArgs.push_back("-mllvm");
1065 CmdArgs.push_back("-mno-check-zero-division");
1066 }
1067 }
1068
Simon Atanasyan9804b762012-08-27 20:55:56 +00001069 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001070 StringRef v = A->getValue();
Simon Atanasyan9804b762012-08-27 20:55:56 +00001071 CmdArgs.push_back("-mllvm");
1072 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1073 A->claim();
1074 }
Eric Christophered734732010-03-02 02:41:08 +00001075}
1076
Hal Finkel02a84272012-06-11 22:35:19 +00001077/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1078static std::string getPPCTargetCPU(const ArgList &Args) {
1079 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001080 StringRef CPUName = A->getValue();
Hal Finkel02a84272012-06-11 22:35:19 +00001081
1082 if (CPUName == "native") {
1083 std::string CPU = llvm::sys::getHostCPUName();
1084 if (!CPU.empty() && CPU != "generic")
1085 return CPU;
1086 else
1087 return "";
1088 }
1089
1090 return llvm::StringSwitch<const char *>(CPUName)
1091 .Case("common", "generic")
1092 .Case("440", "440")
1093 .Case("440fp", "440")
1094 .Case("450", "450")
1095 .Case("601", "601")
1096 .Case("602", "602")
1097 .Case("603", "603")
1098 .Case("603e", "603e")
1099 .Case("603ev", "603ev")
1100 .Case("604", "604")
1101 .Case("604e", "604e")
1102 .Case("620", "620")
Bill Schmidt2821e182013-02-01 20:23:10 +00001103 .Case("630", "pwr3")
Hal Finkel02a84272012-06-11 22:35:19 +00001104 .Case("G3", "g3")
1105 .Case("7400", "7400")
1106 .Case("G4", "g4")
1107 .Case("7450", "7450")
1108 .Case("G4+", "g4+")
1109 .Case("750", "750")
1110 .Case("970", "970")
1111 .Case("G5", "g5")
1112 .Case("a2", "a2")
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001113 .Case("a2q", "a2q")
Hal Finkel7de32962012-09-18 22:25:03 +00001114 .Case("e500mc", "e500mc")
1115 .Case("e5500", "e5500")
Bill Schmidt2821e182013-02-01 20:23:10 +00001116 .Case("power3", "pwr3")
1117 .Case("power4", "pwr4")
1118 .Case("power5", "pwr5")
1119 .Case("power5x", "pwr5x")
Hal Finkel02a84272012-06-11 22:35:19 +00001120 .Case("power6", "pwr6")
Bill Schmidt2821e182013-02-01 20:23:10 +00001121 .Case("power6x", "pwr6x")
Hal Finkel02a84272012-06-11 22:35:19 +00001122 .Case("power7", "pwr7")
Bill Schmidt2821e182013-02-01 20:23:10 +00001123 .Case("pwr3", "pwr3")
1124 .Case("pwr4", "pwr4")
1125 .Case("pwr5", "pwr5")
1126 .Case("pwr5x", "pwr5x")
1127 .Case("pwr6", "pwr6")
1128 .Case("pwr6x", "pwr6x")
1129 .Case("pwr7", "pwr7")
Hal Finkel02a84272012-06-11 22:35:19 +00001130 .Case("powerpc", "ppc")
1131 .Case("powerpc64", "ppc64")
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001132 .Case("powerpc64le", "ppc64le")
Hal Finkel02a84272012-06-11 22:35:19 +00001133 .Default("");
1134 }
1135
1136 return "";
1137}
1138
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001139static void getPPCTargetFeatures(const ArgList &Args,
1140 std::vector<const char *> &Features) {
Eric Christopherd5e59fc2013-10-16 20:40:08 +00001141 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1142 ie = Args.filtered_end();
1143 it != ie; ++it) {
1144 StringRef Name = (*it)->getOption().getName();
1145 (*it)->claim();
1146
1147 // Skip over "-m".
1148 assert(Name.startswith("m") && "Invalid feature name.");
1149 Name = Name.substr(1);
1150
1151 bool IsNegative = Name.startswith("no-");
1152 if (IsNegative)
1153 Name = Name.substr(3);
1154
1155 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1156 // pass the correct option to the backend while calling the frontend
1157 // option the same.
1158 // TODO: Change the LLVM backend option maybe?
1159 if (Name == "mfcrf")
1160 Name = "mfocrf";
1161
1162 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1163 }
1164
1165 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001166 AddTargetFeature(Args, Features, options::OPT_faltivec,
1167 options::OPT_fno_altivec, "altivec");
Hal Finkel02a84272012-06-11 22:35:19 +00001168}
1169
Tom Stellarde25d2f62013-04-01 20:56:53 +00001170/// Get the (LLVM) name of the R600 gpu we are targeting.
1171static std::string getR600TargetGPU(const ArgList &Args) {
1172 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001173 const char *GPUName = A->getValue();
Tom Stellarde25d2f62013-04-01 20:56:53 +00001174 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardfd4aa4b2013-05-06 16:12:05 +00001175 .Cases("rv630", "rv635", "r600")
1176 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellarde25d2f62013-04-01 20:56:53 +00001177 .Case("rv740", "rv770")
1178 .Case("palm", "cedar")
Tom Stellardfd4aa4b2013-05-06 16:12:05 +00001179 .Cases("sumo", "sumo2", "sumo")
Tom Stellarde25d2f62013-04-01 20:56:53 +00001180 .Case("hemlock", "cypress")
1181 .Case("aruba", "cayman")
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001182 .Default(GPUName);
Tom Stellarde25d2f62013-04-01 20:56:53 +00001183 }
1184 return "";
1185}
1186
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001187static void getSparcTargetFeatures(const ArgList &Args,
1188 std::vector<const char *> Features) {
1189 bool SoftFloatABI = true;
1190 if (Arg *A =
1191 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1192 if (A->getOption().matches(options::OPT_mhard_float))
1193 SoftFloatABI = false;
1194 }
1195 if (SoftFloatABI)
1196 Features.push_back("+soft-float");
1197}
1198
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001199void Clang::AddSparcTargetArgs(const ArgList &Args,
1200 ArgStringList &CmdArgs) const {
1201 const Driver &D = getToolChain().getDriver();
1202
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001203 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner5f9e2722011-07-23 10:55:15 +00001204 StringRef FloatABI;
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001205 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1206 options::OPT_mhard_float)) {
1207 if (A->getOption().matches(options::OPT_msoft_float))
1208 FloatABI = "soft";
1209 else if (A->getOption().matches(options::OPT_mhard_float))
1210 FloatABI = "hard";
1211 }
1212
1213 // If unspecified, choose the default based on the platform.
1214 if (FloatABI.empty()) {
Aaron Ballmand58915e2013-07-15 13:41:33 +00001215 // Assume "soft", but warn the user we are guessing.
1216 FloatABI = "soft";
1217 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001218 }
1219
1220 if (FloatABI == "soft") {
1221 // Floating point operations and argument passing are soft.
1222 //
1223 // FIXME: This changes CPP defines, we need -target-soft-float.
1224 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001225 } else {
1226 assert(FloatABI == "hard" && "Invalid float abi!");
1227 CmdArgs.push_back("-mhard-float");
1228 }
1229}
1230
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00001231static const char *getSystemZTargetCPU(const ArgList &Args) {
1232 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1233 return A->getValue();
1234 return "z10";
1235}
1236
Chandler Carruth700d4e42013-01-13 11:46:33 +00001237static const char *getX86TargetCPU(const ArgList &Args,
1238 const llvm::Triple &Triple) {
1239 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1240 if (StringRef(A->getValue()) != "native")
1241 return A->getValue();
1242
1243 // FIXME: Reject attempts to use -march=native unless the target matches
1244 // the host.
1245 //
1246 // FIXME: We should also incorporate the detected target features for use
1247 // with -native.
1248 std::string CPU = llvm::sys::getHostCPUName();
1249 if (!CPU.empty() && CPU != "generic")
1250 return Args.MakeArgString(CPU);
1251 }
1252
1253 // Select the default CPU if none was given (or detection failed).
1254
1255 if (Triple.getArch() != llvm::Triple::x86_64 &&
1256 Triple.getArch() != llvm::Triple::x86)
1257 return 0; // This routine is only handling x86 targets.
1258
1259 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1260
1261 // FIXME: Need target hooks.
1262 if (Triple.isOSDarwin())
1263 return Is64Bit ? "core2" : "yonah";
1264
Chandler Carruth700d4e42013-01-13 11:46:33 +00001265 // All x86 devices running Android have core2 as their common
1266 // denominator. This makes a better choice than pentium4.
1267 if (Triple.getEnvironment() == llvm::Triple::Android)
1268 return "core2";
1269
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001270 // Everything else goes to x86-64 in 64-bit mode.
1271 if (Is64Bit)
1272 return "x86-64";
1273
1274 switch (Triple.getOS()) {
1275 case llvm::Triple::FreeBSD:
1276 case llvm::Triple::NetBSD:
1277 case llvm::Triple::OpenBSD:
1278 return "i486";
1279 case llvm::Triple::Haiku:
1280 return "i586";
1281 case llvm::Triple::Bitrig:
1282 return "i686";
1283 default:
1284 // Fallback to p4.
1285 return "pentium4";
1286 }
Chandler Carruth700d4e42013-01-13 11:46:33 +00001287}
1288
Rafael Espindolab330e402013-08-20 22:12:08 +00001289static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1290 switch(T.getArch()) {
1291 default:
1292 return "";
1293
1294 case llvm::Triple::arm:
1295 case llvm::Triple::thumb:
1296 return getARMTargetCPU(Args, T);
1297
1298 case llvm::Triple::mips:
1299 case llvm::Triple::mipsel:
1300 case llvm::Triple::mips64:
1301 case llvm::Triple::mips64el: {
1302 StringRef CPUName;
1303 StringRef ABIName;
1304 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1305 return CPUName;
1306 }
1307
1308 case llvm::Triple::ppc:
1309 case llvm::Triple::ppc64:
1310 case llvm::Triple::ppc64le: {
1311 std::string TargetCPUName = getPPCTargetCPU(Args);
1312 // LLVM may default to generating code for the native CPU,
1313 // but, like gcc, we default to a more generic option for
1314 // each architecture. (except on Darwin)
1315 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1316 if (T.getArch() == llvm::Triple::ppc64)
1317 TargetCPUName = "ppc64";
1318 else if (T.getArch() == llvm::Triple::ppc64le)
1319 TargetCPUName = "ppc64le";
1320 else
1321 TargetCPUName = "ppc";
1322 }
1323 return TargetCPUName;
1324 }
1325
1326 case llvm::Triple::sparc:
1327 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1328 return A->getValue();
1329 return "";
1330
1331 case llvm::Triple::x86:
1332 case llvm::Triple::x86_64:
1333 return getX86TargetCPU(Args, T);
1334
1335 case llvm::Triple::hexagon:
1336 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1337
1338 case llvm::Triple::systemz:
1339 return getSystemZTargetCPU(Args);
1340
1341 case llvm::Triple::r600:
1342 return getR600TargetGPU(Args);
1343 }
1344}
1345
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001346static void getX86TargetFeatures(const ArgList &Args,
1347 std::vector<const char *> &Features) {
1348 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1349 ie = Args.filtered_end();
1350 it != ie; ++it) {
1351 StringRef Name = (*it)->getOption().getName();
1352 (*it)->claim();
1353
1354 // Skip over "-m".
1355 assert(Name.startswith("m") && "Invalid feature name.");
1356 Name = Name.substr(1);
1357
1358 bool IsNegative = Name.startswith("no-");
1359 if (IsNegative)
1360 Name = Name.substr(3);
1361
1362 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1363 }
1364}
1365
Daniel Dunbar6acda162009-09-09 22:33:08 +00001366void Clang::AddX86TargetArgs(const ArgList &Args,
1367 ArgStringList &CmdArgs) const {
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001368 if (!Args.hasFlag(options::OPT_mred_zone,
1369 options::OPT_mno_red_zone,
1370 true) ||
1371 Args.hasArg(options::OPT_mkernel) ||
1372 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar66861e02009-11-20 22:21:36 +00001373 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001374
Bob Wilsonf0c54562013-02-10 16:01:41 +00001375 // Default to avoid implicit floating-point for kernel/kext code, but allow
1376 // that to be overridden with -mno-soft-float.
1377 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1378 Args.hasArg(options::OPT_fapple_kext));
1379 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1380 options::OPT_mno_soft_float,
Bob Wilsonf6f77bd2013-04-11 18:53:25 +00001381 options::OPT_mimplicit_float,
Bob Wilsonf0c54562013-02-10 16:01:41 +00001382 options::OPT_mno_implicit_float)) {
1383 const Option &O = A->getOption();
1384 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1385 O.matches(options::OPT_msoft_float));
1386 }
1387 if (NoImplicitFloat)
Daniel Dunbar66861e02009-11-20 22:21:36 +00001388 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar6acda162009-09-09 22:33:08 +00001389}
1390
Matthew Curtis33c95f12012-12-06 17:49:03 +00001391static inline bool HasPICArg(const ArgList &Args) {
1392 return Args.hasArg(options::OPT_fPIC)
1393 || Args.hasArg(options::OPT_fpic);
1394}
1395
1396static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1397 return Args.getLastArg(options::OPT_G,
1398 options::OPT_G_EQ,
1399 options::OPT_msmall_data_threshold_EQ);
1400}
1401
1402static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1403 std::string value;
1404 if (HasPICArg(Args))
1405 value = "0";
1406 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1407 value = A->getValue();
1408 A->claim();
1409 }
1410 return value;
1411}
1412
Tony Linthicum96319392011-12-12 21:14:55 +00001413void Clang::AddHexagonTargetArgs(const ArgList &Args,
1414 ArgStringList &CmdArgs) const {
Tony Linthicum96319392011-12-12 21:14:55 +00001415 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis1dbaef52012-12-07 13:52:44 +00001416 CmdArgs.push_back("-mqdsp6-compat");
1417 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum96319392011-12-12 21:14:55 +00001418
Matthew Curtis33c95f12012-12-06 17:49:03 +00001419 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1420 if (!SmallDataThreshold.empty()) {
Tony Linthicum96319392011-12-12 21:14:55 +00001421 CmdArgs.push_back ("-mllvm");
Matthew Curtis33c95f12012-12-06 17:49:03 +00001422 CmdArgs.push_back(Args.MakeArgString(
1423 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00001424 }
1425
Sirish Pande5f9688b2012-05-10 20:19:54 +00001426 if (!Args.hasArg(options::OPT_fno_short_enums))
1427 CmdArgs.push_back("-fshort-enums");
1428 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1429 CmdArgs.push_back ("-mllvm");
1430 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1431 }
Tony Linthicum96319392011-12-12 21:14:55 +00001432 CmdArgs.push_back ("-mllvm");
1433 CmdArgs.push_back ("-machine-sink-split=0");
1434}
1435
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001436static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1437 std::vector<const char *> &Features) {
Tim Northoverb793f0d2013-08-01 09:23:19 +00001438 // Honor -mfpu=.
1439 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emersonfe7ed042013-10-01 10:20:54 +00001440 getAArch64FPUFeatures(D, A, Args, Features);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001441}
1442
1443static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1444 const ArgList &Args, ArgStringList &CmdArgs) {
1445 std::vector<const char *> Features;
1446 switch (Triple.getArch()) {
1447 default:
1448 break;
1449 case llvm::Triple::mips:
1450 case llvm::Triple::mipsel:
1451 case llvm::Triple::mips64:
1452 case llvm::Triple::mips64el:
1453 getMIPSTargetFeatures(D, Args, Features);
1454 break;
1455
1456 case llvm::Triple::arm:
1457 case llvm::Triple::thumb:
1458 getARMTargetFeatures(D, Triple, Args, Features);
1459 break;
1460
1461 case llvm::Triple::ppc:
1462 case llvm::Triple::ppc64:
1463 case llvm::Triple::ppc64le:
1464 getPPCTargetFeatures(Args, Features);
1465 break;
1466 case llvm::Triple::sparc:
1467 getSparcTargetFeatures(Args, Features);
1468 break;
1469 case llvm::Triple::aarch64:
1470 getAArch64TargetFeatures(D, Args, Features);
1471 break;
1472 case llvm::Triple::x86:
1473 case llvm::Triple::x86_64:
1474 getX86TargetFeatures(Args, Features);
1475 break;
1476 }
Rafael Espindolabc1e5452013-08-21 17:34:32 +00001477
1478 // Find the last of each feature.
1479 llvm::StringMap<unsigned> LastOpt;
1480 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1481 const char *Name = Features[I];
1482 assert(Name[0] == '-' || Name[0] == '+');
1483 LastOpt[Name + 1] = I;
1484 }
1485
1486 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1487 // If this feature was overridden, ignore it.
1488 const char *Name = Features[I];
1489 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1490 assert(LastI != LastOpt.end());
1491 unsigned Last = LastI->second;
1492 if (Last != I)
1493 continue;
1494
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001495 CmdArgs.push_back("-target-feature");
Rafael Espindolabc1e5452013-08-21 17:34:32 +00001496 CmdArgs.push_back(Name);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001497 }
Tim Northoverb793f0d2013-08-01 09:23:19 +00001498}
1499
Eric Christopher88b7cf02011-08-19 00:30:14 +00001500static bool
John McCall260611a2012-06-20 06:18:46 +00001501shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson525544d2011-02-28 00:44:51 +00001502 const llvm::Triple &Triple) {
1503 // We use the zero-cost exception tables for Objective-C if the non-fragile
1504 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1505 // later.
John McCall260611a2012-06-20 06:18:46 +00001506 if (runtime.isNonFragile())
Anders Carlsson525544d2011-02-28 00:44:51 +00001507 return true;
1508
Bob Wilson905c45f2011-10-14 05:03:44 +00001509 if (!Triple.isOSDarwin())
Anders Carlsson525544d2011-02-28 00:44:51 +00001510 return false;
1511
Eric Christopheraa7333c2011-07-02 00:20:22 +00001512 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson525544d2011-02-28 00:44:51 +00001513 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher88b7cf02011-08-19 00:30:14 +00001514 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson525544d2011-02-28 00:44:51 +00001515}
1516
Anders Carlsson15348ae2011-02-28 02:27:16 +00001517/// addExceptionArgs - Adds exception related arguments to the driver command
1518/// arguments. There's a master flag, -fexceptions and also language specific
1519/// flags to enable/disable C++ and Objective-C exceptions.
1520/// This makes it possible to for example disable C++ exceptions but enable
1521/// Objective-C exceptions.
1522static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1523 const llvm::Triple &Triple,
Fariborz Jahanian15b77312012-04-04 18:28:00 +00001524 bool KernelOrKext,
John McCall260611a2012-06-20 06:18:46 +00001525 const ObjCRuntime &objcRuntime,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001526 ArgStringList &CmdArgs) {
Chad Rosierafc4baa2012-03-26 22:04:46 +00001527 if (KernelOrKext) {
1528 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1529 // arguments now to avoid warnings about unused arguments.
1530 Args.ClaimAllArgs(options::OPT_fexceptions);
1531 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1532 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1533 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1534 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1535 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001536 return;
Chad Rosierafc4baa2012-03-26 22:04:46 +00001537 }
Anders Carlsson15348ae2011-02-28 02:27:16 +00001538
1539 // Exceptions are enabled by default.
1540 bool ExceptionsEnabled = true;
1541
1542 // This keeps track of whether exceptions were explicitly turned on or off.
1543 bool DidHaveExplicitExceptionFlag = false;
1544
Rafael Espindolaf759df02009-10-01 13:33:33 +00001545 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1546 options::OPT_fno_exceptions)) {
1547 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001548 ExceptionsEnabled = true;
Eric Christopher88b7cf02011-08-19 00:30:14 +00001549 else
Anders Carlsson15348ae2011-02-28 02:27:16 +00001550 ExceptionsEnabled = false;
1551
1552 DidHaveExplicitExceptionFlag = true;
Rafael Espindolaf759df02009-10-01 13:33:33 +00001553 }
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001554
Anders Carlsson15348ae2011-02-28 02:27:16 +00001555 bool ShouldUseExceptionTables = false;
Fariborz Jahanian85caf032009-10-01 20:30:46 +00001556
Anders Carlsson15348ae2011-02-28 02:27:16 +00001557 // Exception tables and cleanups can be enabled with -fexceptions even if the
1558 // language itself doesn't support exceptions.
1559 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1560 ShouldUseExceptionTables = true;
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001561
Daniel Dunbard47ea692011-03-17 23:28:31 +00001562 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1563 // is not necessarily sensible, but follows GCC.
1564 if (types::isObjC(InputType) &&
Eric Christopher88b7cf02011-08-19 00:30:14 +00001565 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbard47ea692011-03-17 23:28:31 +00001566 options::OPT_fno_objc_exceptions,
1567 true)) {
1568 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlsson15348ae2011-02-28 02:27:16 +00001569
Eric Christopher88b7cf02011-08-19 00:30:14 +00001570 ShouldUseExceptionTables |=
John McCall260611a2012-06-20 06:18:46 +00001571 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001572 }
1573
1574 if (types::isCXX(InputType)) {
1575 bool CXXExceptionsEnabled = ExceptionsEnabled;
1576
Eric Christopher88b7cf02011-08-19 00:30:14 +00001577 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1578 options::OPT_fno_cxx_exceptions,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001579 options::OPT_fexceptions,
1580 options::OPT_fno_exceptions)) {
1581 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1582 CXXExceptionsEnabled = true;
Chandler Carruth43f220f2011-02-28 07:25:18 +00001583 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001584 CXXExceptionsEnabled = false;
1585 }
1586
1587 if (CXXExceptionsEnabled) {
1588 CmdArgs.push_back("-fcxx-exceptions");
1589
1590 ShouldUseExceptionTables = true;
1591 }
1592 }
1593
1594 if (ShouldUseExceptionTables)
1595 CmdArgs.push_back("-fexceptions");
Rafael Espindolaf759df02009-10-01 13:33:33 +00001596}
1597
Daniel Dunbarf4910132013-04-16 18:21:19 +00001598static bool ShouldDisableAutolink(const ArgList &Args,
1599 const ToolChain &TC) {
1600 bool Default = true;
1601 if (TC.getTriple().isOSDarwin()) {
1602 // The native darwin assembler doesn't support the linker_option directives,
1603 // so we disable them if we think the .s file will be passed to it.
1604 Default = TC.useIntegratedAs();
1605 }
1606 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1607 Default);
1608}
1609
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001610static bool ShouldDisableCFI(const ArgList &Args,
1611 const ToolChain &TC) {
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001612 bool Default = true;
Bob Wilson905c45f2011-10-14 05:03:44 +00001613 if (TC.getTriple().isOSDarwin()) {
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001614 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindolacb773922011-05-17 19:06:58 +00001615 // we disable them if we think the .s file will be passed to it.
Rafael Espindolaaf370e62013-03-18 18:10:27 +00001616 Default = TC.useIntegratedAs();
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001617 }
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001618 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher27e2b982012-12-18 00:31:10 +00001619 options::OPT_fno_dwarf2_cfi_asm,
1620 Default);
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001621}
1622
Ted Kremenekc06fcdf2013-03-12 17:02:12 +00001623static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1624 const ToolChain &TC) {
Nick Lewyckyea523d72011-10-17 23:05:52 +00001625 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1626 options::OPT_fno_dwarf_directory_asm,
Rafael Espindolaaf370e62013-03-18 18:10:27 +00001627 TC.useIntegratedAs());
Nick Lewyckyea523d72011-10-17 23:05:52 +00001628 return !UseDwarfDirectory;
1629}
1630
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001631/// \brief Check whether the given input tree contains any compilation actions.
1632static bool ContainsCompileAction(const Action *A) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001633 if (isa<CompileJobAction>(A))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001634 return true;
1635
1636 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1637 if (ContainsCompileAction(*it))
1638 return true;
1639
1640 return false;
1641}
1642
1643/// \brief Check if -relax-all should be passed to the internal assembler.
1644/// This is done by default when compiling non-assembler source with -O0.
1645static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1646 bool RelaxDefault = true;
1647
1648 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1649 RelaxDefault = A->getOption().matches(options::OPT_O0);
1650
1651 if (RelaxDefault) {
1652 RelaxDefault = false;
1653 for (ActionList::const_iterator it = C.getActions().begin(),
1654 ie = C.getActions().end(); it != ie; ++it) {
1655 if (ContainsCompileAction(*it)) {
1656 RelaxDefault = true;
1657 break;
1658 }
1659 }
1660 }
1661
1662 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1663 RelaxDefault);
1664}
1665
David Blaikie73168db2013-07-25 21:19:01 +00001666static void CollectArgsForIntegratedAssembler(Compilation &C,
1667 const ArgList &Args,
1668 ArgStringList &CmdArgs,
1669 const Driver &D) {
1670 if (UseRelaxAll(C, Args))
1671 CmdArgs.push_back("-mrelax-all");
1672
1673 // When using an integrated assembler, translate -Wa, and -Xassembler
1674 // options.
1675 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1676 options::OPT_Xassembler),
1677 ie = Args.filtered_end(); it != ie; ++it) {
1678 const Arg *A = *it;
1679 A->claim();
1680
1681 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1682 StringRef Value = A->getValue(i);
1683
1684 if (Value == "-force_cpusubtype_ALL") {
1685 // Do nothing, this is the default and we don't support anything else.
1686 } else if (Value == "-L") {
1687 CmdArgs.push_back("-msave-temp-labels");
1688 } else if (Value == "--fatal-warnings") {
1689 CmdArgs.push_back("-mllvm");
1690 CmdArgs.push_back("-fatal-assembler-warnings");
1691 } else if (Value == "--noexecstack") {
1692 CmdArgs.push_back("-mnoexecstack");
1693 } else {
1694 D.Diag(diag::err_drv_unsupported_option_argument)
1695 << A->getOption().getName() << Value;
1696 }
1697 }
1698 }
1699}
1700
Chandler Carruth9db37cd2013-06-23 11:28:48 +00001701static void addProfileRTLinux(
1702 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1703 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1704 Args.hasArg(options::OPT_fprofile_generate) ||
1705 Args.hasArg(options::OPT_fcreate_profile) ||
1706 Args.hasArg(options::OPT_coverage)))
1707 return;
1708
1709 // The profile runtime is located in the Linux library directory and has name
1710 // "libclang_rt.profile-<ArchName>.a".
1711 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1712 llvm::sys::path::append(
1713 LibProfile, "lib", "linux",
1714 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1715
1716 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1717}
1718
Alexey Samsonov86143042013-02-27 11:14:55 +00001719static void addSanitizerRTLinkFlagsLinux(
1720 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smith76e6e132013-03-23 00:30:08 +00001721 const StringRef Sanitizer, bool BeforeLibStdCXX,
1722 bool ExportSymbols = true) {
Alexey Samsonov86143042013-02-27 11:14:55 +00001723 // Sanitizer runtime is located in the Linux library directory and
1724 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1725 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1726 llvm::sys::path::append(
1727 LibSanitizer, "lib", "linux",
1728 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smith61a574f2013-03-20 23:49:07 +00001729
Alexey Samsonov86143042013-02-27 11:14:55 +00001730 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1731 // etc.) so that the linker picks custom versions of the global 'operator
1732 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournebf548552013-10-20 21:29:13 +00001733 // strategy of inserting it at the front of the link command. It also
1734 // needs to be forced to end up in the executable, so wrap it in
1735 // whole-archive.
Richard Smith61a574f2013-03-20 23:49:07 +00001736 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournebf548552013-10-20 21:29:13 +00001737 LibSanitizerArgs.push_back("-whole-archive");
Richard Smith61a574f2013-03-20 23:49:07 +00001738 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournebf548552013-10-20 21:29:13 +00001739 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smith61a574f2013-03-20 23:49:07 +00001740
1741 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1742 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1743
Alexey Samsonov86143042013-02-27 11:14:55 +00001744 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov3a8aff92013-05-24 14:28:03 +00001745 CmdArgs.push_back("-lrt");
Alexey Samsonov86143042013-02-27 11:14:55 +00001746 CmdArgs.push_back("-ldl");
Richard Smith76e6e132013-03-23 00:30:08 +00001747
1748 // If possible, use a dynamic symbols file to export the symbols from the
1749 // runtime library. If we can't do so, use -export-dynamic instead to export
1750 // all symbols from the binary.
1751 if (ExportSymbols) {
1752 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1753 CmdArgs.push_back(
1754 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1755 else
1756 CmdArgs.push_back("-export-dynamic");
1757 }
Alexey Samsonov86143042013-02-27 11:14:55 +00001758}
1759
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001760/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1761/// This needs to be called before we add the C run-time (malloc, etc).
1762static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00001763 ArgStringList &CmdArgs) {
Nick Lewyckyd4705682013-10-11 03:33:53 +00001764 if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov8ba75412012-09-12 09:09:08 +00001765 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1766 llvm::sys::path::append(LibAsan, "lib", "linux",
1767 (Twine("libclang_rt.asan-") +
1768 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay45b27382012-12-04 21:18:26 +00001769 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001770 } else {
Sergey Matveev050309f2013-05-27 11:17:01 +00001771 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001772 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001773 }
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001774}
1775
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001776/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1777/// This needs to be called before we add the C run-time (malloc, etc).
1778static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1779 ArgStringList &CmdArgs) {
Sergey Matveev050309f2013-05-27 11:17:01 +00001780 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001781 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001782}
1783
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00001784/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1785/// This needs to be called before we add the C run-time (malloc, etc).
1786static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1787 ArgStringList &CmdArgs) {
Sergey Matveev050309f2013-05-27 11:17:01 +00001788 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001789 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev050309f2013-05-27 11:17:01 +00001790}
1791
1792/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1793/// This needs to be called before we add the C run-time (malloc, etc).
1794static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1795 ArgStringList &CmdArgs) {
1796 if (!Args.hasArg(options::OPT_shared))
1797 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00001798}
1799
Richard Smith4def70d2012-10-09 19:52:38 +00001800/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1801/// (Linux).
1802static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smith61a574f2013-03-20 23:49:07 +00001803 ArgStringList &CmdArgs, bool IsCXX,
1804 bool HasOtherSanitizerRt) {
Nick Lewycky63d29e22013-10-19 00:27:23 +00001805 // Need a copy of sanitizer_common. This could come from another sanitizer
1806 // runtime; if we're not including one, include our own copy.
1807 if (!HasOtherSanitizerRt)
Peter Collingbournebf548552013-10-20 21:29:13 +00001808 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
1809
1810 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
1811
1812 // Only include the bits of the runtime which need a C++ ABI library if
1813 // we're linking in C++ mode.
1814 if (IsCXX)
1815 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smith4def70d2012-10-09 19:52:38 +00001816}
1817
Peter Collingbourne2eeed712013-08-07 22:47:34 +00001818static void addDfsanRTLinux(const ToolChain &TC, const ArgList &Args,
1819 ArgStringList &CmdArgs) {
1820 if (!Args.hasArg(options::OPT_shared))
1821 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "dfsan", true);
1822}
1823
Benjamin Kramer5322a552013-10-16 17:42:39 +00001824static bool shouldUseFramePointerForTarget(const ArgList &Args,
1825 const llvm::Triple &Triple) {
1826 switch (Triple.getArch()) {
1827 // Don't use a frame pointer on linux if optimizing for certain targets.
1828 case llvm::Triple::mips64:
1829 case llvm::Triple::mips64el:
1830 case llvm::Triple::mips:
1831 case llvm::Triple::mipsel:
1832 case llvm::Triple::systemz:
1833 case llvm::Triple::x86:
1834 case llvm::Triple::x86_64:
1835 if (Triple.isOSLinux())
1836 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1837 if (!A->getOption().matches(options::OPT_O0))
1838 return false;
1839 return true;
1840 case llvm::Triple::xcore:
1841 return false;
1842 default:
1843 return true;
1844 }
1845}
1846
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001847static bool shouldUseFramePointer(const ArgList &Args,
1848 const llvm::Triple &Triple) {
1849 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1850 options::OPT_fomit_frame_pointer))
1851 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1852
Benjamin Kramer5322a552013-10-16 17:42:39 +00001853 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001854}
1855
Eric Christopherd3e22df2013-04-03 01:58:53 +00001856static bool shouldUseLeafFramePointer(const ArgList &Args,
1857 const llvm::Triple &Triple) {
1858 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1859 options::OPT_momit_leaf_frame_pointer))
1860 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1861
Benjamin Kramer5322a552013-10-16 17:42:39 +00001862 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherd3e22df2013-04-03 01:58:53 +00001863}
1864
Rafael Espindolaa2148242013-08-10 01:40:10 +00001865/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruthd566df62012-12-17 21:40:04 +00001866static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer6089adc2013-04-27 08:12:29 +00001867 SmallString<128> cwd;
1868 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosierb1c81222013-04-26 20:49:50 +00001869 CmdArgs.push_back("-fdebug-compilation-dir");
1870 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruthd566df62012-12-17 21:40:04 +00001871 }
1872}
1873
Eric Christopher80190392013-02-22 20:12:52 +00001874static const char *SplitDebugName(const ArgList &Args,
1875 const InputInfoList &Inputs) {
1876 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1877 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1878 SmallString<128> T(FinalOutput->getValue());
1879 llvm::sys::path::replace_extension(T, "dwo");
1880 return Args.MakeArgString(T);
1881 } else {
1882 // Use the compilation dir.
1883 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1884 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1885 llvm::sys::path::replace_extension(F, "dwo");
1886 T += F;
1887 return Args.MakeArgString(F);
1888 }
1889}
1890
1891static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1892 const Tool &T, const JobAction &JA,
1893 const ArgList &Args, const InputInfo &Output,
1894 const char *OutFile) {
Eric Christopher59320e72013-02-21 22:35:01 +00001895 ArgStringList ExtractArgs;
1896 ExtractArgs.push_back("--extract-dwo");
1897
1898 ArgStringList StripArgs;
1899 StripArgs.push_back("--strip-dwo");
1900
1901 // Grabbing the output of the earlier compile step.
1902 StripArgs.push_back(Output.getFilename());
1903 ExtractArgs.push_back(Output.getFilename());
Eric Christopher59320e72013-02-21 22:35:01 +00001904 ExtractArgs.push_back(OutFile);
1905
1906 const char *Exec =
Eric Christopher80190392013-02-22 20:12:52 +00001907 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher59320e72013-02-21 22:35:01 +00001908
1909 // First extract the dwo sections.
Eric Christopher80190392013-02-22 20:12:52 +00001910 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00001911
1912 // Then remove them from the original .o file.
Eric Christopher80190392013-02-22 20:12:52 +00001913 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00001914}
1915
Chad Rosierb82e1172013-04-24 18:09:54 +00001916static bool isOptimizationLevelFast(const ArgList &Args) {
1917 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1918 if (A->getOption().matches(options::OPT_Ofast))
1919 return true;
1920 return false;
1921}
1922
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001923/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
1924static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
1925 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindola55ee1eb2013-08-27 16:58:15 +00001926 if (A->getOption().matches(options::OPT_O4) ||
1927 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001928 return true;
1929
1930 if (A->getOption().matches(options::OPT_O0))
1931 return false;
1932
1933 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
1934
Rafael Espindola168de192013-08-26 14:05:41 +00001935 // Vectorize -Os.
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001936 StringRef S(A->getValue());
Rafael Espindola168de192013-08-26 14:05:41 +00001937 if (S == "s")
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001938 return true;
1939
1940 // Don't vectorize -Oz.
1941 if (S == "z")
1942 return false;
1943
1944 unsigned OptLevel = 0;
1945 if (S.getAsInteger(10, OptLevel))
1946 return false;
1947
1948 return OptLevel > 1;
1949 }
1950
1951 return false;
1952}
1953
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001954void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar871adcf2009-03-18 07:06:02 +00001955 const InputInfo &Output,
Daniel Dunbar62cf6012009-03-18 06:07:59 +00001956 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00001957 const ArgList &Args,
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001958 const char *LinkingOutput) const {
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00001959 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1960 options::OPT_fapple_kext);
Daniel Dunbaree788e72009-12-21 18:54:17 +00001961 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001962 ArgStringList CmdArgs;
1963
Daniel Dunbar077ba6a2009-03-31 20:53:55 +00001964 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1965
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00001966 // Invoke ourselves in -cc1 mode.
1967 //
1968 // FIXME: Implement custom jobs for internal actions.
1969 CmdArgs.push_back("-cc1");
1970
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001971 // Add the "effective" target triple.
Daniel Dunbaraf07f932009-03-31 17:35:15 +00001972 CmdArgs.push_back("-triple");
Daniel Dunbar00577ad2010-08-23 22:35:37 +00001973 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001974 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbar728a5122009-09-10 06:49:20 +00001975
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001976 // Select the appropriate action.
John McCall260611a2012-06-20 06:18:46 +00001977 RewriteKind rewriteKind = RK_None;
Fariborz Jahaniane982cc02012-04-04 18:50:28 +00001978
Daniel Dunbar1d460332009-03-18 10:01:51 +00001979 if (isa<AnalyzeJobAction>(JA)) {
1980 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1981 CmdArgs.push_back("-analyze");
Ted Kremenek30660a82012-03-06 20:06:33 +00001982 } else if (isa<MigrateJobAction>(JA)) {
1983 CmdArgs.push_back("-migrate");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001984 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00001985 if (Output.getType() == types::TY_Dependencies)
1986 CmdArgs.push_back("-Eonly");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00001987 else {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00001988 CmdArgs.push_back("-E");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00001989 if (Args.hasArg(options::OPT_rewrite_objc) &&
1990 !Args.hasArg(options::OPT_g_Group))
1991 CmdArgs.push_back("-P");
1992 }
Daniel Dunbar8767cbc2010-02-03 03:07:56 +00001993 } else if (isa<AssembleJobAction>(JA)) {
1994 CmdArgs.push_back("-emit-obj");
Daniel Dunbar99298002010-05-27 06:18:05 +00001995
David Blaikie73168db2013-07-25 21:19:01 +00001996 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbard02bba82010-11-19 16:23:35 +00001997
1998 // Also ignore explicit -force_cpusubtype_ALL option.
1999 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002000 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +00002001 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00002002 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00002003
Aaron Ballman761322b2012-07-31 01:21:00 +00002004 if (JA.getType() == types::TY_Nothing)
2005 CmdArgs.push_back("-fsyntax-only");
2006 else if (UsePCH)
Douglas Gregordf91ef32009-04-18 00:34:01 +00002007 CmdArgs.push_back("-emit-pch");
2008 else
2009 CmdArgs.push_back("-emit-pth");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002010 } else {
2011 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002012
Daniel Dunbar1d460332009-03-18 10:01:51 +00002013 if (JA.getType() == types::TY_Nothing) {
2014 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00002015 } else if (JA.getType() == types::TY_LLVM_IR ||
2016 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002017 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00002018 } else if (JA.getType() == types::TY_LLVM_BC ||
2019 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002020 CmdArgs.push_back("-emit-llvm-bc");
2021 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbare3b8d072009-09-17 00:47:53 +00002022 CmdArgs.push_back("-S");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00002023 } else if (JA.getType() == types::TY_AST) {
2024 CmdArgs.push_back("-emit-pch");
Douglas Gregorc544ba02013-03-27 16:47:18 +00002025 } else if (JA.getType() == types::TY_ModuleFile) {
2026 CmdArgs.push_back("-module-file-info");
Daniel Dunbar64952502010-02-11 03:16:21 +00002027 } else if (JA.getType() == types::TY_RewrittenObjC) {
2028 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00002029 rewriteKind = RK_NonFragile;
Fariborz Jahanian582b3952012-04-02 15:59:19 +00002030 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2031 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00002032 rewriteKind = RK_Fragile;
Daniel Dunbar64952502010-02-11 03:16:21 +00002033 } else {
2034 assert(JA.getType() == types::TY_PP_Asm &&
2035 "Unexpected output type!");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002036 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002037 }
2038
Daniel Dunbar1d460332009-03-18 10:01:51 +00002039 // The make clang go fast button.
2040 CmdArgs.push_back("-disable-free");
2041
John McCallb689afb2010-02-13 03:50:24 +00002042 // Disable the verification pass in -asserts builds.
2043#ifdef NDEBUG
2044 CmdArgs.push_back("-disable-llvm-verifier");
2045#endif
2046
Daniel Dunbarc9abc042009-04-08 05:11:16 +00002047 // Set the main file name, so that debug info works even with
2048 // -save-temps.
2049 CmdArgs.push_back("-main-file-name");
Bob Wilson66b8a662012-11-23 06:14:39 +00002050 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbarc9abc042009-04-08 05:11:16 +00002051
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00002052 // Some flags which affect the language (via preprocessor
Bob Wilson66b8a662012-11-23 06:14:39 +00002053 // defines).
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00002054 if (Args.hasArg(options::OPT_static))
2055 CmdArgs.push_back("-static-define");
2056
Daniel Dunbar1d460332009-03-18 10:01:51 +00002057 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenekb8bb3e72009-09-25 05:55:59 +00002058 // Enable region store model by default.
2059 CmdArgs.push_back("-analyzer-store=region");
2060
Ted Kremenekb40d06d2009-12-07 22:26:14 +00002061 // Treat blocks as analysis entry points.
2062 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2063
Ted Kremenek51885072011-03-24 00:28:47 +00002064 CmdArgs.push_back("-analyzer-eagerly-assume");
2065
Daniel Dunbar1d460332009-03-18 10:01:51 +00002066 // Add default argument set.
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002067 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002068 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek51885072011-03-24 00:28:47 +00002069
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002070 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2071 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek51885072011-03-24 00:28:47 +00002072
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002073 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek51885072011-03-24 00:28:47 +00002074 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremeneka8180e52012-01-20 06:00:17 +00002075
2076 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek8dc05062012-01-26 02:27:38 +00002077
Jordan Rosee449edc2013-04-05 17:55:07 +00002078 if (types::isCXX(Inputs[0].getType()))
2079 CmdArgs.push_back("-analyzer-checker=cplusplus");
2080
Ted Kremenek8dc05062012-01-26 02:27:38 +00002081 // Enable the following experimental checkers for testing.
Ted Kremenek8dc05062012-01-26 02:27:38 +00002082 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2083 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2084 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2085 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2086 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2087 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002088 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002089
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002090 // Set the output format. The default is plist, for (lame) historical
2091 // reasons.
2092 CmdArgs.push_back("-analyzer-output");
2093 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smith1d489cf2012-11-01 04:30:05 +00002094 CmdArgs.push_back(A->getValue());
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002095 else
2096 CmdArgs.push_back("plist");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002097
Ted Kremenek0647a7b2010-03-22 22:32:05 +00002098 // Disable the presentation of standard compiler warnings when
2099 // using --analyze. We only want to show static analyzer diagnostics
2100 // or frontend errors.
2101 CmdArgs.push_back("-w");
2102
Daniel Dunbar1d460332009-03-18 10:01:51 +00002103 // Add -Xanalyzer arguments when running as analyzer.
2104 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump1eb44332009-09-09 15:08:12 +00002105 }
2106
Daniel Dunbare2fd6642009-09-10 01:21:12 +00002107 CheckCodeGenerationOptions(D, Args);
2108
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002109 bool PIE = getToolChain().isPIEDefault();
2110 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002111 bool IsPICLevelTwo = PIC;
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002112
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002113 // For the PIC and PIE flag options, this logic is different from the
2114 // legacy logic in very old versions of GCC, as that logic was just
2115 // a bug no one had ever fixed. This logic is both more rational and
2116 // consistent with GCC's new logic now that the bugs are fixed. The last
2117 // argument relating to either PIC or PIE wins, and no other argument is
2118 // used. If the last argument is any flavor of the '-fno-...' arguments,
2119 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2120 // at the same level.
2121 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2122 options::OPT_fpic, options::OPT_fno_pic,
2123 options::OPT_fPIE, options::OPT_fno_PIE,
2124 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002125 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2126 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002127 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002128 if (LastPICArg) {
2129 Option O = LastPICArg->getOption();
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002130 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2131 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2132 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2133 PIC = PIE || O.matches(options::OPT_fPIC) ||
2134 O.matches(options::OPT_fpic);
2135 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2136 O.matches(options::OPT_fPIC);
2137 } else {
2138 PIE = PIC = false;
2139 }
2140 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002141 }
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002142
Nick Lewyckyd4705682013-10-11 03:33:53 +00002143 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002144 // specified while enabling PIC enabled level 1 PIC, just force it back to
2145 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2146 // informal testing).
2147 if (PIC && getToolChain().getTriple().isOSDarwin())
2148 IsPICLevelTwo |= getToolChain().isPICDefault();
2149
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002150 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2151 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00002152 llvm::Triple Triple(TripleStr);
Eric Christopher6c7db892013-02-18 01:16:37 +00002153 if (KernelOrKext &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00002154 (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002155 PIC = PIE = false;
Simon Atanasyanc0e83642013-10-04 11:46:54 +00002156 if (Args.hasArg(options::OPT_static))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002157 PIC = PIE = false;
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002158
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002159 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2160 // This is a very special mode. It trumps the other modes, almost no one
2161 // uses it, and it isn't even valid on any OS but Darwin.
2162 if (!getToolChain().getTriple().isOSDarwin())
2163 D.Diag(diag::err_drv_unsupported_opt_for_target)
2164 << A->getSpelling() << getToolChain().getTriple().str();
2165
2166 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2167
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002168 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002169 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002170
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002171 // Only a forced PIC mode can cause the actual compile to have PIC defines
2172 // etc., no flags are sufficient. This behavior was selected to closely
2173 // match that of llvm-gcc and Apple GCC before that.
2174 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2175 CmdArgs.push_back("-pic-level");
2176 CmdArgs.push_back("2");
2177 }
2178 } else {
2179 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2180 // handled in Clang's IRGen by the -pie-level flag.
2181 CmdArgs.push_back("-mrelocation-model");
2182 CmdArgs.push_back(PIC ? "pic" : "static");
2183
2184 if (PIC) {
2185 CmdArgs.push_back("-pic-level");
2186 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2187 if (PIE) {
2188 CmdArgs.push_back("-pie-level");
2189 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2190 }
2191 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002192 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002193
Tanya Lattner59876c22009-11-04 01:18:09 +00002194 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2195 options::OPT_fno_merge_all_constants))
Chris Lattnerf44a1a02011-04-08 18:06:54 +00002196 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002197
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002198 // LLVM Code Generator Options.
2199
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002200 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2201 CmdArgs.push_back("-mregparm");
Richard Smith1d489cf2012-11-01 04:30:05 +00002202 CmdArgs.push_back(A->getValue());
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002203 }
2204
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00002205 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2206 options::OPT_freg_struct_return)) {
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002207 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCallb8b52972013-06-18 02:46:29 +00002208 D.Diag(diag::err_drv_unsupported_opt_for_target)
2209 << A->getSpelling() << getToolChain().getTriple().str();
2210 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2211 CmdArgs.push_back("-fpcc-struct-return");
2212 } else {
2213 assert(A->getOption().matches(options::OPT_freg_struct_return));
2214 CmdArgs.push_back("-freg-struct-return");
2215 }
2216 }
2217
Roman Divackycfe9af22011-03-01 17:40:53 +00002218 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2219 CmdArgs.push_back("-mrtd");
2220
Rafael Espindola6af27ec2011-12-14 21:02:23 +00002221 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002222 CmdArgs.push_back("-mdisable-fp-elim");
2223 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2224 options::OPT_fno_zero_initialized_in_bss))
2225 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb82e1172013-04-24 18:09:54 +00002226
2227 bool OFastEnabled = isOptimizationLevelFast(Args);
2228 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2229 // enabled. This alias option is being used to simplify the hasFlag logic.
2230 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2231 options::OPT_fstrict_aliasing;
2232 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Daniel Dunbar398c6102011-02-04 02:20:39 +00002233 options::OPT_fno_strict_aliasing,
2234 getToolChain().IsStrictAliasingDefault()))
Dan Gohman4d5625e2010-10-14 22:36:56 +00002235 CmdArgs.push_back("-relaxed-aliasing");
Manman Ren96d6c452013-10-11 20:48:38 +00002236 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2237 options::OPT_fno_struct_path_tbaa))
2238 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth82fe6ae2012-03-27 23:58:37 +00002239 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2240 false))
2241 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1db772b2012-01-23 08:29:12 +00002242 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2243 options::OPT_fno_optimize_sibling_calls))
2244 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002245
Eric Christopher31056272013-04-04 06:29:47 +00002246 // Handle segmented stacks.
2247 if (Args.hasArg(options::OPT_fsplit_stack))
2248 CmdArgs.push_back("-split-stacks");
Chad Rosierb82e1172013-04-24 18:09:54 +00002249
2250 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2251 // This alias option is being used to simplify the getLastArg logic.
2252 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2253 options::OPT_ffast_math;
Eric Christopher31056272013-04-04 06:29:47 +00002254
Chandler Carruthabf07a72012-01-02 14:19:45 +00002255 // Handle various floating point optimization flags, mapping them to the
2256 // appropriate LLVM code generation flags. The pattern for all of these is to
2257 // default off the codegen optimizations, and if any flag enables them and no
2258 // flag disables them after the flag enabling them, enable the codegen
2259 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb82e1172013-04-24 18:09:54 +00002260 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002261 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002262 options::OPT_ffinite_math_only,
2263 options::OPT_fno_finite_math_only,
2264 options::OPT_fhonor_infinities,
2265 options::OPT_fno_honor_infinities))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002266 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2267 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002268 A->getOption().getID() != options::OPT_fhonor_infinities)
2269 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb82e1172013-04-24 18:09:54 +00002270 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002271 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002272 options::OPT_ffinite_math_only,
2273 options::OPT_fno_finite_math_only,
2274 options::OPT_fhonor_nans,
2275 options::OPT_fno_honor_nans))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002276 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2277 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002278 A->getOption().getID() != options::OPT_fhonor_nans)
2279 CmdArgs.push_back("-menable-no-nans");
2280
Benjamin Kramer769aa2d2012-05-02 14:55:48 +00002281 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2282 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb82e1172013-04-24 18:09:54 +00002283 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002284 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002285 options::OPT_fmath_errno,
Chandler Carruthb69557e2013-05-18 20:47:36 +00002286 options::OPT_fno_math_errno)) {
2287 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2288 // However, turning *off* -ffast_math merely restores the toolchain default
2289 // (which may be false).
2290 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2291 A->getOption().getID() == options::OPT_ffast_math ||
2292 A->getOption().getID() == options::OPT_Ofast)
2293 MathErrno = false;
2294 else if (A->getOption().getID() == options::OPT_fmath_errno)
2295 MathErrno = true;
2296 }
Chandler Carruth4f50c502012-04-26 02:10:51 +00002297 if (MathErrno)
2298 CmdArgs.push_back("-fmath-errno");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002299
2300 // There are several flags which require disabling very specific
2301 // optimizations. Any of these being disabled forces us to turn off the
2302 // entire set of LLVM optimizations, so collect them through all the flag
2303 // madness.
2304 bool AssociativeMath = false;
Chad Rosierb82e1172013-04-24 18:09:54 +00002305 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002306 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002307 options::OPT_funsafe_math_optimizations,
2308 options::OPT_fno_unsafe_math_optimizations,
2309 options::OPT_fassociative_math,
2310 options::OPT_fno_associative_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002311 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2312 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002313 A->getOption().getID() != options::OPT_fno_associative_math)
2314 AssociativeMath = true;
2315 bool ReciprocalMath = false;
Chad Rosierb82e1172013-04-24 18:09:54 +00002316 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002317 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002318 options::OPT_funsafe_math_optimizations,
2319 options::OPT_fno_unsafe_math_optimizations,
2320 options::OPT_freciprocal_math,
2321 options::OPT_fno_reciprocal_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002322 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2323 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002324 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2325 ReciprocalMath = true;
2326 bool SignedZeros = true;
Chad Rosierb82e1172013-04-24 18:09:54 +00002327 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002328 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002329 options::OPT_funsafe_math_optimizations,
2330 options::OPT_fno_unsafe_math_optimizations,
2331 options::OPT_fsigned_zeros,
2332 options::OPT_fno_signed_zeros))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002333 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2334 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002335 A->getOption().getID() != options::OPT_fsigned_zeros)
2336 SignedZeros = false;
2337 bool TrappingMath = true;
Chad Rosierb82e1172013-04-24 18:09:54 +00002338 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002339 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002340 options::OPT_funsafe_math_optimizations,
2341 options::OPT_fno_unsafe_math_optimizations,
2342 options::OPT_ftrapping_math,
2343 options::OPT_fno_trapping_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002344 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2345 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002346 A->getOption().getID() != options::OPT_ftrapping_math)
2347 TrappingMath = false;
2348 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2349 !TrappingMath)
2350 CmdArgs.push_back("-menable-unsafe-fp-math");
2351
Lang Hamesc9686712012-07-06 00:59:19 +00002352
2353 // Validate and pass through -fp-contract option.
Chad Rosierb82e1172013-04-24 18:09:54 +00002354 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002355 options::OPT_fno_fast_math,
Lang Hamesc9686712012-07-06 00:59:19 +00002356 options::OPT_ffp_contract)) {
2357 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002358 StringRef Val = A->getValue();
Lang Hamesc9686712012-07-06 00:59:19 +00002359 if (Val == "fast" || Val == "on" || Val == "off") {
2360 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2361 } else {
2362 D.Diag(diag::err_drv_unsupported_option_argument)
2363 << A->getOption().getName() << Val;
2364 }
Chad Rosierb82e1172013-04-24 18:09:54 +00002365 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2366 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesc9686712012-07-06 00:59:19 +00002367 // If fast-math is set then set the fp-contract mode to fast.
2368 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2369 }
2370 }
2371
Bob Wilson455e72e2012-07-19 03:52:53 +00002372 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2373 // and if we find them, tell the frontend to provide the appropriate
2374 // preprocessor macros. This is distinct from enabling any optimizations as
2375 // these options induce language changes which must survive serialization
2376 // and deserialization, etc.
Chad Rosierb82e1172013-04-24 18:09:54 +00002377 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2378 options::OPT_fno_fast_math))
2379 if (!A->getOption().matches(options::OPT_fno_fast_math))
2380 CmdArgs.push_back("-ffast-math");
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002381 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2382 if (A->getOption().matches(options::OPT_ffinite_math_only))
2383 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002384
Daniel Dunbar1b718482010-05-14 22:00:22 +00002385 // Decide whether to use verbose asm. Verbose assembly is the default on
2386 // toolchains which have the integrated assembler on by default.
2387 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2388 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer20249a12010-10-21 03:16:25 +00002389 IsVerboseAsmDefault) ||
Daniel Dunbar1b718482010-05-14 22:00:22 +00002390 Args.hasArg(options::OPT_dA))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002391 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002392
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002393 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2394 CmdArgs.push_back("-mdebug-pass");
2395 CmdArgs.push_back("Structure");
2396 }
2397 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2398 CmdArgs.push_back("-mdebug-pass");
2399 CmdArgs.push_back("Arguments");
2400 }
2401
John McCalld0c2ec42010-02-19 02:45:38 +00002402 // Enable -mconstructor-aliases except on darwin, where we have to
2403 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson905c45f2011-10-14 05:03:44 +00002404 if (!getToolChain().getTriple().isOSDarwin())
John McCalld0c2ec42010-02-19 02:45:38 +00002405 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00002406
John McCall32096692011-03-18 02:56:14 +00002407 // Darwin's kernel doesn't support guard variables; just die if we
2408 // try to use them.
Bob Wilson905c45f2011-10-14 05:03:44 +00002409 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall32096692011-03-18 02:56:14 +00002410 CmdArgs.push_back("-fforbid-guard-variables");
2411
Douglas Gregor6f755502011-02-01 15:15:22 +00002412 if (Args.hasArg(options::OPT_mms_bitfields)) {
2413 CmdArgs.push_back("-mms-bitfields");
2414 }
John McCalld0c2ec42010-02-19 02:45:38 +00002415
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002416 // This is a coarse approximation of what llvm-gcc actually does, both
2417 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2418 // complicated ways.
2419 bool AsynchronousUnwindTables =
2420 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2421 options::OPT_fno_asynchronous_unwind_tables,
2422 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002423 !KernelOrKext);
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002424 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2425 AsynchronousUnwindTables))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002426 CmdArgs.push_back("-munwind-tables");
2427
Chandler Carrutha6b25812012-11-21 23:40:23 +00002428 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola8af669f2012-06-19 01:26:10 +00002429
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002430 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2431 CmdArgs.push_back("-mlimit-float-precision");
Richard Smith1d489cf2012-11-01 04:30:05 +00002432 CmdArgs.push_back(A->getValue());
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002433 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002434
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002435 // FIXME: Handle -mtune=.
2436 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002437
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002438 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002439 CmdArgs.push_back("-mcode-model");
Richard Smith1d489cf2012-11-01 04:30:05 +00002440 CmdArgs.push_back(A->getValue());
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002441 }
2442
Rafael Espindolab330e402013-08-20 22:12:08 +00002443 // Add the target cpu
2444 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2445 llvm::Triple ETriple(ETripleStr);
2446 std::string CPU = getCPUName(Args, ETriple);
2447 if (!CPU.empty()) {
2448 CmdArgs.push_back("-target-cpu");
2449 CmdArgs.push_back(Args.MakeArgString(CPU));
2450 }
2451
Rafael Espindola5389b842013-08-21 21:59:03 +00002452 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2453 CmdArgs.push_back("-mfpmath");
2454 CmdArgs.push_back(A->getValue());
2455 }
2456
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002457 // Add the target features
2458 getTargetFeatures(D, ETriple, Args, CmdArgs);
2459
Rafael Espindolab330e402013-08-20 22:12:08 +00002460 // Add target specific flags.
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002461 switch(getToolChain().getArch()) {
Daniel Dunbar6acda162009-09-09 22:33:08 +00002462 default:
2463 break;
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002464
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002465 case llvm::Triple::arm:
2466 case llvm::Triple::thumb:
Daniel Dunbarfa41d692011-03-17 17:10:06 +00002467 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002468 break;
2469
Eric Christophered734732010-03-02 02:41:08 +00002470 case llvm::Triple::mips:
2471 case llvm::Triple::mipsel:
Akira Hatanaka7ec02582011-09-21 02:13:07 +00002472 case llvm::Triple::mips64:
2473 case llvm::Triple::mips64el:
Eric Christophered734732010-03-02 02:41:08 +00002474 AddMIPSTargetArgs(Args, CmdArgs);
2475 break;
2476
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002477 case llvm::Triple::sparc:
2478 AddSparcTargetArgs(Args, CmdArgs);
2479 break;
2480
Daniel Dunbar6acda162009-09-09 22:33:08 +00002481 case llvm::Triple::x86:
2482 case llvm::Triple::x86_64:
2483 AddX86TargetArgs(Args, CmdArgs);
2484 break;
Tony Linthicum96319392011-12-12 21:14:55 +00002485
2486 case llvm::Triple::hexagon:
2487 AddHexagonTargetArgs(Args, CmdArgs);
2488 break;
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002489 }
2490
Hans Wennborgb3574792013-08-08 00:17:41 +00002491 // Add clang-cl arguments.
2492 if (getToolChain().getDriver().IsCLMode())
2493 AddClangCLArgs(Args, CmdArgs);
2494
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002495 // Pass the linker version in use.
2496 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2497 CmdArgs.push_back("-target-linker-version");
Richard Smith1d489cf2012-11-01 04:30:05 +00002498 CmdArgs.push_back(A->getValue());
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002499 }
2500
Eric Christopherd3e22df2013-04-03 01:58:53 +00002501 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbar1ad66482010-07-01 01:31:45 +00002502 CmdArgs.push_back("-momit-leaf-frame-pointer");
2503
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002504 // Explicitly error on some things we know we don't support and can't just
2505 // ignore.
2506 types::ID InputType = Inputs[0].getType();
Daniel Dunbare94db472010-09-24 19:39:37 +00002507 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2508 Arg *Unsupported;
Daniel Dunbare94db472010-09-24 19:39:37 +00002509 if (types::isCXX(InputType) &&
Bob Wilson905c45f2011-10-14 05:03:44 +00002510 getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002511 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilsona544aee2011-08-13 23:48:55 +00002512 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2513 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002514 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbare94db472010-09-24 19:39:37 +00002515 << Unsupported->getOption().getName();
2516 }
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002517 }
2518
Daniel Dunbar1d460332009-03-18 10:01:51 +00002519 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbarf7c16d92010-08-24 22:44:13 +00002520 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosier2b819102011-08-02 17:58:04 +00002521 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbar322c29f2011-02-02 21:11:35 +00002522 CmdArgs.push_back("-header-include-file");
2523 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2524 D.CCPrintHeadersFilename : "-");
2525 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002526 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump1eb44332009-09-09 15:08:12 +00002527 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002528
Chad Rosier2b819102011-08-02 17:58:04 +00002529 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00002530 CmdArgs.push_back("-diagnostic-log-file");
2531 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2532 D.CCLogDiagnosticsFilename : "-");
2533 }
2534
Eric Christopherc706c8e2013-02-05 07:29:57 +00002535 // Use the last option from "-g" group. "-gline-tables-only"
2536 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola18f36d92010-03-07 04:46:18 +00002537 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002538 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopherc706c8e2013-02-05 07:29:57 +00002539 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002540 CmdArgs.push_back("-gline-tables-only");
Manman Renfc0f91c2013-06-19 01:46:49 +00002541 else if (A->getOption().matches(options::OPT_gdwarf_2))
2542 CmdArgs.push_back("-gdwarf-2");
2543 else if (A->getOption().matches(options::OPT_gdwarf_3))
2544 CmdArgs.push_back("-gdwarf-3");
2545 else if (A->getOption().matches(options::OPT_gdwarf_4))
2546 CmdArgs.push_back("-gdwarf-4");
Eric Christopherc706c8e2013-02-05 07:29:57 +00002547 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren8ed38d82013-07-02 23:15:25 +00002548 !A->getOption().matches(options::OPT_ggdb0)) {
2549 // Default is dwarf-2 for darwin.
2550 if (getToolChain().getTriple().isOSDarwin())
2551 CmdArgs.push_back("-gdwarf-2");
2552 else
2553 CmdArgs.push_back("-g");
2554 }
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002555 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002556
Alexey Samsonov7f326072012-06-21 08:22:39 +00002557 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2558 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christopherda3301e2012-10-18 21:52:18 +00002559 if (Args.hasArg(options::OPT_gcolumn_info))
2560 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonov7f326072012-06-21 08:22:39 +00002561
Eric Christopher0f43a6d2013-09-13 22:37:55 +00002562 // FIXME: Move backend command line options to the module.
Eric Christopherc706c8e2013-02-05 07:29:57 +00002563 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2564 // splitting and extraction.
Eric Christopherf870e122013-02-21 22:35:05 +00002565 // FIXME: Currently only works on Linux.
Cameron Esfahani57b1da12013-09-14 01:09:11 +00002566 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherf870e122013-02-21 22:35:05 +00002567 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopherc706c8e2013-02-05 07:29:57 +00002568 CmdArgs.push_back("-g");
2569 CmdArgs.push_back("-backend-option");
2570 CmdArgs.push_back("-split-dwarf=Enable");
2571 }
2572
Eric Christopher0f43a6d2013-09-13 22:37:55 +00002573 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2574 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2575 CmdArgs.push_back("-backend-option");
2576 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2577 }
Eric Christopher3e8ac1b2013-06-18 00:03:50 +00002578
2579 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2580
Rafael Espindola9cf933a2010-05-06 21:06:04 +00002581 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2582 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2583
Chris Lattner7255a2d2010-06-22 00:03:40 +00002584 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2585
Nick Lewyckye8ba8d72011-04-21 23:44:07 +00002586 if (Args.hasArg(options::OPT_ftest_coverage) ||
2587 Args.hasArg(options::OPT_coverage))
2588 CmdArgs.push_back("-femit-coverage-notes");
2589 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2590 Args.hasArg(options::OPT_coverage))
2591 CmdArgs.push_back("-femit-coverage-data");
2592
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002593 if (C.getArgs().hasArg(options::OPT_c) ||
2594 C.getArgs().hasArg(options::OPT_S)) {
2595 if (Output.isFilename()) {
Nick Lewycky3dc05412011-05-05 00:08:20 +00002596 CmdArgs.push_back("-coverage-file");
Eric Christopher025b3d42013-02-22 00:24:40 +00002597 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky0f815f12013-03-07 08:28:53 +00002598 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolaa2148242013-08-10 01:40:10 +00002599 SmallString<128> Pwd;
2600 if (!llvm::sys::fs::current_path(Pwd)) {
2601 llvm::sys::path::append(Pwd, CoverageFilename.str());
2602 CoverageFilename.swap(Pwd);
Nick Lewycky0f815f12013-03-07 08:28:53 +00002603 }
2604 }
Eric Christopher025b3d42013-02-22 00:24:40 +00002605 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002606 }
2607 }
2608
Daniel Dunbara268fc02011-10-11 18:20:10 +00002609 // Pass options for controlling the default header search paths.
2610 if (Args.hasArg(options::OPT_nostdinc)) {
2611 CmdArgs.push_back("-nostdsysteminc");
2612 CmdArgs.push_back("-nobuiltininc");
2613 } else {
Daniel Dunbar92d6d402011-10-11 18:20:16 +00002614 if (Args.hasArg(options::OPT_nostdlibinc))
2615 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbara268fc02011-10-11 18:20:10 +00002616 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2617 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2618 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002619
Daniel Dunbar5f122322009-12-15 01:02:52 +00002620 // Pass the path to compiler resource files.
Daniel Dunbar5f122322009-12-15 01:02:52 +00002621 CmdArgs.push_back("-resource-dir");
Daniel Dunbar225c4172010-01-20 02:35:16 +00002622 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar2ac9fc22009-04-07 21:42:00 +00002623
Argyrios Kyrtzidis389db162010-11-03 22:45:23 +00002624 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2625
Ted Kremenek30660a82012-03-06 20:06:33 +00002626 bool ARCMTEnabled = false;
Argyrios Kyrtzidisdce3ce32013-09-17 19:14:29 +00002627 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002628 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002629 options::OPT_ccc_arcmt_modify,
2630 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002631 ARCMTEnabled = true;
John McCall8f0e8d22011-06-15 23:25:17 +00002632 switch (A->getOption().getID()) {
2633 default:
2634 llvm_unreachable("missed a case");
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002635 case options::OPT_ccc_arcmt_check:
John McCall8f0e8d22011-06-15 23:25:17 +00002636 CmdArgs.push_back("-arcmt-check");
2637 break;
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002638 case options::OPT_ccc_arcmt_modify:
John McCall8f0e8d22011-06-15 23:25:17 +00002639 CmdArgs.push_back("-arcmt-modify");
2640 break;
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002641 case options::OPT_ccc_arcmt_migrate:
2642 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenek30660a82012-03-06 20:06:33 +00002643 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002644 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidis7ee20492011-07-19 17:20:03 +00002645
2646 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2647 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002648 break;
John McCall8f0e8d22011-06-15 23:25:17 +00002649 }
2650 }
Argyrios Kyrtzidisf75ece42013-06-24 19:01:18 +00002651 } else {
2652 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2653 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2654 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCall8f0e8d22011-06-15 23:25:17 +00002655 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002656
Ted Kremenek30660a82012-03-06 20:06:33 +00002657 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2658 if (ARCMTEnabled) {
2659 D.Diag(diag::err_drv_argument_not_allowed_with)
2660 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2661 }
2662 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002663 CmdArgs.push_back(A->getValue());
Ted Kremenek30660a82012-03-06 20:06:33 +00002664
2665 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand4129992013-07-09 16:59:14 +00002666 options::OPT_objcmt_migrate_subscripting,
2667 options::OPT_objcmt_migrate_property)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002668 // None specified, means enable them all.
2669 CmdArgs.push_back("-objcmt-migrate-literals");
2670 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand4129992013-07-09 16:59:14 +00002671 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenek30660a82012-03-06 20:06:33 +00002672 } else {
2673 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2674 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand4129992013-07-09 16:59:14 +00002675 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenek30660a82012-03-06 20:06:33 +00002676 }
2677 }
2678
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002679 // Add preprocessing options like -I, -D, etc. if we are using the
2680 // preprocessor.
2681 //
2682 // FIXME: Support -fpreprocessed
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002683 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier9d718632013-01-24 19:14:47 +00002684 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002685
Rafael Espindola19d9d2e2011-07-21 23:40:37 +00002686 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2687 // that "The compiler can only warn and ignore the option if not recognized".
2688 // When building with ccache, it will pass -D options to clang even on
2689 // preprocessed inputs and configure concludes that -fPIC is not supported.
2690 Args.ClaimAllArgs(options::OPT_D);
2691
Rafael Espindola55ee1eb2013-08-27 16:58:15 +00002692 // Manually translate -O4 to -O3; let clang reject others.
2693 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2694 if (A->getOption().matches(options::OPT_O4)) {
2695 CmdArgs.push_back("-O3");
2696 D.Diag(diag::warn_O4_is_O3);
2697 } else {
2698 A->render(Args, CmdArgs);
2699 }
2700 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002701
Chad Rosierb2c08872012-12-12 20:06:31 +00002702 // Don't warn about unused -flto. This can happen when we're preprocessing or
2703 // precompiling.
2704 Args.ClaimAllArgs(options::OPT_flto);
2705
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002706 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremeneke8cf7d12012-07-07 05:53:30 +00002707 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2708 CmdArgs.push_back("-pedantic");
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002709 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002710 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard573d262009-04-07 22:13:21 +00002711
2712 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgadbb4552013-07-31 16:57:56 +00002713 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbard573d262009-04-07 22:13:21 +00002714 //
2715 // If a std is supplied, only add -trigraphs if it follows the
2716 // option.
2717 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2718 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes528365d2009-10-16 14:28:06 +00002719 if (types::isCXX(InputType))
Daniel Dunbar294691e2009-11-04 06:24:38 +00002720 CmdArgs.push_back("-std=c++98");
Nuno Lopes528365d2009-10-16 14:28:06 +00002721 else
Daniel Dunbar294691e2009-11-04 06:24:38 +00002722 CmdArgs.push_back("-std=c89");
Daniel Dunbard573d262009-04-07 22:13:21 +00002723 else
2724 Std->render(Args, CmdArgs);
2725
Daniel Dunbar0e100312010-06-14 21:23:08 +00002726 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2727 options::OPT_trigraphs))
2728 if (A != Std)
Daniel Dunbard573d262009-04-07 22:13:21 +00002729 A->render(Args, CmdArgs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002730 } else {
2731 // Honor -std-default.
Daniel Dunbar4a5290e2010-01-29 21:03:02 +00002732 //
2733 // FIXME: Clang doesn't correctly handle -std= when the input language
2734 // doesn't match. For the time being just ignore this for C++ inputs;
2735 // eventually we want to do all the standard defaulting here instead of
2736 // splitting it between the driver and clang -cc1.
2737 if (!types::isCXX(InputType))
Nico Weber50f88b92012-08-30 02:08:31 +00002738 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2739 "-std=", /*Joined=*/true);
2740 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2741 CmdArgs.push_back("-std=c++11");
2742
Daniel Dunbard573d262009-04-07 22:13:21 +00002743 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002744 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002745
Richard Smithe9813b32013-09-04 22:50:31 +00002746 // GCC's behavior for -Wwrite-strings is a bit strange:
2747 // * In C, this "warning flag" changes the types of string literals from
2748 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
2749 // for the discarded qualifier.
2750 // * In C++, this is just a normal warning flag.
2751 //
2752 // Implementing this warning correctly in C is hard, so we follow GCC's
2753 // behavior for now. FIXME: Directly diagnose uses of a string literal as
2754 // a non-const char* in C, rather than using this crude hack.
2755 if (!types::isCXX(InputType)) {
2756 // FIXME: This should behave just like a warning flag, and thus should also
2757 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
2758 Arg *WriteStrings =
2759 Args.getLastArg(options::OPT_Wwrite_strings,
2760 options::OPT_Wno_write_strings, options::OPT_w);
2761 if (WriteStrings &&
2762 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
2763 CmdArgs.push_back("-fconst-strings");
Chandler Carruth50465d12011-04-23 06:30:43 +00002764 }
2765
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002766 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruthf8c247d2011-04-23 19:48:40 +00002767 // during C++ compilation, which it is by default. GCC keeps this define even
2768 // in the presence of '-w', match this behavior bug-for-bug.
2769 if (types::isCXX(InputType) &&
2770 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2771 true)) {
2772 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002773 }
2774
Chandler Carruthc304ba32010-05-22 02:21:53 +00002775 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2776 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2777 if (Asm->getOption().matches(options::OPT_fasm))
2778 CmdArgs.push_back("-fgnu-keywords");
2779 else
2780 CmdArgs.push_back("-fno-gnu-keywords");
2781 }
2782
Rafael Espindola61b1efe2011-05-02 17:43:32 +00002783 if (ShouldDisableCFI(Args, getToolChain()))
2784 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolaf24a1512011-04-30 18:35:43 +00002785
Nick Lewyckyea523d72011-10-17 23:05:52 +00002786 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2787 CmdArgs.push_back("-fno-dwarf-directory-asm");
2788
Daniel Dunbarf4910132013-04-16 18:21:19 +00002789 if (ShouldDisableAutolink(Args, getToolChain()))
2790 CmdArgs.push_back("-fno-autolink");
2791
Chandler Carruthd566df62012-12-17 21:40:04 +00002792 // Add in -fdebug-compilation-dir if necessary.
2793 addDebugCompDirArg(Args, CmdArgs);
Nick Lewycky7c4fd912011-10-21 02:32:14 +00002794
Richard Smithc18c4232011-11-21 19:36:32 +00002795 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2796 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002797 CmdArgs.push_back("-ftemplate-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002798 CmdArgs.push_back(A->getValue());
Daniel Dunbar1d460332009-03-18 10:01:51 +00002799 }
2800
Richard Smithc18c4232011-11-21 19:36:32 +00002801 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2802 CmdArgs.push_back("-fconstexpr-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002803 CmdArgs.push_back(A->getValue());
Richard Smithc18c4232011-11-21 19:36:32 +00002804 }
2805
Richard Smithe7565632013-05-08 02:12:03 +00002806 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2807 CmdArgs.push_back("-fconstexpr-steps");
2808 CmdArgs.push_back(A->getValue());
2809 }
2810
Richard Smith9e738cc2013-02-22 01:59:51 +00002811 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2812 CmdArgs.push_back("-fbracket-depth");
2813 CmdArgs.push_back(A->getValue());
2814 }
2815
Argyrios Kyrtzidis1380a142010-11-18 00:20:36 +00002816 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2817 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002818 if (A->getNumValues()) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002819 StringRef bytes = A->getValue();
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002820 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2821 } else
2822 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidis3532fdd2010-11-17 23:11:54 +00002823 }
2824
Nuno Lopesb3198a82012-05-08 22:10:46 +00002825
Michael J. Spencerc6357102012-10-22 22:13:48 +00002826 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar66861e02009-11-20 22:21:36 +00002827 CmdArgs.push_back("-relocatable-pch");
Mike Stump1eb44332009-09-09 15:08:12 +00002828
Daniel Dunbar294691e2009-11-04 06:24:38 +00002829 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2830 CmdArgs.push_back("-fconstant-string-class");
Richard Smith1d489cf2012-11-01 04:30:05 +00002831 CmdArgs.push_back(A->getValue());
Daniel Dunbar294691e2009-11-04 06:24:38 +00002832 }
David Chisnall8a5a9aa2009-08-31 16:41:57 +00002833
Chris Lattner124fca52010-01-09 21:54:33 +00002834 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2835 CmdArgs.push_back("-ftabstop");
Richard Smith1d489cf2012-11-01 04:30:05 +00002836 CmdArgs.push_back(A->getValue());
Chris Lattner124fca52010-01-09 21:54:33 +00002837 }
2838
Chris Lattner0f0c9632010-04-07 20:49:23 +00002839 CmdArgs.push_back("-ferror-limit");
2840 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smith1d489cf2012-11-01 04:30:05 +00002841 CmdArgs.push_back(A->getValue());
Chris Lattner0f0c9632010-04-07 20:49:23 +00002842 else
2843 CmdArgs.push_back("19");
Douglas Gregor575cf372010-04-20 07:18:24 +00002844
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002845 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2846 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002847 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002848 }
2849
2850 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2851 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002852 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002853 }
2854
Richard Smith08d6e032011-12-16 19:06:07 +00002855 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2856 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002857 CmdArgs.push_back(A->getValue());
Richard Smith08d6e032011-12-16 19:06:07 +00002858 }
2859
Daniel Dunbar55efe142009-11-04 06:24:47 +00002860 // Pass -fmessage-length=.
Daniel Dunbara28690e2009-11-30 08:40:54 +00002861 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar55efe142009-11-04 06:24:47 +00002862 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002863 CmdArgs.push_back(A->getValue());
Daniel Dunbar55efe142009-11-04 06:24:47 +00002864 } else {
2865 // If -fmessage-length=N was not specified, determine whether this is a
2866 // terminal and, if so, implicitly define -fmessage-length appropriately.
2867 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner5f9e2722011-07-23 10:55:15 +00002868 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar55efe142009-11-04 06:24:47 +00002869 }
2870
John McCalla880b192013-02-19 01:57:35 +00002871 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2872 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2873 options::OPT_fvisibility_ms_compat)) {
2874 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2875 CmdArgs.push_back("-fvisibility");
2876 CmdArgs.push_back(A->getValue());
2877 } else {
2878 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2879 CmdArgs.push_back("-fvisibility");
2880 CmdArgs.push_back("hidden");
2881 CmdArgs.push_back("-ftype-visibility");
2882 CmdArgs.push_back("default");
2883 }
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002884 }
2885
Douglas Gregor7cf84d62010-06-15 17:05:35 +00002886 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002887
Hans Wennborgde981f32012-06-28 08:01:44 +00002888 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2889
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002890 // -fhosted is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002891 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2892 KernelOrKext)
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002893 CmdArgs.push_back("-ffreestanding");
2894
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002895 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002896 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002897 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patelc69e1cf2010-09-30 19:05:55 +00002898 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel033be8b2011-11-04 20:05:58 +00002899 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christophere88c4512011-10-25 07:13:06 +00002900 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidt9e0b6472013-07-03 15:36:02 +00002901 // AltiVec language extensions aren't relevant for assembling.
2902 if (!isa<PreprocessJobAction>(JA) ||
2903 Output.getType() != types::TY_PP_Asm)
2904 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu246b6aa2012-06-26 18:18:47 +00002905 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2906 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier4574c3d2012-03-13 23:45:51 +00002907
Alexey Samsonov1b8f12d2013-08-19 09:14:21 +00002908 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Alexey Samsonov8bdc92c2013-08-09 07:42:13 +00002909 Sanitize.addArgs(getToolChain(), Args, CmdArgs);
Richard Smithc4dabad2012-11-05 22:04:41 +00002910
Will Dietz2d382d12012-12-30 20:53:28 +00002911 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2912 options::OPT_fno_sanitize_recover,
2913 true))
2914 CmdArgs.push_back("-fno-sanitize-recover");
2915
Chad Rosier78d85b12013-01-29 23:31:22 +00002916 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2917 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2918 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2919 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2920
Eric Christopher98654c92013-02-19 06:16:53 +00002921 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier4574c3d2012-03-13 23:45:51 +00002922 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002923 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00002924 getToolChain().getArch() == llvm::Triple::ppc64 ||
2925 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier4574c3d2012-03-13 23:45:51 +00002926 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00002927 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier4574c3d2012-03-13 23:45:51 +00002928
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00002929 if (getToolChain().SupportsProfiling())
2930 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00002931
2932 // -flax-vector-conversions is default.
2933 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2934 options::OPT_fno_lax_vector_conversions))
2935 CmdArgs.push_back("-fno-lax-vector-conversions");
2936
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002937 if (Args.getLastArg(options::OPT_fapple_kext))
2938 CmdArgs.push_back("-fapple-kext");
2939
David Blaikie940152f2012-06-14 18:55:27 +00002940 if (Args.hasFlag(options::OPT_frewrite_includes,
2941 options::OPT_fno_rewrite_includes, false))
2942 CmdArgs.push_back("-frewrite-includes");
2943
Fariborz Jahanian34e65772009-05-22 20:17:16 +00002944 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner182e0922009-04-21 05:34:31 +00002945 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregor4786c152010-08-19 20:24:43 +00002946 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002947 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2948 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnall7f18e672010-09-17 18:29:54 +00002949
2950 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2951 CmdArgs.push_back("-ftrapv-handler");
Richard Smith1d489cf2012-11-01 04:30:05 +00002952 CmdArgs.push_back(A->getValue());
David Chisnall7f18e672010-09-17 18:29:54 +00002953 }
2954
Bob Wilson71fd6cc2012-02-03 06:27:22 +00002955 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng49af1f32011-04-08 21:37:45 +00002956
Chandler Carruth5adb5a82011-03-27 00:04:55 +00002957 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2958 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2959 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2960 options::OPT_fno_wrapv)) {
2961 if (A->getOption().matches(options::OPT_fwrapv))
2962 CmdArgs.push_back("-fwrapv");
2963 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2964 options::OPT_fno_strict_overflow)) {
2965 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2966 CmdArgs.push_back("-fwrapv");
2967 }
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002968 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruthb26404a2013-08-08 08:34:35 +00002969 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
2970 options::OPT_fno_unroll_loops);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002971
Daniel Dunbar5345c392009-09-03 04:54:28 +00002972 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2973
Mahesha Sf3b52312012-10-27 07:47:56 +00002974
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002975 // -stack-protector=0 is default.
2976 unsigned StackProtectorLevel = 0;
Bill Wendling45483f72009-06-28 07:36:13 +00002977 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2978 options::OPT_fstack_protector_all,
2979 options::OPT_fstack_protector)) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002980 if (A->getOption().matches(options::OPT_fstack_protector))
2981 StackProtectorLevel = 1;
2982 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2983 StackProtectorLevel = 2;
Nico Weber2fef1112011-08-23 07:38:27 +00002984 } else {
2985 StackProtectorLevel =
2986 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2987 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002988 if (StackProtectorLevel) {
2989 CmdArgs.push_back("-stack-protector");
Chris Lattner5f9e2722011-07-23 10:55:15 +00002990 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002991 }
Chad Rosiera7afeb02012-08-21 16:16:06 +00002992
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002993 // --param ssp-buffer-size=
2994 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2995 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002996 StringRef Str((*it)->getValue());
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00002997 if (Str.startswith("ssp-buffer-size=")) {
2998 if (StackProtectorLevel) {
Chad Rosiera7afeb02012-08-21 16:16:06 +00002999 CmdArgs.push_back("-stack-protector-buffer-size");
3000 // FIXME: Verify the argument is a valid integer.
3001 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosiera7afeb02012-08-21 16:16:06 +00003002 }
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003003 (*it)->claim();
Chad Rosiera7afeb02012-08-21 16:16:06 +00003004 }
Bill Wendling45483f72009-06-28 07:36:13 +00003005 }
3006
Nick Lewycky4e785c92011-12-06 03:33:03 +00003007 // Translate -mstackrealign
3008 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3009 false)) {
3010 CmdArgs.push_back("-backend-option");
3011 CmdArgs.push_back("-force-align-stack");
3012 }
3013 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3014 false)) {
3015 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3016 }
3017
Joerg Sonnenbergere9d11db2011-12-05 23:05:23 +00003018 if (Args.hasArg(options::OPT_mstack_alignment)) {
3019 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3020 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopher1a584022011-05-02 21:18:22 +00003021 }
Chad Rosier586a0612012-11-29 00:42:06 +00003022 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golin02ab7d32013-08-24 14:44:41 +00003023 if (!KernelOrKext) {
Renato Golinb69f9e02013-08-28 23:56:07 +00003024 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3025 options::OPT_munaligned_access)) {
3026 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3027 CmdArgs.push_back("-backend-option");
3028 CmdArgs.push_back("-arm-strict-align");
3029 } else {
3030 CmdArgs.push_back("-backend-option");
3031 CmdArgs.push_back("-arm-no-strict-align");
3032 }
Renato Golin02ab7d32013-08-24 14:44:41 +00003033 }
Chad Rosier7e293272012-11-09 17:29:19 +00003034 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00003035
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003036 // Forward -f options with positive and negative forms; we translate
3037 // these by hand.
3038
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003039 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar2843c192011-02-04 17:24:47 +00003040 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003041 CmdArgs.push_back("-fapple-kext");
3042 if (!Args.hasArg(options::OPT_fbuiltin))
3043 CmdArgs.push_back("-fno-builtin");
Chad Rosier3d265502012-03-26 21:29:17 +00003044 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003045 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003046 // -fbuiltin is default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003047 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar53e84842009-11-19 04:55:23 +00003048 CmdArgs.push_back("-fno-builtin");
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003049
Nuno Lopesfc284482009-12-16 16:59:22 +00003050 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3051 options::OPT_fno_assume_sane_operator_new))
3052 CmdArgs.push_back("-fno-assume-sane-operator-new");
3053
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003054 // -fblocks=0 is default.
3055 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnalle6533ff2011-02-28 17:11:43 +00003056 getToolChain().IsBlocksDefault()) ||
3057 (Args.hasArg(options::OPT_fgnu_runtime) &&
3058 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3059 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003060 CmdArgs.push_back("-fblocks");
John McCall13db5cf2011-09-09 20:41:01 +00003061
3062 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3063 !getToolChain().hasBlocksRuntime())
3064 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall5e530af2009-11-17 19:33:30 +00003065 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003066
Douglas Gregor64554ba2012-01-18 15:19:58 +00003067 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3068 // users must also pass -fcxx-modules. The latter flag will disappear once the
3069 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorf43b7212013-01-16 01:23:41 +00003070 bool HaveModules = false;
Douglas Gregor64554ba2012-01-18 15:19:58 +00003071 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3072 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3073 options::OPT_fno_cxx_modules,
3074 false);
Douglas Gregorf43b7212013-01-16 01:23:41 +00003075 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor64554ba2012-01-18 15:19:58 +00003076 CmdArgs.push_back("-fmodules");
Douglas Gregorf43b7212013-01-16 01:23:41 +00003077 HaveModules = true;
3078 }
3079 }
3080
Daniel Jasper056ec122013-08-05 20:26:17 +00003081 // -fmodule-maps enables module map processing (off by default) for header
3082 // checking. It is implied by -fmodules.
3083 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3084 false)) {
3085 CmdArgs.push_back("-fmodule-maps");
3086 }
3087
Daniel Jasper95411412013-10-21 06:34:34 +00003088 // -fmodules-decluse checks that modules used are declared so (off by
3089 // default).
Daniel Jasperddd2dfc2013-09-24 09:14:14 +00003090 if (Args.hasFlag(options::OPT_fmodules_decluse,
3091 options::OPT_fno_modules_decluse,
3092 false)) {
Daniel Jasper097595a2013-09-29 12:40:54 +00003093 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperddd2dfc2013-09-24 09:14:14 +00003094 }
3095
Daniel Jasper95411412013-10-21 06:34:34 +00003096 // -fmodule-name specifies the module that is currently being built (or
3097 // used for header checking by -fmodule-maps).
3098 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3099 A->claim();
3100 A->render(Args, CmdArgs);
3101 }
3102
3103 // -fmodule-map-file can be used to specify a file containing module
3104 // definitions.
3105 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3106 A->claim();
3107 A->render(Args, CmdArgs);
3108 }
3109
Douglas Gregor953a61f2013-02-07 19:01:24 +00003110 // If a module path was provided, pass it along. Otherwise, use a temporary
3111 // directory.
3112 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3113 A->claim();
3114 if (HaveModules) {
3115 A->render(Args, CmdArgs);
3116 }
3117 } else if (HaveModules) {
3118 SmallString<128> DefaultModuleCache;
3119 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3120 DefaultModuleCache);
Douglas Gregor892b6fb2013-03-21 21:48:48 +00003121 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3122 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor250172a2013-02-07 22:59:12 +00003123 const char Arg[] = "-fmodules-cache-path=";
3124 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3125 Arg, Arg + strlen(Arg));
Douglas Gregor953a61f2013-02-07 19:01:24 +00003126 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3127 }
3128
3129 // Pass through all -fmodules-ignore-macro arguments.
3130 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregord44d2872013-03-25 21:19:16 +00003131 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3132 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor953a61f2013-02-07 19:01:24 +00003133
John McCall32579cf2010-04-09 19:12:06 +00003134 // -faccess-control is default.
John McCall7002f4c2010-04-09 19:03:51 +00003135 if (Args.hasFlag(options::OPT_fno_access_control,
3136 options::OPT_faccess_control,
John McCall32579cf2010-04-09 19:12:06 +00003137 false))
John McCall7002f4c2010-04-09 19:03:51 +00003138 CmdArgs.push_back("-fno-access-control");
John McCall3ddd6e02010-03-17 01:32:13 +00003139
Anders Carlssona4c24752010-11-21 00:09:52 +00003140 // -felide-constructors is the default.
3141 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3142 options::OPT_felide_constructors,
3143 false))
3144 CmdArgs.push_back("-fno-elide-constructors");
3145
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003146 // -frtti is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00003147 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smithc4dabad2012-11-05 22:04:41 +00003148 KernelOrKext) {
Daniel Dunbar53e84842009-11-19 04:55:23 +00003149 CmdArgs.push_back("-fno-rtti");
Mike Stump738f8c22009-07-31 23:15:31 +00003150
Richard Smithc4dabad2012-11-05 22:04:41 +00003151 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonovbb1071c2012-11-06 15:09:03 +00003152 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumi03c60762012-11-06 22:02:00 +00003153 std::string NoRttiArg =
Richard Smithc4dabad2012-11-05 22:04:41 +00003154 Args.getLastArg(options::OPT_mkernel,
3155 options::OPT_fapple_kext,
Richard Smith04fd3822012-11-06 01:12:02 +00003156 options::OPT_fno_rtti)->getAsString(Args);
Richard Smithc4dabad2012-11-05 22:04:41 +00003157 D.Diag(diag::err_drv_argument_not_allowed_with)
3158 << "-fsanitize=vptr" << NoRttiArg;
3159 }
3160 }
3161
Tony Linthicum96319392011-12-12 21:14:55 +00003162 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00003163 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum96319392011-12-12 21:14:55 +00003164 options::OPT_fno_short_enums,
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003165 getToolChain().getArch() ==
Tony Linthicum96319392011-12-12 21:14:55 +00003166 llvm::Triple::hexagon))
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00003167 CmdArgs.push_back("-fshort-enums");
3168
Daniel Dunbar1f95e652009-11-17 06:37:03 +00003169 // -fsigned-char is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00003170 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbar1f95e652009-11-17 06:37:03 +00003171 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar76743522009-11-29 02:39:08 +00003172 CmdArgs.push_back("-fno-signed-char");
Eli Friedman5a779732009-06-05 07:21:14 +00003173
Anders Carlssona508b7d2010-02-06 23:23:06 +00003174 // -fthreadsafe-static is default.
Michael J. Spencer20249a12010-10-21 03:16:25 +00003175 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssona508b7d2010-02-06 23:23:06 +00003176 options::OPT_fno_threadsafe_statics))
3177 CmdArgs.push_back("-fno-threadsafe-statics");
3178
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00003179 // -fuse-cxa-atexit is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00003180 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3181 options::OPT_fno_use_cxa_atexit,
3182 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum96319392011-12-12 21:14:55 +00003183 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003184 getToolChain().getArch() != llvm::Triple::hexagon) ||
Chad Rosierafc4baa2012-03-26 22:04:46 +00003185 KernelOrKext)
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00003186 CmdArgs.push_back("-fno-use-cxa-atexit");
3187
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003188 // -fms-extensions=0 is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00003189 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003190 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3191 CmdArgs.push_back("-fms-extensions");
3192
Francois Pichetae556082011-09-17 04:32:15 +00003193 // -fms-compatibility=0 is default.
Douglas Gregorba97b6e2011-10-24 15:49:38 +00003194 if (Args.hasFlag(options::OPT_fms_compatibility,
3195 options::OPT_fno_ms_compatibility,
3196 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3197 Args.hasFlag(options::OPT_fms_extensions,
3198 options::OPT_fno_ms_extensions,
3199 true))))
Francois Pichetae556082011-09-17 04:32:15 +00003200 CmdArgs.push_back("-fms-compatibility");
3201
Reid Kleckner8c64c182013-09-18 00:33:59 +00003202 // -fmsc-version=1700 is default.
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003203 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3204 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3205 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00003206 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003207 if (msc_ver.empty())
Reid Kleckner8c64c182013-09-18 00:33:59 +00003208 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003209 else
3210 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3211 }
3212
3213
Eric Christophercfc01e42013-02-18 00:38:31 +00003214 // -fno-borland-extensions is default.
Dawn Perchik400b6072010-09-02 23:59:25 +00003215 if (Args.hasFlag(options::OPT_fborland_extensions,
3216 options::OPT_fno_borland_extensions, false))
3217 CmdArgs.push_back("-fborland-extensions");
3218
Francois Pichet8efcc012011-09-01 16:38:08 +00003219 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3220 // needs it.
Francois Pichet8387e2a2011-04-22 22:18:13 +00003221 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3222 options::OPT_fno_delayed_template_parsing,
Francois Pichet8efcc012011-09-01 16:38:08 +00003223 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet805bc1f2011-08-26 00:22:34 +00003224 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet8387e2a2011-04-22 22:18:13 +00003225
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00003226 // -fgnu-keywords default varies depending on language; only pass if
3227 // specified.
3228 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbar40788d92010-04-24 17:56:39 +00003229 options::OPT_fno_gnu_keywords))
3230 A->render(Args, CmdArgs);
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00003231
Rafael Espindola01ba8542011-06-02 17:30:53 +00003232 if (Args.hasFlag(options::OPT_fgnu89_inline,
3233 options::OPT_fno_gnu89_inline,
3234 false))
Rafael Espindolafb3f4aa2011-06-02 16:13:27 +00003235 CmdArgs.push_back("-fgnu89-inline");
3236
Chad Rosierfc055f92012-03-15 22:31:42 +00003237 if (Args.hasArg(options::OPT_fno_inline))
3238 CmdArgs.push_back("-fno-inline");
3239
Chad Rosier634a4b12012-03-06 21:17:19 +00003240 if (Args.hasArg(options::OPT_fno_inline_functions))
3241 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier250008b2012-03-06 18:49:20 +00003242
John McCall260611a2012-06-20 06:18:46 +00003243 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall9f084a32011-07-06 00:26:06 +00003244
John McCall260611a2012-06-20 06:18:46 +00003245 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahaniana6f5cc32013-10-15 17:16:30 +00003246 // legacy is the default. Next runtime is always legacy dispatch and
3247 // -fno-objc-legacy-dispatch gets ignored silently.
3248 if (objcRuntime.isNonFragile() && !objcRuntime.isNeXTFamily()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003249 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3250 options::OPT_fno_objc_legacy_dispatch,
David Chisnall2c7886d2012-07-04 11:52:24 +00003251 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003252 getToolChain().getArch()))) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003253 if (getToolChain().UseObjCMixedDispatch())
3254 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3255 else
3256 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3257 }
3258 }
3259
Fariborz Jahanian3d145f62012-11-15 19:02:45 +00003260 // -fencode-extended-block-signature=1 is default.
3261 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3262 CmdArgs.push_back("-fencode-extended-block-signature");
3263 }
3264
John McCall9f084a32011-07-06 00:26:06 +00003265 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3266 // NOTE: This logic is duplicated in ToolChains.cpp.
3267 bool ARC = isObjCAutoRefCount(Args);
3268 if (ARC) {
John McCall0a7dd782012-08-21 02:47:43 +00003269 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis5840dd92012-02-29 03:43:52 +00003270
John McCall9f084a32011-07-06 00:26:06 +00003271 CmdArgs.push_back("-fobjc-arc");
3272
Chandler Carruth7ffa0322011-11-04 07:34:47 +00003273 // FIXME: It seems like this entire block, and several around it should be
3274 // wrapped in isObjC, but for now we just use it here as this is where it
3275 // was being used previously.
3276 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3277 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3278 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3279 else
3280 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3281 }
3282
John McCall9f084a32011-07-06 00:26:06 +00003283 // Allow the user to enable full exceptions code emission.
3284 // We define off for Objective-CC, on for Objective-C++.
3285 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3286 options::OPT_fno_objc_arc_exceptions,
3287 /*default*/ types::isCXX(InputType)))
3288 CmdArgs.push_back("-fobjc-arc-exceptions");
3289 }
3290
3291 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3292 // rewriter.
John McCall260611a2012-06-20 06:18:46 +00003293 if (rewriteKind != RK_None)
John McCall9f084a32011-07-06 00:26:06 +00003294 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003295
John McCall9f084a32011-07-06 00:26:06 +00003296 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3297 // takes precedence.
3298 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3299 if (!GCArg)
3300 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3301 if (GCArg) {
3302 if (ARC) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00003303 D.Diag(diag::err_drv_objc_gc_arr)
John McCall9f084a32011-07-06 00:26:06 +00003304 << GCArg->getAsString(Args);
3305 } else if (getToolChain().SupportsObjCGC()) {
3306 GCArg->render(Args, CmdArgs);
3307 } else {
3308 // FIXME: We should move this to a hard error.
Chris Lattner5f9e2722011-07-23 10:55:15 +00003309 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall9f084a32011-07-06 00:26:06 +00003310 << GCArg->getAsString(Args);
3311 }
3312 }
3313
John McCalld71315c2011-06-22 00:53:57 +00003314 // Add exception args.
3315 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall260611a2012-06-20 06:18:46 +00003316 KernelOrKext, objcRuntime, CmdArgs);
John McCalld71315c2011-06-22 00:53:57 +00003317
3318 if (getToolChain().UseSjLjExceptions())
3319 CmdArgs.push_back("-fsjlj-exceptions");
3320
3321 // C++ "sane" operator new.
Daniel Dunbar984eb862010-02-01 21:07:25 +00003322 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3323 options::OPT_fno_assume_sane_operator_new))
3324 CmdArgs.push_back("-fno-assume-sane-operator-new");
3325
Daniel Dunbarf35f14d2010-04-27 15:34:57 +00003326 // -fconstant-cfstrings is default, and may be subject to argument translation
3327 // on Darwin.
3328 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3329 options::OPT_fno_constant_cfstrings) ||
3330 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3331 options::OPT_mno_constant_cfstrings))
3332 CmdArgs.push_back("-fno-constant-cfstrings");
3333
John Thompsona6fda122009-11-05 20:14:16 +00003334 // -fshort-wchar default varies depending on platform; only
3335 // pass if specified.
Daniel Dunbar1744a352010-04-27 15:35:03 +00003336 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3337 A->render(Args, CmdArgs);
John Thompsona6fda122009-11-05 20:14:16 +00003338
Hans Wennborgb087a5d2013-07-31 23:39:13 +00003339 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003340 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00003341 options::OPT_fno_pascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00003342 false))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003343 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00003344
Daniel Dunbar88934e82011-10-05 21:04:55 +00003345 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3346 // -fno-pack-struct doesn't apply to -fpack-struct=.
3347 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloy8049c442012-05-02 07:56:14 +00003348 std::string PackStructStr = "-fpack-struct=";
Richard Smith1d489cf2012-11-01 04:30:05 +00003349 PackStructStr += A->getValue();
James Molloy8049c442012-05-02 07:56:14 +00003350 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar88934e82011-10-05 21:04:55 +00003351 } else if (Args.hasFlag(options::OPT_fpack_struct,
3352 options::OPT_fno_pack_struct, false)) {
James Molloy8049c442012-05-02 07:56:14 +00003353 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar88934e82011-10-05 21:04:55 +00003354 }
3355
Robert Lytton5f15f4d2013-08-13 09:43:10 +00003356 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003357 if (!Args.hasArg(options::OPT_fcommon))
3358 CmdArgs.push_back("-fno-common");
Chad Rosierec09b3e2012-03-26 21:35:40 +00003359 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003360 }
Daniel Dunbar88934e82011-10-05 21:04:55 +00003361
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003362 // -fcommon is default, only pass non-default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003363 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003364 CmdArgs.push_back("-fno-common");
3365
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003366 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003367 // -funsigned-bitfields.
Mike Stump1eb44332009-09-09 15:08:12 +00003368 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003369 options::OPT_funsigned_bitfields))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003370 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003371 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3372
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003373 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3374 if (!Args.hasFlag(options::OPT_ffor_scope,
3375 options::OPT_fno_for_scope))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003376 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003377 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3378
Jeffrey Yasskin0ea22fd2010-06-08 04:56:20 +00003379 // -fcaret-diagnostics is default.
3380 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3381 options::OPT_fno_caret_diagnostics, true))
3382 CmdArgs.push_back("-fno-caret-diagnostics");
3383
Daniel Dunbar49138fc2009-04-19 21:09:34 +00003384 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump1eb44332009-09-09 15:08:12 +00003385 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar49138fc2009-04-19 21:09:34 +00003386 options::OPT_fno_diagnostics_fixit_info))
3387 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003388
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003389 // Enable -fdiagnostics-show-option by default.
Mike Stump1eb44332009-09-09 15:08:12 +00003390 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003391 options::OPT_fno_diagnostics_show_option))
3392 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar838be482009-11-04 06:24:57 +00003393
Chris Lattner6fbe8392010-05-04 21:55:25 +00003394 if (const Arg *A =
3395 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3396 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smith1d489cf2012-11-01 04:30:05 +00003397 CmdArgs.push_back(A->getValue());
Chris Lattner6fbe8392010-05-04 21:55:25 +00003398 }
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003399
Douglas Gregorc9471b02011-05-21 17:07:29 +00003400 if (const Arg *A =
3401 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3402 CmdArgs.push_back("-fdiagnostics-format");
Richard Smith1d489cf2012-11-01 04:30:05 +00003403 CmdArgs.push_back(A->getValue());
Douglas Gregorc9471b02011-05-21 17:07:29 +00003404 }
3405
Chandler Carruthabaca7a2011-03-27 01:50:55 +00003406 if (Arg *A = Args.getLastArg(
3407 options::OPT_fdiagnostics_show_note_include_stack,
3408 options::OPT_fno_diagnostics_show_note_include_stack)) {
3409 if (A->getOption().matches(
3410 options::OPT_fdiagnostics_show_note_include_stack))
3411 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3412 else
3413 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3414 }
3415
Daniel Dunbar838be482009-11-04 06:24:57 +00003416 // Color diagnostics are the default, unless the terminal doesn't support
3417 // them.
Nico Weber9753d462013-04-17 21:52:44 +00003418 // Support both clang's -f[no-]color-diagnostics and gcc's
3419 // -f[no-]diagnostics-colors[=never|always|auto].
3420 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3421 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3422 it != ie; ++it) {
3423 const Option &O = (*it)->getOption();
3424 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3425 !O.matches(options::OPT_fdiagnostics_color) &&
3426 !O.matches(options::OPT_fno_color_diagnostics) &&
3427 !O.matches(options::OPT_fno_diagnostics_color) &&
3428 !O.matches(options::OPT_fdiagnostics_color_EQ))
3429 continue;
3430
3431 (*it)->claim();
3432 if (O.matches(options::OPT_fcolor_diagnostics) ||
3433 O.matches(options::OPT_fdiagnostics_color)) {
3434 ShowColors = Colors_On;
3435 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3436 O.matches(options::OPT_fno_diagnostics_color)) {
3437 ShowColors = Colors_Off;
3438 } else {
3439 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3440 StringRef value((*it)->getValue());
3441 if (value == "always")
3442 ShowColors = Colors_On;
3443 else if (value == "never")
3444 ShowColors = Colors_Off;
3445 else if (value == "auto")
3446 ShowColors = Colors_Auto;
3447 else
3448 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3449 << ("-fdiagnostics-color=" + value).str();
3450 }
3451 }
3452 if (ShowColors == Colors_On ||
3453 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar838be482009-11-04 06:24:57 +00003454 CmdArgs.push_back("-fcolor-diagnostics");
3455
Nico Rieck2956ef42013-09-11 00:38:02 +00003456 if (Args.hasArg(options::OPT_fansi_escape_codes))
3457 CmdArgs.push_back("-fansi-escape-codes");
3458
Daniel Dunbar75eb1d62009-06-08 21:13:54 +00003459 if (!Args.hasFlag(options::OPT_fshow_source_location,
3460 options::OPT_fno_show_source_location))
3461 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003462
Douglas Gregorc9471b02011-05-21 17:07:29 +00003463 if (!Args.hasFlag(options::OPT_fshow_column,
3464 options::OPT_fno_show_column,
3465 true))
3466 CmdArgs.push_back("-fno-show-column");
3467
Douglas Gregora0068fc2010-07-09 17:35:33 +00003468 if (!Args.hasFlag(options::OPT_fspell_checking,
3469 options::OPT_fno_spell_checking))
3470 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003471
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00003472
Chad Rosier15490fd2012-12-05 21:08:21 +00003473 // -fno-asm-blocks is default.
3474 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3475 false))
3476 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00003477
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003478 // Enable vectorization per default according to the optimization level
3479 // selected. For optimization levels that want vectorization we use the alias
3480 // option to simplify the hasFlag logic.
3481 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3482 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier31422792013-04-24 18:29:59 +00003483 options::OPT_fvectorize;
Chad Rosier31422792013-04-24 18:29:59 +00003484 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkelcf5691e2013-08-28 05:21:45 +00003485 options::OPT_fno_vectorize, EnableVec))
Chad Rosierc04d0932012-12-11 17:12:28 +00003486 CmdArgs.push_back("-vectorize-loops");
Chad Rosierc04d0932012-12-11 17:12:28 +00003487
Rafael Espindolad8360612013-08-01 23:56:42 +00003488 // -fslp-vectorize is default.
3489 if (Args.hasFlag(options::OPT_fslp_vectorize,
3490 options::OPT_fno_slp_vectorize, true))
Nadav Rotem50ea9632013-04-15 04:57:18 +00003491 CmdArgs.push_back("-vectorize-slp");
Hal Finkel443c9992012-12-11 19:59:32 +00003492
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003493 // -fno-slp-vectorize-aggressive is default.
3494 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00003495 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003496 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003497
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00003498 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3499 A->render(Args, CmdArgs);
3500
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003501 // -fdollars-in-identifiers default varies depending on platform and
3502 // language; only pass if specified.
Mike Stump1eb44332009-09-09 15:08:12 +00003503 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003504 options::OPT_fno_dollars_in_identifiers)) {
3505 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar8663b182009-12-16 20:10:18 +00003506 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003507 else
Daniel Dunbar8663b182009-12-16 20:10:18 +00003508 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003509 }
3510
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003511 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3512 // practical purposes.
Mike Stump1eb44332009-09-09 15:08:12 +00003513 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003514 options::OPT_fno_unit_at_a_time)) {
3515 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003516 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003517 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00003518
Eli Friedman19bda3a2011-11-02 01:53:16 +00003519 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3520 options::OPT_fno_apple_pragma_pack, false))
3521 CmdArgs.push_back("-fapple-pragma-pack");
3522
Eli Benderskyf3ecf892013-07-24 18:20:14 +00003523 // le32-specific flags:
3524 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3525 // by default.
3526 if (getToolChain().getArch() == llvm::Triple::le32) {
3527 CmdArgs.push_back("-fno-math-builtin");
3528 }
3529
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003530 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003531 //
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00003532 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003533#if 0
Bob Wilson905c45f2011-10-14 05:03:44 +00003534 if (getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003535 (getToolChain().getArch() == llvm::Triple::arm ||
3536 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003537 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3538 CmdArgs.push_back("-fno-builtin-strcat");
3539 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3540 CmdArgs.push_back("-fno-builtin-strcpy");
3541 }
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003542#endif
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003543
Daniel Dunbard98750f2011-03-18 21:23:40 +00003544 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump1eb44332009-09-09 15:08:12 +00003545 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbard98750f2011-03-18 21:23:40 +00003546 options::OPT_traditional_cpp)) {
3547 if (isa<PreprocessJobAction>(JA))
3548 CmdArgs.push_back("-traditional-cpp");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003549 else
Chris Lattner5f9e2722011-07-23 10:55:15 +00003550 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbard98750f2011-03-18 21:23:40 +00003551 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00003552
Daniel Dunbar1d460332009-03-18 10:01:51 +00003553 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnerd82df3a2009-04-12 01:56:53 +00003554 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremenek36f6e302011-11-11 00:07:43 +00003555
3556 // Handle serialized diagnostics.
3557 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3558 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smith1d489cf2012-11-01 04:30:05 +00003559 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremenek36f6e302011-11-11 00:07:43 +00003560 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003561
Ted Kremenek127ff2e2012-09-13 06:41:18 +00003562 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3563 CmdArgs.push_back("-fretain-comments-from-system-headers");
3564
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00003565 // Forward -fcomment-block-commands to -cc1.
3566 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenko6fd7d302013-04-10 15:35:17 +00003567 // Forward -fparse-all-comments to -cc1.
3568 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00003569
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003570 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3571 // parser.
Daniel Dunbar1d460332009-03-18 10:01:51 +00003572 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003573 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3574 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003575 (*it)->claim();
Daniel Dunbarfb36d212010-04-17 06:10:00 +00003576
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003577 // We translate this by hand to the -cc1 argument, since nightly test uses
3578 // it and developers have been trained to spell it with -mllvm.
Richard Smith1d489cf2012-11-01 04:30:05 +00003579 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003580 CmdArgs.push_back("-disable-llvm-optzns");
3581 else
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003582 (*it)->render(Args, CmdArgs);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003583 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003584
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00003585 if (Output.getType() == types::TY_Dependencies) {
3586 // Handled with other dependency code.
Daniel Dunbar115a7922009-03-19 07:29:38 +00003587 } else if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003588 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003589 CmdArgs.push_back(Output.getFilename());
3590 } else {
3591 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003592 }
3593
Daniel Dunbar1d460332009-03-18 10:01:51 +00003594 for (InputInfoList::const_iterator
3595 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3596 const InputInfo &II = *it;
3597 CmdArgs.push_back("-x");
Fariborz Jahaniana5ee0892012-09-28 19:05:17 +00003598 if (Args.hasArg(options::OPT_rewrite_objc))
3599 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3600 else
3601 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003602 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00003603 CmdArgs.push_back(II.getFilename());
Daniel Dunbar1d460332009-03-18 10:01:51 +00003604 else
Daniel Dunbar115a7922009-03-19 07:29:38 +00003605 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00003606 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003607
Chris Lattnere6113de2009-11-03 19:50:27 +00003608 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3609
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003610 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003611
3612 // Optionally embed the -cc1 level arguments into the debug info, for build
3613 // analysis.
3614 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar6e900472010-06-04 18:47:06 +00003615 ArgStringList OriginalArgs;
3616 for (ArgList::const_iterator it = Args.begin(),
3617 ie = Args.end(); it != ie; ++it)
3618 (*it)->render(Args, OriginalArgs);
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003619
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003620 SmallString<256> Flags;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003621 Flags += Exec;
Daniel Dunbar6e900472010-06-04 18:47:06 +00003622 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003623 Flags += " ";
Daniel Dunbar6e900472010-06-04 18:47:06 +00003624 Flags += OriginalArgs[i];
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003625 }
3626 CmdArgs.push_back("-dwarf-debug-flags");
3627 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3628 }
3629
Eric Christopher80190392013-02-22 20:12:52 +00003630 // Add the split debug info name to the command lines here so we
3631 // can propagate it to the backend.
3632 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00003633 getToolChain().getTriple().isOSLinux() &&
Eric Christopherff971d72013-02-22 23:50:16 +00003634 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopher80190392013-02-22 20:12:52 +00003635 const char *SplitDwarfOut;
3636 if (SplitDwarf) {
3637 CmdArgs.push_back("-split-dwarf-file");
3638 SplitDwarfOut = SplitDebugName(Args, Inputs);
3639 CmdArgs.push_back(SplitDwarfOut);
3640 }
3641
3642 // Finally add the compile command to the compilation.
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00003643 if (Args.hasArg(options::OPT__SLASH_fallback)) {
3644 tools::visualstudio::Compile CL(getToolChain());
3645 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3646 LinkingOutput);
3647 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3648 } else {
3649 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3650 }
3651
Daniel Dunbara880db02009-03-23 19:03:36 +00003652
Eric Christopherff971d72013-02-22 23:50:16 +00003653 // Handle the debug info splitting at object creation time if we're
3654 // creating an object.
Eric Christopher59320e72013-02-21 22:35:01 +00003655 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherff971d72013-02-22 23:50:16 +00003656 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopher80190392013-02-22 20:12:52 +00003657 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher59320e72013-02-21 22:35:01 +00003658
Roman Divackybe4c8702011-02-10 16:52:03 +00003659 if (Arg *A = Args.getLastArg(options::OPT_pg))
3660 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003661 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divackybe4c8702011-02-10 16:52:03 +00003662 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer20249a12010-10-21 03:16:25 +00003663
Daniel Dunbar68fb4692009-04-03 20:51:31 +00003664 // Claim some arguments which clang supports automatically.
3665
Daniel Dunbarf4046862010-04-15 06:18:42 +00003666 // -fpch-preprocess is used with gcc to add a special marker in the output to
3667 // include the PCH file. Clang's PTH solution is completely transparent, so we
3668 // do not need to deal with it at all.
Daniel Dunbar68fb4692009-04-03 20:51:31 +00003669 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003670
Daniel Dunbara880db02009-03-23 19:03:36 +00003671 // Claim some arguments which clang doesn't support, but we don't
3672 // care to warn the user about.
Daniel Dunbarcdd96862009-11-25 11:53:23 +00003673 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3674 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola035ff0c2011-02-28 23:29:45 +00003675
Rafael Espindola6155fbe2013-09-04 19:37:35 +00003676 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003677 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003678}
3679
John McCall260611a2012-06-20 06:18:46 +00003680/// Add options related to the Objective-C runtime/ABI.
3681///
3682/// Returns true if the runtime is non-fragile.
3683ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3684 ArgStringList &cmdArgs,
3685 RewriteKind rewriteKind) const {
3686 // Look for the controlling runtime option.
3687 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3688 options::OPT_fgnu_runtime,
3689 options::OPT_fobjc_runtime_EQ);
3690
3691 // Just forward -fobjc-runtime= to the frontend. This supercedes
3692 // options about fragility.
3693 if (runtimeArg &&
3694 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3695 ObjCRuntime runtime;
Richard Smith1d489cf2012-11-01 04:30:05 +00003696 StringRef value = runtimeArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003697 if (runtime.tryParse(value)) {
3698 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3699 << value;
3700 }
3701
3702 runtimeArg->render(args, cmdArgs);
3703 return runtime;
3704 }
3705
3706 // Otherwise, we'll need the ABI "version". Version numbers are
3707 // slightly confusing for historical reasons:
3708 // 1 - Traditional "fragile" ABI
3709 // 2 - Non-fragile ABI, version 1
3710 // 3 - Non-fragile ABI, version 2
3711 unsigned objcABIVersion = 1;
3712 // If -fobjc-abi-version= is present, use that to set the version.
3713 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003714 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003715 if (value == "1")
3716 objcABIVersion = 1;
3717 else if (value == "2")
3718 objcABIVersion = 2;
3719 else if (value == "3")
3720 objcABIVersion = 3;
3721 else
3722 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3723 << value;
3724 } else {
3725 // Otherwise, determine if we are using the non-fragile ABI.
3726 bool nonFragileABIIsDefault =
3727 (rewriteKind == RK_NonFragile ||
3728 (rewriteKind == RK_None &&
3729 getToolChain().IsObjCNonFragileABIDefault()));
3730 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3731 options::OPT_fno_objc_nonfragile_abi,
3732 nonFragileABIIsDefault)) {
3733 // Determine the non-fragile ABI version to use.
3734#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3735 unsigned nonFragileABIVersion = 1;
3736#else
3737 unsigned nonFragileABIVersion = 2;
3738#endif
3739
3740 if (Arg *abiArg = args.getLastArg(
3741 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003742 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003743 if (value == "1")
3744 nonFragileABIVersion = 1;
3745 else if (value == "2")
3746 nonFragileABIVersion = 2;
3747 else
3748 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3749 << value;
3750 }
3751
3752 objcABIVersion = 1 + nonFragileABIVersion;
3753 } else {
3754 objcABIVersion = 1;
3755 }
3756 }
3757
3758 // We don't actually care about the ABI version other than whether
3759 // it's non-fragile.
3760 bool isNonFragile = objcABIVersion != 1;
3761
3762 // If we have no runtime argument, ask the toolchain for its default runtime.
3763 // However, the rewriter only really supports the Mac runtime, so assume that.
3764 ObjCRuntime runtime;
3765 if (!runtimeArg) {
3766 switch (rewriteKind) {
3767 case RK_None:
3768 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3769 break;
3770 case RK_Fragile:
3771 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3772 break;
3773 case RK_NonFragile:
3774 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3775 break;
3776 }
3777
3778 // -fnext-runtime
3779 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3780 // On Darwin, make this use the default behavior for the toolchain.
3781 if (getToolChain().getTriple().isOSDarwin()) {
3782 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3783
3784 // Otherwise, build for a generic macosx port.
3785 } else {
3786 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3787 }
3788
3789 // -fgnu-runtime
3790 } else {
3791 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnalla422cd02012-07-04 10:37:03 +00003792 // Legacy behaviour is to target the gnustep runtime if we are i
3793 // non-fragile mode or the GCC runtime in fragile mode.
3794 if (isNonFragile)
David Chisnall891dac72012-10-16 15:11:55 +00003795 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnalla422cd02012-07-04 10:37:03 +00003796 else
3797 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall260611a2012-06-20 06:18:46 +00003798 }
3799
3800 cmdArgs.push_back(args.MakeArgString(
3801 "-fobjc-runtime=" + runtime.getAsString()));
3802 return runtime;
3803}
3804
Hans Wennborgb3574792013-08-08 00:17:41 +00003805void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
3806 unsigned RTOptionID = options::OPT__SLASH_MT;
3807
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00003808 if (Args.hasArg(options::OPT__SLASH_LDd))
3809 // The /LDd option implies /MTd. The dependent lib part can be overridden,
3810 // but defining _DEBUG is sticky.
3811 RTOptionID = options::OPT__SLASH_MTd;
3812
Hans Wennborg76da1782013-09-18 22:26:39 +00003813 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborgb3574792013-08-08 00:17:41 +00003814 RTOptionID = A->getOption().getID();
Hans Wennborg42ade492013-09-11 16:38:41 +00003815
Hans Wennborgb3574792013-08-08 00:17:41 +00003816 switch(RTOptionID) {
3817 case options::OPT__SLASH_MD:
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00003818 if (Args.hasArg(options::OPT__SLASH_LDd))
3819 CmdArgs.push_back("-D_DEBUG");
Hans Wennborgb3574792013-08-08 00:17:41 +00003820 CmdArgs.push_back("-D_MT");
3821 CmdArgs.push_back("-D_DLL");
3822 CmdArgs.push_back("--dependent-lib=msvcrt");
3823 break;
3824 case options::OPT__SLASH_MDd:
3825 CmdArgs.push_back("-D_DEBUG");
3826 CmdArgs.push_back("-D_MT");
3827 CmdArgs.push_back("-D_DLL");
3828 CmdArgs.push_back("--dependent-lib=msvcrtd");
3829 break;
3830 case options::OPT__SLASH_MT:
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00003831 if (Args.hasArg(options::OPT__SLASH_LDd))
3832 CmdArgs.push_back("-D_DEBUG");
Hans Wennborgb3574792013-08-08 00:17:41 +00003833 CmdArgs.push_back("-D_MT");
3834 CmdArgs.push_back("--dependent-lib=libcmt");
3835 break;
3836 case options::OPT__SLASH_MTd:
3837 CmdArgs.push_back("-D_DEBUG");
3838 CmdArgs.push_back("-D_MT");
3839 CmdArgs.push_back("--dependent-lib=libcmtd");
3840 break;
3841 default:
3842 llvm_unreachable("Unexpected option ID.");
3843 }
3844
Reid Klecknera32c5232013-08-08 19:33:10 +00003845 // This provides POSIX compatibility (maps 'open' to '_open'), which most
3846 // users want. The /Za flag to cl.exe turns this off, but it's not
3847 // implemented in clang.
3848 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborgf0f98912013-08-08 19:54:30 +00003849
3850 // FIXME: Make this default for the win32 triple.
3851 CmdArgs.push_back("-cxx-abi");
3852 CmdArgs.push_back("microsoft");
Hans Wennborg708002e2013-08-09 00:32:23 +00003853
3854 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
3855 A->render(Args, CmdArgs);
Hans Wennborgb6475522013-09-10 01:07:07 +00003856
3857 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
3858 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborg89e32742013-09-24 00:08:55 +00003859 if (Args.hasArg(options::OPT__SLASH_fallback))
3860 CmdArgs.push_back("msvc-fallback");
3861 else
3862 CmdArgs.push_back("msvc");
Hans Wennborgb6475522013-09-10 01:07:07 +00003863 }
Hans Wennborgb3574792013-08-08 00:17:41 +00003864}
3865
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003866void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003867 const InputInfo &Output,
3868 const InputInfoList &Inputs,
3869 const ArgList &Args,
3870 const char *LinkingOutput) const {
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003871 ArgStringList CmdArgs;
3872
3873 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3874 const InputInfo &Input = Inputs[0];
3875
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003876 // Don't warn about "clang -w -c foo.s"
3877 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003878 // and "clang -emit-llvm -c foo.s"
3879 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003880
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003881 // Invoke ourselves in -cc1as mode.
3882 //
3883 // FIXME: Implement custom jobs for internal actions.
3884 CmdArgs.push_back("-cc1as");
3885
3886 // Add the "effective" target triple.
3887 CmdArgs.push_back("-triple");
Chad Rosier61ab80a2011-09-20 20:44:06 +00003888 std::string TripleStr =
3889 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003890 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3891
3892 // Set the output mode, we currently only expect to be used as a real
3893 // assembler.
3894 CmdArgs.push_back("-filetype");
3895 CmdArgs.push_back("obj");
3896
Eric Christopher27e2b982012-12-18 00:31:10 +00003897 // Set the main file name, so that debug info works even with
3898 // -save-temps or preprocessed assembly.
3899 CmdArgs.push_back("-main-file-name");
3900 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3901
Rafael Espindolab330e402013-08-20 22:12:08 +00003902 // Add the target cpu
Rafael Espindola146dbbf2013-08-21 16:39:20 +00003903 const llvm::Triple &Triple = getToolChain().getTriple();
3904 std::string CPU = getCPUName(Args, Triple);
Rafael Espindolab330e402013-08-20 22:12:08 +00003905 if (!CPU.empty()) {
3906 CmdArgs.push_back("-target-cpu");
3907 CmdArgs.push_back(Args.MakeArgString(CPU));
3908 }
3909
Rafael Espindola146dbbf2013-08-21 16:39:20 +00003910 // Add the target features
3911 const Driver &D = getToolChain().getDriver();
3912 getTargetFeatures(D, Triple, Args, CmdArgs);
Jim Grosbachfc308292012-02-10 20:37:10 +00003913
Daniel Dunbar7f6f8c82011-03-17 17:37:29 +00003914 // Ignore explicit -force_cpusubtype_ALL option.
3915 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003916
Eric Christopher8f0a4032012-01-10 00:38:01 +00003917 // Determine the original source input.
3918 const Action *SourceAction = &JA;
3919 while (SourceAction->getKind() != Action::InputClass) {
3920 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3921 SourceAction = SourceAction->getInputs()[0];
3922 }
3923
Chandler Carruthd566df62012-12-17 21:40:04 +00003924 // Forward -g and handle debug info related flags, assuming we are dealing
3925 // with an actual assembly file.
Eric Christopher8f0a4032012-01-10 00:38:01 +00003926 if (SourceAction->getType() == types::TY_Asm ||
3927 SourceAction->getType() == types::TY_PP_Asm) {
3928 Args.ClaimAllArgs(options::OPT_g_Group);
3929 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3930 if (!A->getOption().matches(options::OPT_g0))
3931 CmdArgs.push_back("-g");
Chandler Carruthd566df62012-12-17 21:40:04 +00003932
3933 // Add the -fdebug-compilation-dir flag if needed.
3934 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderby02341792013-01-17 21:38:06 +00003935
3936 // Set the AT_producer to the clang version when using the integrated
3937 // assembler on assembly source files.
3938 CmdArgs.push_back("-dwarf-debug-producer");
3939 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopher8f0a4032012-01-10 00:38:01 +00003940 }
Kevin Enderby567003e2011-12-22 19:31:58 +00003941
3942 // Optionally embed the -cc1as level arguments into the debug info, for build
3943 // analysis.
3944 if (getToolChain().UseDwarfDebugFlags()) {
3945 ArgStringList OriginalArgs;
3946 for (ArgList::const_iterator it = Args.begin(),
3947 ie = Args.end(); it != ie; ++it)
3948 (*it)->render(Args, OriginalArgs);
3949
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003950 SmallString<256> Flags;
Kevin Enderby567003e2011-12-22 19:31:58 +00003951 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3952 Flags += Exec;
3953 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3954 Flags += " ";
3955 Flags += OriginalArgs[i];
3956 }
3957 CmdArgs.push_back("-dwarf-debug-flags");
3958 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3959 }
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003960
3961 // FIXME: Add -static support, once we have it.
3962
David Blaikie73168db2013-07-25 21:19:01 +00003963 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
3964 getToolChain().getDriver());
3965
Daniel Dunbar3df23252011-04-29 17:53:18 +00003966 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003967
3968 assert(Output.isFilename() && "Unexpected lipo output.");
3969 CmdArgs.push_back("-o");
3970 CmdArgs.push_back(Output.getFilename());
3971
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003972 assert(Input.isFilename() && "Invalid input.");
3973 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003974
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003975 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003976 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher708d72a2013-04-10 21:30:40 +00003977
3978 // Handle the debug info splitting at object creation time if we're
3979 // creating an object.
3980 // TODO: Currently only works on linux with newer objcopy.
3981 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00003982 getToolChain().getTriple().isOSLinux())
Eric Christopher708d72a2013-04-10 21:30:40 +00003983 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
3984 SplitDebugName(Args, Inputs));
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003985}
3986
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003987void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003988 const InputInfo &Output,
3989 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00003990 const ArgList &Args,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003991 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00003992 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003993 ArgStringList CmdArgs;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003994
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003995 for (ArgList::const_iterator
Daniel Dunbar1d460332009-03-18 10:01:51 +00003996 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003997 Arg *A = *it;
Michael J. Spencer91e06da2012-10-19 22:37:06 +00003998 if (forwardToGCC(A->getOption())) {
Daniel Dunbar2dffe2d2010-08-03 16:14:14 +00003999 // Don't forward any -g arguments to assembly steps.
4000 if (isa<AssembleJobAction>(JA) &&
4001 A->getOption().matches(options::OPT_g_Group))
4002 continue;
4003
NAKAMURA Takumi3c6c8222013-08-19 11:51:51 +00004004 // Don't forward any -W arguments to assembly and link steps.
4005 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4006 A->getOption().matches(options::OPT_W_Group))
4007 continue;
4008
Daniel Dunbar75877192009-03-19 07:55:12 +00004009 // It is unfortunate that we have to claim here, as this means
4010 // we will basically never report anything interesting for
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004011 // platforms using a generic gcc, even if we are just using gcc
4012 // to get to the assembler.
Daniel Dunbar75877192009-03-19 07:55:12 +00004013 A->claim();
Daniel Dunbar1d460332009-03-18 10:01:51 +00004014 A->render(Args, CmdArgs);
Daniel Dunbar75877192009-03-19 07:55:12 +00004015 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004016 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004017
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004018 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004019
4020 // If using a driver driver, force the arch.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004021 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson905c45f2011-10-14 05:03:44 +00004022 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004023 CmdArgs.push_back("-arch");
Daniel Dunbarbf54a062009-04-01 20:33:11 +00004024
4025 // FIXME: Remove these special cases.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004026 if (Arch == llvm::Triple::ppc)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004027 CmdArgs.push_back("ppc");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004028 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004029 CmdArgs.push_back("ppc64");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00004030 else if (Arch == llvm::Triple::ppc64le)
4031 CmdArgs.push_back("ppc64le");
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004032 else
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004033 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004034 }
4035
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004036 // Try to force gcc to match the tool chain we want, if we recognize
4037 // the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004038 //
4039 // FIXME: The triple class should directly provide the information we want
4040 // here.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004041 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004042 CmdArgs.push_back("-m32");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00004043 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4044 Arch == llvm::Triple::ppc64le)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004045 CmdArgs.push_back("-m64");
4046
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004047 if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004048 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00004049 CmdArgs.push_back(Output.getFilename());
4050 } else {
4051 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004052 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar115a7922009-03-19 07:29:38 +00004053 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004054
Tony Linthicum96319392011-12-12 21:14:55 +00004055 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4056 options::OPT_Xassembler);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004057
4058 // Only pass -x if gcc will understand it; otherwise hope gcc
4059 // understands the suffix correctly. The main use case this would go
4060 // wrong in is for linker inputs if they happened to have an odd
4061 // suffix; really the only way to get this to happen is a command
4062 // like '-x foobar a.c' which will treat a.c like a linker input.
4063 //
4064 // FIXME: For the linker case specifically, can we safely convert
4065 // inputs into '-Wl,' options?
4066 for (InputInfoList::const_iterator
4067 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4068 const InputInfo &II = *it;
Daniel Dunbara8304f62009-05-02 20:14:53 +00004069
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004070 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00004071 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4072 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004073 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004074 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004075 else if (II.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004076 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004077 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00004078 else if (II.getType() == types::TY_ModuleFile)
4079 D.Diag(diag::err_drv_no_module_support)
4080 << getToolChain().getTripleString();
Daniel Dunbara8304f62009-05-02 20:14:53 +00004081
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004082 if (types::canTypeBeUserSpecified(II.getType())) {
4083 CmdArgs.push_back("-x");
4084 CmdArgs.push_back(types::getTypeName(II.getType()));
4085 }
4086
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004087 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00004088 CmdArgs.push_back(II.getFilename());
Daniel Dunbar48f99942010-09-25 18:10:05 +00004089 else {
4090 const Arg &A = II.getInputArg();
4091
4092 // Reverse translate some rewritten options.
4093 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4094 CmdArgs.push_back("-lstdc++");
4095 continue;
4096 }
4097
Daniel Dunbar115a7922009-03-19 07:29:38 +00004098 // Don't render as input, we need gcc to do the translations.
Daniel Dunbar48f99942010-09-25 18:10:05 +00004099 A.render(Args, CmdArgs);
4100 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004101 }
4102
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00004103 const std::string customGCCName = D.getCCCGenericGCCName();
4104 const char *GCCName;
4105 if (!customGCCName.empty())
4106 GCCName = customGCCName.c_str();
Hans Wennborg76b86c22013-07-18 20:29:38 +00004107 else if (D.CCCIsCXX()) {
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00004108 GCCName = "g++";
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00004109 } else
4110 GCCName = "gcc";
4111
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004112 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004113 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004114 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004115}
4116
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004117void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4118 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004119 CmdArgs.push_back("-E");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004120}
4121
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004122void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
4123 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004124 // The type is good enough.
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004125}
4126
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004127void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4128 ArgStringList &CmdArgs) const {
Daniel Dunbar64952502010-02-11 03:16:21 +00004129 const Driver &D = getToolChain().getDriver();
4130
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004131 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00004132 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4133 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004134 CmdArgs.push_back("-c");
Daniel Dunbar64952502010-02-11 03:16:21 +00004135 else {
4136 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004137 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00004138 << getTypeName(JA.getType());
Michael J. Spencer20249a12010-10-21 03:16:25 +00004139
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004140 CmdArgs.push_back("-S");
Daniel Dunbar64952502010-02-11 03:16:21 +00004141 }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004142}
4143
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004144void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
4145 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004146 CmdArgs.push_back("-c");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004147}
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004148
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004149void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4150 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004151 // The types are (hopefully) good enough.
4152}
4153
Tony Linthicum96319392011-12-12 21:14:55 +00004154// Hexagon tools start.
4155void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4156 ArgStringList &CmdArgs) const {
4157
4158}
4159void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4160 const InputInfo &Output,
4161 const InputInfoList &Inputs,
4162 const ArgList &Args,
4163 const char *LinkingOutput) const {
4164
4165 const Driver &D = getToolChain().getDriver();
4166 ArgStringList CmdArgs;
4167
4168 std::string MarchString = "-march=";
Matthew Curtis67814152012-12-06 14:16:43 +00004169 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum96319392011-12-12 21:14:55 +00004170 CmdArgs.push_back(Args.MakeArgString(MarchString));
4171
4172 RenderExtraToolArgs(JA, CmdArgs);
4173
4174 if (Output.isFilename()) {
4175 CmdArgs.push_back("-o");
4176 CmdArgs.push_back(Output.getFilename());
4177 } else {
4178 assert(Output.isNothing() && "Unexpected output");
4179 CmdArgs.push_back("-fsyntax-only");
4180 }
4181
Matthew Curtis33c95f12012-12-06 17:49:03 +00004182 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4183 if (!SmallDataThreshold.empty())
4184 CmdArgs.push_back(
4185 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00004186
Matthew Curtis3d8d4222012-12-07 17:23:04 +00004187 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4188 options::OPT_Xassembler);
4189
Tony Linthicum96319392011-12-12 21:14:55 +00004190 // Only pass -x if gcc will understand it; otherwise hope gcc
4191 // understands the suffix correctly. The main use case this would go
4192 // wrong in is for linker inputs if they happened to have an odd
4193 // suffix; really the only way to get this to happen is a command
4194 // like '-x foobar a.c' which will treat a.c like a linker input.
4195 //
4196 // FIXME: For the linker case specifically, can we safely convert
4197 // inputs into '-Wl,' options?
4198 for (InputInfoList::const_iterator
4199 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4200 const InputInfo &II = *it;
4201
4202 // Don't try to pass LLVM or AST inputs to a generic gcc.
4203 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4204 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4205 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4206 << getToolChain().getTripleString();
4207 else if (II.getType() == types::TY_AST)
4208 D.Diag(clang::diag::err_drv_no_ast_support)
4209 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00004210 else if (II.getType() == types::TY_ModuleFile)
4211 D.Diag(diag::err_drv_no_module_support)
4212 << getToolChain().getTripleString();
Tony Linthicum96319392011-12-12 21:14:55 +00004213
4214 if (II.isFilename())
4215 CmdArgs.push_back(II.getFilename());
4216 else
4217 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4218 II.getInputArg().render(Args, CmdArgs);
4219 }
4220
4221 const char *GCCName = "hexagon-as";
4222 const char *Exec =
4223 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4224 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4225
4226}
4227void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4228 ArgStringList &CmdArgs) const {
4229 // The types are (hopefully) good enough.
4230}
4231
4232void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4233 const InputInfo &Output,
4234 const InputInfoList &Inputs,
4235 const ArgList &Args,
4236 const char *LinkingOutput) const {
4237
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004238 const toolchains::Hexagon_TC& ToolChain =
4239 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4240 const Driver &D = ToolChain.getDriver();
4241
Tony Linthicum96319392011-12-12 21:14:55 +00004242 ArgStringList CmdArgs;
4243
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004244 //----------------------------------------------------------------------------
4245 //
4246 //----------------------------------------------------------------------------
4247 bool hasStaticArg = Args.hasArg(options::OPT_static);
4248 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtis33c95f12012-12-06 17:49:03 +00004249 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004250 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4251 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4252 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4253 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum96319392011-12-12 21:14:55 +00004254
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004255 //----------------------------------------------------------------------------
4256 // Silence warnings for various options
4257 //----------------------------------------------------------------------------
Tony Linthicum96319392011-12-12 21:14:55 +00004258
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004259 Args.ClaimAllArgs(options::OPT_g_Group);
4260 Args.ClaimAllArgs(options::OPT_emit_llvm);
4261 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4262 // handled somewhere else.
4263 Args.ClaimAllArgs(options::OPT_static_libgcc);
4264
4265 //----------------------------------------------------------------------------
4266 //
4267 //----------------------------------------------------------------------------
4268 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4269 e = ToolChain.ExtraOpts.end();
4270 i != e; ++i)
4271 CmdArgs.push_back(i->c_str());
Tony Linthicum96319392011-12-12 21:14:55 +00004272
Matthew Curtis67814152012-12-06 14:16:43 +00004273 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4274 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop43115d42012-01-13 20:37:10 +00004275
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004276 if (buildingLib) {
4277 CmdArgs.push_back("-shared");
4278 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4279 // hexagon-gcc does
Tony Linthicum96319392011-12-12 21:14:55 +00004280 }
4281
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004282 if (hasStaticArg)
4283 CmdArgs.push_back("-static");
Tony Linthicum96319392011-12-12 21:14:55 +00004284
Matthew Curtis33c95f12012-12-06 17:49:03 +00004285 if (buildPIE && !buildingLib)
4286 CmdArgs.push_back("-pie");
4287
4288 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4289 if (!SmallDataThreshold.empty()) {
4290 CmdArgs.push_back(
4291 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4292 }
4293
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004294 //----------------------------------------------------------------------------
4295 //
4296 //----------------------------------------------------------------------------
4297 CmdArgs.push_back("-o");
4298 CmdArgs.push_back(Output.getFilename());
Tony Linthicum96319392011-12-12 21:14:55 +00004299
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004300 const std::string MarchSuffix = "/" + MarchString;
4301 const std::string G0Suffix = "/G0";
4302 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4303 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4304 + "/";
4305 const std::string StartFilesDir = RootDir
4306 + "hexagon/lib"
4307 + (buildingLib
4308 ? MarchG0Suffix : MarchSuffix);
4309
4310 //----------------------------------------------------------------------------
4311 // moslib
4312 //----------------------------------------------------------------------------
4313 std::vector<std::string> oslibs;
4314 bool hasStandalone= false;
4315
4316 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4317 ie = Args.filtered_end(); it != ie; ++it) {
4318 (*it)->claim();
4319 oslibs.push_back((*it)->getValue());
4320 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum96319392011-12-12 21:14:55 +00004321 }
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004322 if (oslibs.empty()) {
4323 oslibs.push_back("standalone");
4324 hasStandalone = true;
4325 }
Tony Linthicum96319392011-12-12 21:14:55 +00004326
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004327 //----------------------------------------------------------------------------
4328 // Start Files
4329 //----------------------------------------------------------------------------
4330 if (incStdLib && incStartFiles) {
4331
4332 if (!buildingLib) {
4333 if (hasStandalone) {
4334 CmdArgs.push_back(
4335 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4336 }
4337 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4338 }
4339 std::string initObj = useShared ? "/initS.o" : "/init.o";
4340 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4341 }
4342
4343 //----------------------------------------------------------------------------
4344 // Library Search Paths
4345 //----------------------------------------------------------------------------
4346 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4347 for (ToolChain::path_list::const_iterator
4348 i = LibPaths.begin(),
4349 e = LibPaths.end();
4350 i != e;
4351 ++i)
4352 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4353
4354 //----------------------------------------------------------------------------
4355 //
4356 //----------------------------------------------------------------------------
4357 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4358 Args.AddAllArgs(CmdArgs, options::OPT_e);
4359 Args.AddAllArgs(CmdArgs, options::OPT_s);
4360 Args.AddAllArgs(CmdArgs, options::OPT_t);
4361 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4362
4363 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4364
4365 //----------------------------------------------------------------------------
4366 // Libraries
4367 //----------------------------------------------------------------------------
4368 if (incStdLib && incDefLibs) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00004369 if (D.CCCIsCXX()) {
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004370 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4371 CmdArgs.push_back("-lm");
4372 }
4373
4374 CmdArgs.push_back("--start-group");
4375
4376 if (!buildingLib) {
4377 for(std::vector<std::string>::iterator i = oslibs.begin(),
4378 e = oslibs.end(); i != e; ++i)
4379 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4380 CmdArgs.push_back("-lc");
4381 }
4382 CmdArgs.push_back("-lgcc");
4383
4384 CmdArgs.push_back("--end-group");
4385 }
4386
4387 //----------------------------------------------------------------------------
4388 // End files
4389 //----------------------------------------------------------------------------
4390 if (incStdLib && incStartFiles) {
4391 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4392 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4393 }
4394
4395 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00004396 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum96319392011-12-12 21:14:55 +00004397}
4398// Hexagon tools end.
4399
Rafael Espindolacfed8282012-10-31 18:51:07 +00004400llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4401 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4402 // archs which Darwin doesn't use.
4403
4404 // The matching this routine does is fairly pointless, since it is neither the
4405 // complete architecture list, nor a reasonable subset. The problem is that
4406 // historically the driver driver accepts this and also ties its -march=
4407 // handling to the architecture name, so we need to be careful before removing
4408 // support for it.
4409
4410 // This code must be kept in sync with Clang's Darwin specific argument
4411 // translation.
4412
4413 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4414 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4415 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4416 .Case("ppc64", llvm::Triple::ppc64)
4417 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4418 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4419 llvm::Triple::x86)
4420 .Case("x86_64", llvm::Triple::x86_64)
4421 // This is derived from the driver driver.
Bob Wilson2503ebd2013-03-04 22:37:49 +00004422 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4423 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4424 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindolacfed8282012-10-31 18:51:07 +00004425 .Case("r600", llvm::Triple::r600)
4426 .Case("nvptx", llvm::Triple::nvptx)
4427 .Case("nvptx64", llvm::Triple::nvptx64)
4428 .Case("amdil", llvm::Triple::amdil)
4429 .Case("spir", llvm::Triple::spir)
4430 .Default(llvm::Triple::UnknownArch);
4431}
Tony Linthicum96319392011-12-12 21:14:55 +00004432
Bob Wilson66b8a662012-11-23 06:14:39 +00004433const char *Clang::getBaseInputName(const ArgList &Args,
4434 const InputInfoList &Inputs) {
Michael J. Spencer472ccff2010-12-18 00:19:12 +00004435 return Args.MakeArgString(
4436 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004437}
4438
Bob Wilson66b8a662012-11-23 06:14:39 +00004439const char *Clang::getBaseInputStem(const ArgList &Args,
4440 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004441 const char *Str = getBaseInputName(Args, Inputs);
4442
Chris Lattner657ca662011-01-16 08:14:11 +00004443 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar88137642009-09-09 22:32:48 +00004444 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004445
4446 return Str;
4447}
4448
Bob Wilson66b8a662012-11-23 06:14:39 +00004449const char *Clang::getDependencyFileName(const ArgList &Args,
4450 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004451 // FIXME: Think about this more.
4452 std::string Res;
4453
4454 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00004455 std::string Str(OutputOpt->getValue());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004456 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier30601782011-08-17 23:08:45 +00004457 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +00004458 Res = getBaseInputStem(Args, Inputs);
Chad Rosier30601782011-08-17 23:08:45 +00004459 }
Daniel Dunbar88137642009-09-09 22:32:48 +00004460 return Args.MakeArgString(Res + ".d");
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004461}
4462
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004463void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004464 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004465 const InputInfoList &Inputs,
4466 const ArgList &Args,
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004467 const char *LinkingOutput) const {
4468 ArgStringList CmdArgs;
4469
4470 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4471 const InputInfo &Input = Inputs[0];
4472
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004473 // Determine the original source input.
4474 const Action *SourceAction = &JA;
4475 while (SourceAction->getKind() != Action::InputClass) {
4476 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4477 SourceAction = SourceAction->getInputs()[0];
4478 }
4479
4480 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher88b7cf02011-08-19 00:30:14 +00004481 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004482 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004483 if (Args.hasArg(options::OPT_gstabs))
4484 CmdArgs.push_back("--gstabs");
4485 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson591ff152011-11-02 05:10:45 +00004486 CmdArgs.push_back("-g");
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004487 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004488
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004489 // Derived from asm spec.
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004490 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004491
Daniel Dunbarf5438e32010-07-22 01:47:22 +00004492 // Use -force_cpusubtype_ALL on x86 by default.
Eli Bendersky8f4269a2013-07-24 22:20:49 +00004493 if (getToolChain().getArch() == llvm::Triple::x86 ||
4494 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004495 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4496 CmdArgs.push_back("-force_cpusubtype_ALL");
4497
Eli Bendersky8f4269a2013-07-24 22:20:49 +00004498 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004499 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher59320e72013-02-21 22:35:01 +00004500 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004501 (!getDarwinToolChain().isTargetIPhoneOS() ||
4502 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4503 Args.hasArg(options::OPT_static)))
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004504 CmdArgs.push_back("-static");
4505
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004506 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4507 options::OPT_Xassembler);
4508
4509 assert(Output.isFilename() && "Unexpected lipo output.");
4510 CmdArgs.push_back("-o");
4511 CmdArgs.push_back(Output.getFilename());
4512
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004513 assert(Input.isFilename() && "Invalid input.");
4514 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004515
4516 // asm_final spec is empty.
4517
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004518 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004519 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004520 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004521}
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004522
David Blaikie99ba9e32011-12-20 02:48:34 +00004523void darwin::DarwinTool::anchor() {}
4524
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +00004525void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4526 ArgStringList &CmdArgs) const {
Chris Lattner5f9e2722011-07-23 10:55:15 +00004527 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbareeff4062010-01-22 02:04:58 +00004528
Daniel Dunbar02633b52009-03-26 16:23:12 +00004529 // Derived from darwin_arch spec.
4530 CmdArgs.push_back("-arch");
Daniel Dunbareeff4062010-01-22 02:04:58 +00004531 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004532
Daniel Dunbareeff4062010-01-22 02:04:58 +00004533 // FIXME: Is this needed anymore?
4534 if (ArchName == "arm")
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004535 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004536}
4537
Bill Wendling6acf8b42012-10-02 18:02:50 +00004538bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4539 // We only need to generate a temp path for LTO if we aren't compiling object
4540 // files. When compiling source files, we run 'dsymutil' after linking. We
4541 // don't run 'dsymutil' when compiling object files.
4542 for (InputInfoList::const_iterator
4543 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4544 if (it->getType() != types::TY_Object)
4545 return true;
4546
4547 return false;
4548}
4549
Daniel Dunbar748de8e2010-09-09 21:51:05 +00004550void darwin::Link::AddLinkArgs(Compilation &C,
4551 const ArgList &Args,
Bill Wendling6acf8b42012-10-02 18:02:50 +00004552 ArgStringList &CmdArgs,
4553 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004554 const Driver &D = getToolChain().getDriver();
Daniel Dunbarce911f52011-04-28 21:23:41 +00004555 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbar02633b52009-03-26 16:23:12 +00004556
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004557 unsigned Version[3] = { 0, 0, 0 };
4558 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4559 bool HadExtra;
Richard Smith1d489cf2012-11-01 04:30:05 +00004560 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004561 Version[1], Version[2], HadExtra) ||
4562 HadExtra)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004563 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004564 << A->getAsString(Args);
4565 }
4566
4567 // Newer linkers support -demangle, pass it if supported and not disabled by
4568 // the user.
Daniel Dunbard2d20882012-01-04 21:45:27 +00004569 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004570 // Don't pass -demangle to ld_classic.
4571 //
4572 // FIXME: This is a temporary workaround, ld should be handling this.
4573 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4574 Args.hasArg(options::OPT_static));
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004575 if (getToolChain().getArch() == llvm::Triple::x86) {
4576 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4577 options::OPT_Wl_COMMA),
4578 ie = Args.filtered_end(); it != ie; ++it) {
4579 const Arg *A = *it;
4580 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smith1d489cf2012-11-01 04:30:05 +00004581 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004582 UsesLdClassic = true;
4583 }
4584 }
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004585 if (!UsesLdClassic)
4586 CmdArgs.push_back("-demangle");
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004587 }
4588
Bob Wilsonbd77c592013-08-02 22:25:34 +00004589 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4590 CmdArgs.push_back("-export_dynamic");
4591
Bill Wendlingc35f9082012-11-16 23:03:00 +00004592 // If we are using LTO, then automatically create a temporary file path for
4593 // the linker to use, so that it's lifetime will extend past a possible
4594 // dsymutil step.
4595 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4596 const char *TmpPath = C.getArgs().MakeArgString(
4597 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4598 C.addTempFile(TmpPath);
4599 CmdArgs.push_back("-object_path_lto");
4600 CmdArgs.push_back(TmpPath);
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004601 }
4602
Daniel Dunbar02633b52009-03-26 16:23:12 +00004603 // Derived from the "link" spec.
4604 Args.AddAllArgs(CmdArgs, options::OPT_static);
4605 if (!Args.hasArg(options::OPT_static))
4606 CmdArgs.push_back("-dynamic");
4607 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4608 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4609 // here. How do we wish to handle such things?
4610 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004611
Daniel Dunbar02633b52009-03-26 16:23:12 +00004612 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara6d38492010-01-22 02:04:52 +00004613 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara6d38492010-01-22 02:04:52 +00004614 // FIXME: Why do this only on this path?
Daniel Dunbar8917dd42010-01-22 03:37:33 +00004615 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004616
4617 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4618 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4619 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4620
4621 Arg *A;
4622 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4623 (A = Args.getLastArg(options::OPT_current__version)) ||
4624 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004625 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004626 << A->getAsString(Args) << "-dynamiclib";
4627
4628 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4629 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4630 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4631 } else {
4632 CmdArgs.push_back("-dylib");
4633
4634 Arg *A;
4635 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4636 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4637 (A = Args.getLastArg(options::OPT_client__name)) ||
4638 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4639 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4640 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004641 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004642 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004643
Daniel Dunbar02633b52009-03-26 16:23:12 +00004644 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4645 "-dylib_compatibility_version");
4646 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4647 "-dylib_current_version");
4648
Daniel Dunbara6d38492010-01-22 02:04:52 +00004649 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004650
4651 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4652 "-dylib_install_name");
4653 }
4654
4655 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4656 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4657 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarce911f52011-04-28 21:23:41 +00004658 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004659 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004660 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4661 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4662 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4663 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4664 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4665 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar99ca47b2011-06-28 20:16:02 +00004666 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004667 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4668 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4669 Args.AddAllArgs(CmdArgs, options::OPT_init);
4670
Daniel Dunbarce911f52011-04-28 21:23:41 +00004671 // Add the deployment target.
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004672 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbarb7f5ef72011-04-30 04:22:58 +00004673
4674 // If we had an explicit -mios-simulator-version-min argument, honor that,
4675 // otherwise use the traditional deployment targets. We can't just check the
4676 // is-sim attribute because existing code follows this path, and the linker
4677 // may not handle the argument.
4678 //
4679 // FIXME: We may be able to remove this, once we can verify no one depends on
4680 // it.
4681 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4682 CmdArgs.push_back("-ios_simulator_version_min");
4683 else if (DarwinTC.isTargetIPhoneOS())
4684 CmdArgs.push_back("-iphoneos_version_min");
4685 else
4686 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004687 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarce911f52011-04-28 21:23:41 +00004688
Daniel Dunbar02633b52009-03-26 16:23:12 +00004689 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4690 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4691 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4692 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4693 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004694
Daniel Dunbar47e879d2010-07-13 23:31:40 +00004695 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4696 options::OPT_fno_pie,
4697 options::OPT_fno_PIE)) {
4698 if (A->getOption().matches(options::OPT_fpie) ||
4699 A->getOption().matches(options::OPT_fPIE))
4700 CmdArgs.push_back("-pie");
4701 else
4702 CmdArgs.push_back("-no_pie");
4703 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004704
4705 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4706 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4707 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4708 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4709 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4710 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4711 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4712 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4713 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4714 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4715 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4716 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4717 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4718 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4719 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4720 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004721
Daniel Dunbarcc957192011-05-02 21:03:47 +00004722 // Give --sysroot= preference, over the Apple specific behavior to also use
4723 // --isysroot as the syslibroot.
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004724 StringRef sysroot = C.getSysRoot();
4725 if (sysroot != "") {
Daniel Dunbarcc957192011-05-02 21:03:47 +00004726 CmdArgs.push_back("-syslibroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004727 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbarcc957192011-05-02 21:03:47 +00004728 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4729 CmdArgs.push_back("-syslibroot");
Richard Smith1d489cf2012-11-01 04:30:05 +00004730 CmdArgs.push_back(A->getValue());
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004731 }
4732
Daniel Dunbar02633b52009-03-26 16:23:12 +00004733 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4734 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4735 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4736 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4737 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004738 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004739 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4740 Args.AddAllArgs(CmdArgs, options::OPT_y);
4741 Args.AddLastArg(CmdArgs, options::OPT_w);
4742 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4743 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4744 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4745 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4746 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4747 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4748 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4749 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4750 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4751 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4752 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4753 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4754}
4755
4756void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004757 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004758 const InputInfoList &Inputs,
4759 const ArgList &Args,
Daniel Dunbar02633b52009-03-26 16:23:12 +00004760 const char *LinkingOutput) const {
4761 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbare0be8b12009-09-08 16:39:16 +00004762
Daniel Dunbar02633b52009-03-26 16:23:12 +00004763 // The logic here is derived from gcc's behavior; most of which
4764 // comes from specs (starting with link_command). Consult gcc for
4765 // more information.
Daniel Dunbar02633b52009-03-26 16:23:12 +00004766 ArgStringList CmdArgs;
4767
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00004768 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4769 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4770 options::OPT_ccc_arcmt_migrate)) {
4771 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4772 (*I)->claim();
4773 const char *Exec =
4774 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4775 CmdArgs.push_back(Output.getFilename());
4776 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4777 return;
4778 }
4779
Daniel Dunbar02633b52009-03-26 16:23:12 +00004780 // I'm not sure why this particular decomposition exists in gcc, but
4781 // we follow suite for ease of comparison.
Bill Wendling6acf8b42012-10-02 18:02:50 +00004782 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004783
Daniel Dunbar02633b52009-03-26 16:23:12 +00004784 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4785 Args.AddAllArgs(CmdArgs, options::OPT_s);
4786 Args.AddAllArgs(CmdArgs, options::OPT_t);
4787 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4788 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004789 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004790 Args.AddAllArgs(CmdArgs, options::OPT_r);
4791
Daniel Dunbar270073c2010-10-18 22:08:36 +00004792 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4793 // members of static archive libraries which implement Objective-C classes or
4794 // categories.
4795 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4796 CmdArgs.push_back("-ObjC");
Michael J. Spencer20249a12010-10-21 03:16:25 +00004797
Daniel Dunbar02633b52009-03-26 16:23:12 +00004798 CmdArgs.push_back("-o");
4799 CmdArgs.push_back(Output.getFilename());
4800
Chad Rosier18937312012-05-16 23:45:12 +00004801 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004802 !Args.hasArg(options::OPT_nostartfiles)) {
4803 // Derived from startfile spec.
4804 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004805 // Derived from darwin_dylib1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004806 if (getDarwinToolChain().isTargetIOSSimulator()) {
4807 // The simulator doesn't have a versioned crt1 file.
4808 CmdArgs.push_back("-ldylib1.o");
4809 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004810 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4811 CmdArgs.push_back("-ldylib1.o");
4812 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004813 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004814 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004815 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004816 CmdArgs.push_back("-ldylib1.10.5.o");
4817 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004818 } else {
4819 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004820 if (!Args.hasArg(options::OPT_static)) {
4821 // Derived from darwin_bundle1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004822 if (getDarwinToolChain().isTargetIOSSimulator()) {
4823 // The simulator doesn't have a versioned crt1 file.
4824 CmdArgs.push_back("-lbundle1.o");
4825 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004826 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4827 CmdArgs.push_back("-lbundle1.o");
4828 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004829 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004830 CmdArgs.push_back("-lbundle1.o");
4831 }
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004832 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004833 } else {
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00004834 if (Args.hasArg(options::OPT_pg) &&
4835 getToolChain().SupportsProfiling()) {
Daniel Dunbar02633b52009-03-26 16:23:12 +00004836 if (Args.hasArg(options::OPT_static) ||
4837 Args.hasArg(options::OPT_object) ||
4838 Args.hasArg(options::OPT_preload)) {
4839 CmdArgs.push_back("-lgcrt0.o");
4840 } else {
4841 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004842
Daniel Dunbar02633b52009-03-26 16:23:12 +00004843 // darwin_crt2 spec is empty.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004844 }
Bob Wilson4e6e7912012-07-04 00:18:41 +00004845 // By default on OS X 10.8 and later, we don't link with a crt1.o
4846 // file and the linker knows to use _main as the entry point. But,
4847 // when compiling with -pg, we need to link with the gcrt1.o file,
4848 // so pass the -no_new_main option to tell the linker to use the
4849 // "start" symbol as the entry point.
Bob Wilson1fc6e4f2012-07-03 20:42:10 +00004850 if (getDarwinToolChain().isTargetMacOS() &&
4851 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4852 CmdArgs.push_back("-no_new_main");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004853 } else {
4854 if (Args.hasArg(options::OPT_static) ||
4855 Args.hasArg(options::OPT_object) ||
4856 Args.hasArg(options::OPT_preload)) {
4857 CmdArgs.push_back("-lcrt0.o");
4858 } else {
4859 // Derived from darwin_crt1 spec.
Daniel Dunbar40355802011-03-31 17:12:33 +00004860 if (getDarwinToolChain().isTargetIOSSimulator()) {
4861 // The simulator doesn't have a versioned crt1 file.
4862 CmdArgs.push_back("-lcrt1.o");
4863 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004864 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4865 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004866 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004867 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004868 } else {
4869 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4870 CmdArgs.push_back("-lcrt1.o");
4871 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4872 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004873 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004874 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004875
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004876 // darwin_crt2 spec is empty.
4877 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004878 }
4879 }
4880 }
4881 }
4882
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004883 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4884 Args.hasArg(options::OPT_shared_libgcc) &&
4885 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar88137642009-09-09 22:32:48 +00004886 const char *Str =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004887 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar88137642009-09-09 22:32:48 +00004888 CmdArgs.push_back(Str);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004889 }
4890 }
4891
4892 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004893
Daniel Dunbar02633b52009-03-26 16:23:12 +00004894 if (Args.hasArg(options::OPT_fopenmp))
4895 // This is more complicated in gcc...
4896 CmdArgs.push_back("-lgomp");
4897
Douglas Gregor04e326b2012-05-15 21:00:27 +00004898 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4899
Bob Wilson63d9f3c2012-05-15 18:57:39 +00004900 if (isObjCRuntimeLinked(Args) &&
4901 !Args.hasArg(options::OPT_nostdlib) &&
4902 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004903 // Avoid linking compatibility stubs on i386 mac.
4904 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004905 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004906 // If we don't have ARC or subscripting runtime support, link in the
4907 // runtime stubs. We have to do this *before* adding any of the normal
4908 // linker inputs so that its initializer gets run first.
John McCall260611a2012-06-20 06:18:46 +00004909 ObjCRuntime runtime =
4910 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004911 // We use arclite library for both ARC and subscripting support.
John McCall0a7dd782012-08-21 02:47:43 +00004912 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall260611a2012-06-20 06:18:46 +00004913 !runtime.hasSubscripting())
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004914 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004915 }
Bob Wilson0b1c7152012-04-21 00:21:42 +00004916 CmdArgs.push_back("-framework");
4917 CmdArgs.push_back("Foundation");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004918 // Link libobj.
4919 CmdArgs.push_back("-lobjc");
John McCall9f084a32011-07-06 00:26:06 +00004920 }
John McCallf85e1932011-06-15 23:02:42 +00004921
Daniel Dunbar02633b52009-03-26 16:23:12 +00004922 if (LinkingOutput) {
4923 CmdArgs.push_back("-arch_multiple");
4924 CmdArgs.push_back("-final_output");
4925 CmdArgs.push_back(LinkingOutput);
4926 }
4927
Daniel Dunbar02633b52009-03-26 16:23:12 +00004928 if (Args.hasArg(options::OPT_fnested_functions))
4929 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004930
Daniel Dunbar02633b52009-03-26 16:23:12 +00004931 if (!Args.hasArg(options::OPT_nostdlib) &&
4932 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00004933 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar132e35d2010-09-17 01:20:05 +00004934 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbaredfa02b2009-04-08 06:06:21 +00004935
Daniel Dunbar02633b52009-03-26 16:23:12 +00004936 // link_ssp spec is empty.
4937
Daniel Dunbar6cd41542009-09-18 08:15:03 +00004938 // Let the tool chain choose which runtime library to link.
4939 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004940 }
4941
Chad Rosier18937312012-05-16 23:45:12 +00004942 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004943 !Args.hasArg(options::OPT_nostartfiles)) {
4944 // endfile_spec is empty.
4945 }
4946
4947 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4948 Args.AddAllArgs(CmdArgs, options::OPT_F);
4949
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004950 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004951 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004952 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar02633b52009-03-26 16:23:12 +00004953}
4954
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004955void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004956 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004957 const InputInfoList &Inputs,
4958 const ArgList &Args,
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004959 const char *LinkingOutput) const {
4960 ArgStringList CmdArgs;
4961
4962 CmdArgs.push_back("-create");
4963 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbara428df82009-03-24 00:24:37 +00004964
4965 CmdArgs.push_back("-output");
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004966 CmdArgs.push_back(Output.getFilename());
Daniel Dunbara428df82009-03-24 00:24:37 +00004967
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004968 for (InputInfoList::const_iterator
4969 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4970 const InputInfo &II = *it;
4971 assert(II.isFilename() && "Unexpected lipo input.");
4972 CmdArgs.push_back(II.getFilename());
4973 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004974 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004975 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004976 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004977}
Daniel Dunbar68a31d42009-03-31 17:45:15 +00004978
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004979void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004980 const InputInfo &Output,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004981 const InputInfoList &Inputs,
4982 const ArgList &Args,
4983 const char *LinkingOutput) const {
4984 ArgStringList CmdArgs;
4985
Daniel Dunbar03e92302011-05-09 17:23:16 +00004986 CmdArgs.push_back("-o");
4987 CmdArgs.push_back(Output.getFilename());
4988
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004989 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4990 const InputInfo &Input = Inputs[0];
4991 assert(Input.isFilename() && "Unexpected dsymutil input.");
4992 CmdArgs.push_back(Input.getFilename());
4993
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004994 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004995 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004996 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004997}
4998
Eric Christopherf8571862011-08-23 17:56:55 +00004999void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher27e2b982012-12-18 00:31:10 +00005000 const InputInfo &Output,
5001 const InputInfoList &Inputs,
5002 const ArgList &Args,
5003 const char *LinkingOutput) const {
Eric Christopherf8571862011-08-23 17:56:55 +00005004 ArgStringList CmdArgs;
5005 CmdArgs.push_back("--verify");
Eric Christopher1c79dc42012-02-06 19:13:09 +00005006 CmdArgs.push_back("--debug-info");
5007 CmdArgs.push_back("--eh-frame");
Eric Christopherb822f722012-02-06 19:43:51 +00005008 CmdArgs.push_back("--quiet");
Eric Christopherf8571862011-08-23 17:56:55 +00005009
5010 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5011 const InputInfo &Input = Inputs[0];
5012 assert(Input.isFilename() && "Unexpected verify input");
5013
5014 // Grabbing the output of the earlier dsymutil run.
5015 CmdArgs.push_back(Input.getFilename());
5016
5017 const char *Exec =
5018 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5019 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5020}
5021
David Chisnall31c46902012-02-15 13:39:01 +00005022void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5023 const InputInfo &Output,
5024 const InputInfoList &Inputs,
5025 const ArgList &Args,
5026 const char *LinkingOutput) const {
5027 ArgStringList CmdArgs;
5028
5029 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5030 options::OPT_Xassembler);
5031
5032 CmdArgs.push_back("-o");
5033 CmdArgs.push_back(Output.getFilename());
5034
5035 for (InputInfoList::const_iterator
5036 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5037 const InputInfo &II = *it;
5038 CmdArgs.push_back(II.getFilename());
5039 }
5040
5041 const char *Exec =
5042 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5043 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5044}
5045
5046
5047void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5048 const InputInfo &Output,
5049 const InputInfoList &Inputs,
5050 const ArgList &Args,
5051 const char *LinkingOutput) const {
5052 // FIXME: Find a real GCC, don't hard-code versions here
5053 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5054 const llvm::Triple &T = getToolChain().getTriple();
5055 std::string LibPath = "/usr/lib/";
5056 llvm::Triple::ArchType Arch = T.getArch();
5057 switch (Arch) {
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00005058 case llvm::Triple::x86:
5059 GCCLibPath +=
5060 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5061 break;
5062 case llvm::Triple::x86_64:
5063 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5064 GCCLibPath += "/4.5.2/amd64/";
5065 LibPath += "amd64/";
5066 break;
5067 default:
5068 llvm_unreachable("Unsupported architecture");
David Chisnall31c46902012-02-15 13:39:01 +00005069 }
5070
5071 ArgStringList CmdArgs;
5072
David Chisnall41d476d2012-02-29 15:06:12 +00005073 // Demangle C++ names in errors
5074 CmdArgs.push_back("-C");
5075
David Chisnall31c46902012-02-15 13:39:01 +00005076 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5077 (!Args.hasArg(options::OPT_shared))) {
5078 CmdArgs.push_back("-e");
5079 CmdArgs.push_back("_start");
5080 }
5081
5082 if (Args.hasArg(options::OPT_static)) {
5083 CmdArgs.push_back("-Bstatic");
5084 CmdArgs.push_back("-dn");
5085 } else {
5086 CmdArgs.push_back("-Bdynamic");
5087 if (Args.hasArg(options::OPT_shared)) {
5088 CmdArgs.push_back("-shared");
5089 } else {
5090 CmdArgs.push_back("--dynamic-linker");
5091 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5092 }
5093 }
5094
5095 if (Output.isFilename()) {
5096 CmdArgs.push_back("-o");
5097 CmdArgs.push_back(Output.getFilename());
5098 } else {
5099 assert(Output.isNothing() && "Invalid output.");
5100 }
5101
5102 if (!Args.hasArg(options::OPT_nostdlib) &&
5103 !Args.hasArg(options::OPT_nostartfiles)) {
5104 if (!Args.hasArg(options::OPT_shared)) {
5105 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5106 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00005107 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005108 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5109 } else {
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"));
5112 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005113 }
Hans Wennborg76b86c22013-07-18 20:29:38 +00005114 if (getToolChain().getDriver().CCCIsCXX())
David Chisnalle6dd6832012-03-13 14:14:54 +00005115 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005116 }
5117
5118 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5119
5120 Args.AddAllArgs(CmdArgs, options::OPT_L);
5121 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5122 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall165329c2012-02-28 17:10:04 +00005123 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnall31c46902012-02-15 13:39:01 +00005124
5125 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5126
5127 if (!Args.hasArg(options::OPT_nostdlib) &&
5128 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005129 if (getToolChain().getDriver().CCCIsCXX())
David Chisnalle58e6f92012-04-10 11:49:50 +00005130 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnallb6229592012-02-15 18:24:31 +00005131 CmdArgs.push_back("-lgcc_s");
David Chisnall165329c2012-02-28 17:10:04 +00005132 if (!Args.hasArg(options::OPT_shared)) {
5133 CmdArgs.push_back("-lgcc");
David Chisnall31c46902012-02-15 13:39:01 +00005134 CmdArgs.push_back("-lc");
David Chisnall7dbefe12012-02-28 20:06:45 +00005135 CmdArgs.push_back("-lm");
David Chisnall165329c2012-02-28 17:10:04 +00005136 }
David Chisnall31c46902012-02-15 13:39:01 +00005137 }
5138
5139 if (!Args.hasArg(options::OPT_nostdlib) &&
5140 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall165329c2012-02-28 17:10:04 +00005141 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005142 }
David Chisnalld1ac03e2012-02-16 16:00:47 +00005143 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005144
5145 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5146
5147 const char *Exec =
5148 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5149 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5150}
5151
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005152void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005153 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00005154 const InputInfoList &Inputs,
5155 const ArgList &Args,
5156 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005157 ArgStringList CmdArgs;
5158
5159 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5160 options::OPT_Xassembler);
5161
5162 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005163 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005164
5165 for (InputInfoList::const_iterator
5166 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5167 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005168 CmdArgs.push_back(II.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005169 }
5170
5171 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005172 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005173 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005174}
5175
5176void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005177 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00005178 const InputInfoList &Inputs,
5179 const ArgList &Args,
5180 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005181 ArgStringList CmdArgs;
5182
5183 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00005184 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005185 CmdArgs.push_back("-e");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005186 CmdArgs.push_back("_start");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005187 }
5188
5189 if (Args.hasArg(options::OPT_static)) {
5190 CmdArgs.push_back("-Bstatic");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005191 CmdArgs.push_back("-dn");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005192 } else {
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005193// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005194 CmdArgs.push_back("-Bdynamic");
5195 if (Args.hasArg(options::OPT_shared)) {
5196 CmdArgs.push_back("-shared");
5197 } else {
Edward O'Callaghan3cecc192009-10-16 19:44:18 +00005198 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005199 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5200 }
5201 }
5202
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005203 if (Output.isFilename()) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005204 CmdArgs.push_back("-o");
5205 CmdArgs.push_back(Output.getFilename());
5206 } else {
5207 assert(Output.isNothing() && "Invalid output.");
5208 }
5209
5210 if (!Args.hasArg(options::OPT_nostdlib) &&
5211 !Args.hasArg(options::OPT_nostartfiles)) {
5212 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00005213 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005214 getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005215 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005216 getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005217 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005218 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005219 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005220 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005221 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005222 }
Chris Lattner38e317d2010-07-07 16:01:42 +00005223 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005224 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005225 }
5226
Daniel Dunbar294691e2009-11-04 06:24:38 +00005227 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5228 + getToolChain().getTripleString()
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00005229 + "/4.2.4"));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005230
5231 Args.AddAllArgs(CmdArgs, options::OPT_L);
5232 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5233 Args.AddAllArgs(CmdArgs, options::OPT_e);
5234
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005235 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005236
5237 if (!Args.hasArg(options::OPT_nostdlib) &&
5238 !Args.hasArg(options::OPT_nodefaultlibs)) {
5239 // FIXME: For some reason GCC passes -lgcc before adding
5240 // the default system libraries. Just mimic this for now.
5241 CmdArgs.push_back("-lgcc");
5242
5243 if (Args.hasArg(options::OPT_pthread))
5244 CmdArgs.push_back("-pthread");
5245 if (!Args.hasArg(options::OPT_shared))
5246 CmdArgs.push_back("-lc");
5247 CmdArgs.push_back("-lgcc");
5248 }
5249
5250 if (!Args.hasArg(options::OPT_nostdlib) &&
5251 !Args.hasArg(options::OPT_nostartfiles)) {
5252 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005253 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005254 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005255 }
5256
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005257 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005258
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005259 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005260 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005261 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005262}
5263
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005264void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005265 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005266 const InputInfoList &Inputs,
5267 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005268 const char *LinkingOutput) const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005269 ArgStringList CmdArgs;
5270
5271 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5272 options::OPT_Xassembler);
5273
5274 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005275 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005276
5277 for (InputInfoList::const_iterator
5278 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5279 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005280 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005281 }
5282
5283 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005284 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005285 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005286}
5287
5288void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005289 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005290 const InputInfoList &Inputs,
5291 const ArgList &Args,
5292 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00005293 const Driver &D = getToolChain().getDriver();
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005294 ArgStringList CmdArgs;
5295
Rafael Espindola6cc2a682012-12-31 22:41:36 +00005296 // Silence warning for "clang -g foo.o -o foo"
5297 Args.ClaimAllArgs(options::OPT_g_Group);
5298 // and "clang -emit-llvm foo.o -o foo"
5299 Args.ClaimAllArgs(options::OPT_emit_llvm);
5300 // and for "clang -w foo.o -o foo". Other warning options are already
5301 // handled somewhere else.
5302 Args.ClaimAllArgs(options::OPT_w);
5303
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005304 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00005305 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005306 CmdArgs.push_back("-e");
5307 CmdArgs.push_back("__start");
5308 }
5309
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005310 if (Args.hasArg(options::OPT_static)) {
5311 CmdArgs.push_back("-Bstatic");
5312 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005313 if (Args.hasArg(options::OPT_rdynamic))
5314 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005315 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005316 CmdArgs.push_back("-Bdynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005317 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005318 CmdArgs.push_back("-shared");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005319 } else {
5320 CmdArgs.push_back("-dynamic-linker");
5321 CmdArgs.push_back("/usr/libexec/ld.so");
5322 }
5323 }
5324
Rafael Espindola9adba392013-06-05 04:28:55 +00005325 if (Args.hasArg(options::OPT_nopie))
5326 CmdArgs.push_back("-nopie");
5327
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005328 if (Output.isFilename()) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005329 CmdArgs.push_back("-o");
5330 CmdArgs.push_back(Output.getFilename());
5331 } else {
5332 assert(Output.isNothing() && "Invalid output.");
5333 }
5334
5335 if (!Args.hasArg(options::OPT_nostdlib) &&
5336 !Args.hasArg(options::OPT_nostartfiles)) {
5337 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman62d829a2011-12-15 02:15:56 +00005338 if (Args.hasArg(options::OPT_pg))
5339 CmdArgs.push_back(Args.MakeArgString(
5340 getToolChain().GetFilePath("gcrt0.o")));
5341 else
5342 CmdArgs.push_back(Args.MakeArgString(
5343 getToolChain().GetFilePath("crt0.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005344 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005345 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005346 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005347 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005348 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005349 }
5350 }
5351
Edward O'Callaghane7e18202009-10-28 15:13:08 +00005352 std::string Triple = getToolChain().getTripleString();
5353 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar294691e2009-11-04 06:24:38 +00005354 Triple.replace(0, 6, "amd64");
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00005355 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbar95c04572010-08-01 23:13:54 +00005356 "/4.2.1"));
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005357
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005358 Args.AddAllArgs(CmdArgs, options::OPT_L);
5359 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5360 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindola6cc2a682012-12-31 22:41:36 +00005361 Args.AddAllArgs(CmdArgs, options::OPT_s);
5362 Args.AddAllArgs(CmdArgs, options::OPT_t);
5363 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5364 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005365
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005366 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005367
5368 if (!Args.hasArg(options::OPT_nostdlib) &&
5369 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005370 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00005371 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman62d829a2011-12-15 02:15:56 +00005372 if (Args.hasArg(options::OPT_pg))
5373 CmdArgs.push_back("-lm_p");
5374 else
5375 CmdArgs.push_back("-lm");
Daniel Dunbar95c04572010-08-01 23:13:54 +00005376 }
5377
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005378 // FIXME: For some reason GCC passes -lgcc before adding
5379 // the default system libraries. Just mimic this for now.
5380 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005381
Eric Christopherdc6cc872012-09-13 06:32:34 +00005382 if (Args.hasArg(options::OPT_pthread)) {
5383 if (!Args.hasArg(options::OPT_shared) &&
5384 Args.hasArg(options::OPT_pg))
5385 CmdArgs.push_back("-lpthread_p");
5386 else
5387 CmdArgs.push_back("-lpthread");
5388 }
5389
Chandler Carruth657849c2011-12-17 22:32:42 +00005390 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherdc6cc872012-09-13 06:32:34 +00005391 if (Args.hasArg(options::OPT_pg))
Eli Friedman62d829a2011-12-15 02:15:56 +00005392 CmdArgs.push_back("-lc_p");
5393 else
5394 CmdArgs.push_back("-lc");
Chandler Carruth657849c2011-12-17 22:32:42 +00005395 }
Eric Christopherdc6cc872012-09-13 06:32:34 +00005396
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005397 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005398 }
5399
5400 if (!Args.hasArg(options::OPT_nostdlib) &&
5401 !Args.hasArg(options::OPT_nostartfiles)) {
5402 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005403 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005404 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005405 else
Chris Lattner38e317d2010-07-07 16:01:42 +00005406 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005407 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005408 }
5409
5410 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005411 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005412 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005413}
Ed Schoutenc66a5a32009-04-02 19:13:12 +00005414
Eli Friedman42f74f22012-08-08 23:57:20 +00005415void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5416 const InputInfo &Output,
5417 const InputInfoList &Inputs,
5418 const ArgList &Args,
5419 const char *LinkingOutput) const {
5420 ArgStringList CmdArgs;
5421
5422 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5423 options::OPT_Xassembler);
5424
5425 CmdArgs.push_back("-o");
5426 CmdArgs.push_back(Output.getFilename());
5427
5428 for (InputInfoList::const_iterator
5429 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5430 const InputInfo &II = *it;
5431 CmdArgs.push_back(II.getFilename());
5432 }
5433
5434 const char *Exec =
5435 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5436 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5437}
5438
5439void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5440 const InputInfo &Output,
5441 const InputInfoList &Inputs,
5442 const ArgList &Args,
5443 const char *LinkingOutput) const {
5444 const Driver &D = getToolChain().getDriver();
5445 ArgStringList CmdArgs;
5446
5447 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5448 (!Args.hasArg(options::OPT_shared))) {
5449 CmdArgs.push_back("-e");
5450 CmdArgs.push_back("__start");
5451 }
5452
5453 if (Args.hasArg(options::OPT_static)) {
5454 CmdArgs.push_back("-Bstatic");
5455 } else {
5456 if (Args.hasArg(options::OPT_rdynamic))
5457 CmdArgs.push_back("-export-dynamic");
5458 CmdArgs.push_back("--eh-frame-hdr");
5459 CmdArgs.push_back("-Bdynamic");
5460 if (Args.hasArg(options::OPT_shared)) {
5461 CmdArgs.push_back("-shared");
5462 } else {
5463 CmdArgs.push_back("-dynamic-linker");
5464 CmdArgs.push_back("/usr/libexec/ld.so");
5465 }
5466 }
5467
5468 if (Output.isFilename()) {
5469 CmdArgs.push_back("-o");
5470 CmdArgs.push_back(Output.getFilename());
5471 } else {
5472 assert(Output.isNothing() && "Invalid output.");
5473 }
5474
5475 if (!Args.hasArg(options::OPT_nostdlib) &&
5476 !Args.hasArg(options::OPT_nostartfiles)) {
5477 if (!Args.hasArg(options::OPT_shared)) {
5478 if (Args.hasArg(options::OPT_pg))
5479 CmdArgs.push_back(Args.MakeArgString(
5480 getToolChain().GetFilePath("gcrt0.o")));
5481 else
5482 CmdArgs.push_back(Args.MakeArgString(
5483 getToolChain().GetFilePath("crt0.o")));
5484 CmdArgs.push_back(Args.MakeArgString(
5485 getToolChain().GetFilePath("crtbegin.o")));
5486 } else {
5487 CmdArgs.push_back(Args.MakeArgString(
5488 getToolChain().GetFilePath("crtbeginS.o")));
5489 }
5490 }
5491
5492 Args.AddAllArgs(CmdArgs, options::OPT_L);
5493 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5494 Args.AddAllArgs(CmdArgs, options::OPT_e);
5495
5496 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5497
5498 if (!Args.hasArg(options::OPT_nostdlib) &&
5499 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005500 if (D.CCCIsCXX()) {
Eli Friedman42f74f22012-08-08 23:57:20 +00005501 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5502 if (Args.hasArg(options::OPT_pg))
5503 CmdArgs.push_back("-lm_p");
5504 else
5505 CmdArgs.push_back("-lm");
5506 }
5507
Rafael Espindola3667bbe2012-10-23 17:07:31 +00005508 if (Args.hasArg(options::OPT_pthread)) {
5509 if (!Args.hasArg(options::OPT_shared) &&
5510 Args.hasArg(options::OPT_pg))
5511 CmdArgs.push_back("-lpthread_p");
5512 else
5513 CmdArgs.push_back("-lpthread");
5514 }
5515
Eli Friedman42f74f22012-08-08 23:57:20 +00005516 if (!Args.hasArg(options::OPT_shared)) {
5517 if (Args.hasArg(options::OPT_pg))
5518 CmdArgs.push_back("-lc_p");
5519 else
5520 CmdArgs.push_back("-lc");
5521 }
5522
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00005523 StringRef MyArch;
5524 switch (getToolChain().getTriple().getArch()) {
5525 case llvm::Triple::arm:
5526 MyArch = "arm";
5527 break;
5528 case llvm::Triple::x86:
5529 MyArch = "i386";
5530 break;
5531 case llvm::Triple::x86_64:
5532 MyArch = "amd64";
5533 break;
5534 default:
5535 llvm_unreachable("Unsupported architecture");
5536 }
5537 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman42f74f22012-08-08 23:57:20 +00005538 }
5539
5540 if (!Args.hasArg(options::OPT_nostdlib) &&
5541 !Args.hasArg(options::OPT_nostartfiles)) {
5542 if (!Args.hasArg(options::OPT_shared))
5543 CmdArgs.push_back(Args.MakeArgString(
5544 getToolChain().GetFilePath("crtend.o")));
5545 else
5546 CmdArgs.push_back(Args.MakeArgString(
5547 getToolChain().GetFilePath("crtendS.o")));
5548 }
Eli Friedmanc9c48db2012-08-09 22:42:04 +00005549
5550 const char *Exec =
5551 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5552 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman42f74f22012-08-08 23:57:20 +00005553}
5554
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005555void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005556 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005557 const InputInfoList &Inputs,
5558 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005559 const char *LinkingOutput) const {
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005560 ArgStringList CmdArgs;
5561
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005562 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5563 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc55da4b2012-09-05 21:32:44 +00005564 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005565 CmdArgs.push_back("--32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005566 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky3393cef2011-06-04 07:37:31 +00005567 CmdArgs.push_back("-a32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005568 else if (getToolChain().getArch() == llvm::Triple::mips ||
5569 getToolChain().getArch() == llvm::Triple::mipsel ||
5570 getToolChain().getArch() == llvm::Triple::mips64 ||
5571 getToolChain().getArch() == llvm::Triple::mips64el) {
5572 StringRef CPUName;
5573 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00005574 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer20249a12010-10-21 03:16:25 +00005575
Eric Christopherc55da4b2012-09-05 21:32:44 +00005576 CmdArgs.push_back("-march");
5577 CmdArgs.push_back(CPUName.data());
5578
Eric Christopherc55da4b2012-09-05 21:32:44 +00005579 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00005580 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc55da4b2012-09-05 21:32:44 +00005581
5582 if (getToolChain().getArch() == llvm::Triple::mips ||
5583 getToolChain().getArch() == llvm::Triple::mips64)
5584 CmdArgs.push_back("-EB");
5585 else
5586 CmdArgs.push_back("-EL");
5587
5588 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5589 options::OPT_fpic, options::OPT_fno_pic,
5590 options::OPT_fPIE, options::OPT_fno_PIE,
5591 options::OPT_fpie, options::OPT_fno_pie);
5592 if (LastPICArg &&
5593 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5594 LastPICArg->getOption().matches(options::OPT_fpic) ||
5595 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5596 LastPICArg->getOption().matches(options::OPT_fpie))) {
5597 CmdArgs.push_back("-KPIC");
5598 }
Rafael Espindola27fa2362012-12-13 04:17:14 +00005599 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5600 getToolChain().getArch() == llvm::Triple::thumb) {
5601 CmdArgs.push_back("-mfpu=softvfp");
5602 switch(getToolChain().getTriple().getEnvironment()) {
5603 case llvm::Triple::GNUEABI:
5604 case llvm::Triple::EABI:
Anton Korobeynikovb234e742013-03-18 07:59:20 +00005605 CmdArgs.push_back("-meabi=5");
Rafael Espindola27fa2362012-12-13 04:17:14 +00005606 break;
5607
5608 default:
5609 CmdArgs.push_back("-matpcs");
5610 }
Eric Christopherc55da4b2012-09-05 21:32:44 +00005611 }
Eric Christophered734732010-03-02 02:41:08 +00005612
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005613 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5614 options::OPT_Xassembler);
5615
5616 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005617 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005618
5619 for (InputInfoList::const_iterator
5620 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5621 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005622 CmdArgs.push_back(II.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005623 }
5624
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005625 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005626 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005627 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005628}
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005629
5630void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005631 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005632 const InputInfoList &Inputs,
5633 const ArgList &Args,
Daniel Dunbara8304f62009-05-02 20:14:53 +00005634 const char *LinkingOutput) const {
Roman Divacky94380162012-08-28 15:09:03 +00005635 const toolchains::FreeBSD& ToolChain =
5636 static_cast<const toolchains::FreeBSD&>(getToolChain());
5637 const Driver &D = ToolChain.getDriver();
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005638 ArgStringList CmdArgs;
David Chisnalldfa210b2012-07-29 15:24:44 +00005639
5640 // Silence warning for "clang -g foo.o -o foo"
5641 Args.ClaimAllArgs(options::OPT_g_Group);
5642 // and "clang -emit-llvm foo.o -o foo"
5643 Args.ClaimAllArgs(options::OPT_emit_llvm);
5644 // and for "clang -w foo.o -o foo". Other warning options are already
5645 // handled somewhere else.
5646 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005647
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005648 if (!D.SysRoot.empty())
5649 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5650
Roman Divacky94380162012-08-28 15:09:03 +00005651 if (Args.hasArg(options::OPT_pie))
5652 CmdArgs.push_back("-pie");
5653
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005654 if (Args.hasArg(options::OPT_static)) {
5655 CmdArgs.push_back("-Bstatic");
5656 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005657 if (Args.hasArg(options::OPT_rdynamic))
5658 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005659 CmdArgs.push_back("--eh-frame-hdr");
5660 if (Args.hasArg(options::OPT_shared)) {
5661 CmdArgs.push_back("-Bshareable");
5662 } else {
5663 CmdArgs.push_back("-dynamic-linker");
5664 CmdArgs.push_back("/libexec/ld-elf.so.1");
5665 }
Roman Divacky94380162012-08-28 15:09:03 +00005666 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5667 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnalldfa210b2012-07-29 15:24:44 +00005668 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5669 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5670 CmdArgs.push_back("--hash-style=both");
5671 }
5672 }
5673 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005674 }
5675
5676 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5677 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005678 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005679 CmdArgs.push_back("-m");
5680 CmdArgs.push_back("elf_i386_fbsd");
5681 }
5682
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005683 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky000a6552011-06-04 07:40:24 +00005684 CmdArgs.push_back("-m");
Roman Divacky1052c1d2011-11-21 16:50:32 +00005685 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky000a6552011-06-04 07:40:24 +00005686 }
5687
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005688 if (Output.isFilename()) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005689 CmdArgs.push_back("-o");
5690 CmdArgs.push_back(Output.getFilename());
5691 } else {
5692 assert(Output.isNothing() && "Invalid output.");
5693 }
5694
5695 if (!Args.hasArg(options::OPT_nostdlib) &&
5696 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divacky94380162012-08-28 15:09:03 +00005697 const char *crt1 = NULL;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005698 if (!Args.hasArg(options::OPT_shared)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005699 if (Args.hasArg(options::OPT_pg))
Roman Divacky94380162012-08-28 15:09:03 +00005700 crt1 = "gcrt1.o";
5701 else if (Args.hasArg(options::OPT_pie))
5702 crt1 = "Scrt1.o";
5703 else
5704 crt1 = "crt1.o";
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005705 }
Roman Divacky94380162012-08-28 15:09:03 +00005706 if (crt1)
5707 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5708
5709 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5710
5711 const char *crtbegin = NULL;
5712 if (Args.hasArg(options::OPT_static))
5713 crtbegin = "crtbeginT.o";
5714 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5715 crtbegin = "crtbeginS.o";
5716 else
5717 crtbegin = "crtbegin.o";
5718
5719 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005720 }
5721
5722 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divacky94380162012-08-28 15:09:03 +00005723 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divacky58e5ac92011-03-01 17:53:14 +00005724 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5725 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005726 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005727 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5728 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnallc7363772010-08-15 22:58:12 +00005729 Args.AddAllArgs(CmdArgs, options::OPT_s);
5730 Args.AddAllArgs(CmdArgs, options::OPT_t);
5731 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5732 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005733
Roman Divacky94380162012-08-28 15:09:03 +00005734 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005735
5736 if (!Args.hasArg(options::OPT_nostdlib) &&
5737 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005738 if (D.CCCIsCXX()) {
Roman Divacky94380162012-08-28 15:09:03 +00005739 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divackyc16bb762011-02-10 16:59:40 +00005740 if (Args.hasArg(options::OPT_pg))
5741 CmdArgs.push_back("-lm_p");
5742 else
5743 CmdArgs.push_back("-lm");
Daniel Dunbar20022632010-02-17 08:07:51 +00005744 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005745 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5746 // the default system libraries. Just mimic this for now.
Roman Divackyc16bb762011-02-10 16:59:40 +00005747 if (Args.hasArg(options::OPT_pg))
5748 CmdArgs.push_back("-lgcc_p");
5749 else
5750 CmdArgs.push_back("-lgcc");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005751 if (Args.hasArg(options::OPT_static)) {
5752 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005753 } else if (Args.hasArg(options::OPT_pg)) {
5754 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005755 } else {
5756 CmdArgs.push_back("--as-needed");
5757 CmdArgs.push_back("-lgcc_s");
5758 CmdArgs.push_back("--no-as-needed");
5759 }
5760
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005761 if (Args.hasArg(options::OPT_pthread)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005762 if (Args.hasArg(options::OPT_pg))
5763 CmdArgs.push_back("-lpthread_p");
5764 else
5765 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005766 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005767
Roman Divackyc16bb762011-02-10 16:59:40 +00005768 if (Args.hasArg(options::OPT_pg)) {
5769 if (Args.hasArg(options::OPT_shared))
5770 CmdArgs.push_back("-lc");
5771 else
5772 CmdArgs.push_back("-lc_p");
5773 CmdArgs.push_back("-lgcc_p");
5774 } else {
5775 CmdArgs.push_back("-lc");
5776 CmdArgs.push_back("-lgcc");
5777 }
5778
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005779 if (Args.hasArg(options::OPT_static)) {
5780 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005781 } else if (Args.hasArg(options::OPT_pg)) {
5782 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005783 } else {
5784 CmdArgs.push_back("--as-needed");
5785 CmdArgs.push_back("-lgcc_s");
5786 CmdArgs.push_back("--no-as-needed");
5787 }
5788 }
5789
5790 if (!Args.hasArg(options::OPT_nostdlib) &&
5791 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyf6513812012-09-07 13:36:21 +00005792 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divacky94380162012-08-28 15:09:03 +00005793 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackyf6513812012-09-07 13:36:21 +00005794 else
5795 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divacky94380162012-08-28 15:09:03 +00005796 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005797 }
5798
Roman Divacky94380162012-08-28 15:09:03 +00005799 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005800
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005801 const char *Exec =
Roman Divacky94380162012-08-28 15:09:03 +00005802 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005803 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005804}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005805
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005806void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5807 const InputInfo &Output,
5808 const InputInfoList &Inputs,
5809 const ArgList &Args,
5810 const char *LinkingOutput) const {
5811 ArgStringList CmdArgs;
5812
5813 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5814 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005815 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005816 CmdArgs.push_back("--32");
5817
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005818 // Set byte order explicitly
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005819 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005820 CmdArgs.push_back("-EB");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005821 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005822 CmdArgs.push_back("-EL");
5823
5824 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5825 options::OPT_Xassembler);
5826
5827 CmdArgs.push_back("-o");
5828 CmdArgs.push_back(Output.getFilename());
5829
5830 for (InputInfoList::const_iterator
5831 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5832 const InputInfo &II = *it;
5833 CmdArgs.push_back(II.getFilename());
5834 }
5835
David Chisnall5adcec12011-09-27 22:03:18 +00005836 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005837 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5838}
5839
5840void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5841 const InputInfo &Output,
5842 const InputInfoList &Inputs,
5843 const ArgList &Args,
5844 const char *LinkingOutput) const {
5845 const Driver &D = getToolChain().getDriver();
5846 ArgStringList CmdArgs;
5847
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005848 if (!D.SysRoot.empty())
5849 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5850
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005851 if (Args.hasArg(options::OPT_static)) {
5852 CmdArgs.push_back("-Bstatic");
5853 } else {
5854 if (Args.hasArg(options::OPT_rdynamic))
5855 CmdArgs.push_back("-export-dynamic");
5856 CmdArgs.push_back("--eh-frame-hdr");
5857 if (Args.hasArg(options::OPT_shared)) {
5858 CmdArgs.push_back("-Bshareable");
5859 } else {
5860 CmdArgs.push_back("-dynamic-linker");
5861 CmdArgs.push_back("/libexec/ld.elf_so");
5862 }
5863 }
5864
5865 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5866 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005867 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005868 CmdArgs.push_back("-m");
5869 CmdArgs.push_back("elf_i386");
5870 }
5871
5872 if (Output.isFilename()) {
5873 CmdArgs.push_back("-o");
5874 CmdArgs.push_back(Output.getFilename());
5875 } else {
5876 assert(Output.isNothing() && "Invalid output.");
5877 }
5878
5879 if (!Args.hasArg(options::OPT_nostdlib) &&
5880 !Args.hasArg(options::OPT_nostartfiles)) {
5881 if (!Args.hasArg(options::OPT_shared)) {
5882 CmdArgs.push_back(Args.MakeArgString(
5883 getToolChain().GetFilePath("crt0.o")));
5884 CmdArgs.push_back(Args.MakeArgString(
5885 getToolChain().GetFilePath("crti.o")));
5886 CmdArgs.push_back(Args.MakeArgString(
5887 getToolChain().GetFilePath("crtbegin.o")));
5888 } else {
5889 CmdArgs.push_back(Args.MakeArgString(
5890 getToolChain().GetFilePath("crti.o")));
5891 CmdArgs.push_back(Args.MakeArgString(
5892 getToolChain().GetFilePath("crtbeginS.o")));
5893 }
5894 }
5895
5896 Args.AddAllArgs(CmdArgs, options::OPT_L);
5897 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5898 Args.AddAllArgs(CmdArgs, options::OPT_e);
5899 Args.AddAllArgs(CmdArgs, options::OPT_s);
5900 Args.AddAllArgs(CmdArgs, options::OPT_t);
5901 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5902 Args.AddAllArgs(CmdArgs, options::OPT_r);
5903
5904 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5905
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00005906 unsigned Major, Minor, Micro;
5907 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
5908 bool useLibgcc = true;
5909 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
5910 if (getToolChain().getArch() == llvm::Triple::x86 ||
5911 getToolChain().getArch() == llvm::Triple::x86_64)
5912 useLibgcc = false;
5913 }
5914
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005915 if (!Args.hasArg(options::OPT_nostdlib) &&
5916 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005917 if (D.CCCIsCXX()) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005918 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5919 CmdArgs.push_back("-lm");
5920 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005921 if (Args.hasArg(options::OPT_pthread))
5922 CmdArgs.push_back("-lpthread");
5923 CmdArgs.push_back("-lc");
5924
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00005925 if (useLibgcc) {
5926 if (Args.hasArg(options::OPT_static)) {
5927 // libgcc_eh depends on libc, so resolve as much as possible,
5928 // pull in any new requirements from libc and then get the rest
5929 // of libgcc.
5930 CmdArgs.push_back("-lgcc_eh");
5931 CmdArgs.push_back("-lc");
5932 CmdArgs.push_back("-lgcc");
5933 } else {
5934 CmdArgs.push_back("-lgcc");
5935 CmdArgs.push_back("--as-needed");
5936 CmdArgs.push_back("-lgcc_s");
5937 CmdArgs.push_back("--no-as-needed");
5938 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005939 }
5940 }
5941
5942 if (!Args.hasArg(options::OPT_nostdlib) &&
5943 !Args.hasArg(options::OPT_nostartfiles)) {
5944 if (!Args.hasArg(options::OPT_shared))
5945 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5946 "crtend.o")));
5947 else
5948 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5949 "crtendS.o")));
5950 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5951 "crtn.o")));
5952 }
5953
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005954 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005955
David Chisnall5adcec12011-09-27 22:03:18 +00005956 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005957 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5958}
5959
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00005960void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5961 const InputInfo &Output,
5962 const InputInfoList &Inputs,
5963 const ArgList &Args,
5964 const char *LinkingOutput) const {
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005965 ArgStringList CmdArgs;
5966
5967 // Add --32/--64 to make sure we get the format we want.
5968 // This is incomplete
5969 if (getToolChain().getArch() == llvm::Triple::x86) {
5970 CmdArgs.push_back("--32");
5971 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5972 CmdArgs.push_back("--64");
Eli Friedman7972c882011-11-28 23:46:52 +00005973 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5974 CmdArgs.push_back("-a32");
5975 CmdArgs.push_back("-mppc");
5976 CmdArgs.push_back("-many");
5977 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5978 CmdArgs.push_back("-a64");
5979 CmdArgs.push_back("-mppc64");
5980 CmdArgs.push_back("-many");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00005981 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
5982 CmdArgs.push_back("-a64");
5983 CmdArgs.push_back("-mppc64le");
5984 CmdArgs.push_back("-many");
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005985 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00005986 StringRef MArch = getToolChain().getArchName();
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005987 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5988 CmdArgs.push_back("-mfpu=neon");
Bernard Ogden80e90c22013-10-24 18:32:41 +00005989 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a")
5990 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00005991
5992 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5993 getToolChain().getTriple());
5994 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00005995
5996 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5997 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5998 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanakac85900f2011-11-30 19:31:38 +00005999 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6000 getToolChain().getArch() == llvm::Triple::mipsel ||
6001 getToolChain().getArch() == llvm::Triple::mips64 ||
6002 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan073a7802012-04-07 22:31:29 +00006003 StringRef CPUName;
6004 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00006005 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanakac85900f2011-11-30 19:31:38 +00006006
Simon Atanasyan073a7802012-04-07 22:31:29 +00006007 CmdArgs.push_back("-march");
6008 CmdArgs.push_back(CPUName.data());
6009
Simon Atanasyan073a7802012-04-07 22:31:29 +00006010 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00006011 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan5f0a1c12012-04-06 19:15:24 +00006012
6013 if (getToolChain().getArch() == llvm::Triple::mips ||
6014 getToolChain().getArch() == llvm::Triple::mips64)
6015 CmdArgs.push_back("-EB");
6016 else
6017 CmdArgs.push_back("-EL");
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00006018
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00006019 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6020 if (StringRef(A->getValue()) == "2008")
6021 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6022 }
6023
Simon Atanasyan9dbfc612013-04-30 07:47:13 +00006024 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6025 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6026 options::OPT_mno_micromips);
6027 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6028 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6029
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00006030 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6031 options::OPT_fpic, options::OPT_fno_pic,
6032 options::OPT_fPIE, options::OPT_fno_PIE,
6033 options::OPT_fpie, options::OPT_fno_pie);
6034 if (LastPICArg &&
6035 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6036 LastPICArg->getOption().matches(options::OPT_fpic) ||
6037 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6038 LastPICArg->getOption().matches(options::OPT_fpie))) {
6039 CmdArgs.push_back("-KPIC");
6040 }
Ulrich Weigandb8409212013-05-06 16:26:41 +00006041 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00006042 // Always pass an -march option, since our default of z10 is later
6043 // than the GNU assembler's default.
6044 StringRef CPUName = getSystemZTargetCPU(Args);
6045 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006046 }
6047
6048 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6049 options::OPT_Xassembler);
6050
6051 CmdArgs.push_back("-o");
6052 CmdArgs.push_back(Output.getFilename());
6053
6054 for (InputInfoList::const_iterator
6055 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6056 const InputInfo &II = *it;
6057 CmdArgs.push_back(II.getFilename());
6058 }
6059
6060 const char *Exec =
6061 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6062 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopherc47b6f32013-06-05 23:58:15 +00006063
6064 // Handle the debug info splitting at object creation time if we're
6065 // creating an object.
6066 // TODO: Currently only works on linux with newer objcopy.
6067 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00006068 getToolChain().getTriple().isOSLinux())
Eric Christopherc47b6f32013-06-05 23:58:15 +00006069 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6070 SplitDebugName(Args, Inputs));
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006071}
6072
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006073static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6074 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chien94a71422012-09-02 09:30:11 +00006075 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth68f94db2013-03-04 02:07:55 +00006076 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6077 Args.hasArg(options::OPT_static);
Hans Wennborg76b86c22013-07-18 20:29:38 +00006078 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006079 CmdArgs.push_back("-lgcc");
6080
Logan Chien529a73d2012-11-19 12:04:11 +00006081 if (StaticLibgcc || isAndroid) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006082 if (D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006083 CmdArgs.push_back("-lgcc");
6084 } else {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006085 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006086 CmdArgs.push_back("--as-needed");
6087 CmdArgs.push_back("-lgcc_s");
Hans Wennborg76b86c22013-07-18 20:29:38 +00006088 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006089 CmdArgs.push_back("--no-as-needed");
6090 }
6091
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006092 if (StaticLibgcc && !isAndroid)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006093 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg76b86c22013-07-18 20:29:38 +00006094 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006095 CmdArgs.push_back("-lgcc");
Logan Chien529a73d2012-11-19 12:04:11 +00006096
6097 // According to Android ABI, we have to link with libdl if we are
6098 // linking with non-static libgcc.
6099 //
6100 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6101 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6102 if (isAndroid && !StaticLibgcc)
6103 CmdArgs.push_back("-ldl");
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006104}
6105
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00006106static bool hasMipsN32ABIArg(const ArgList &Args) {
6107 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smith1d489cf2012-11-01 04:30:05 +00006108 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00006109}
6110
Peter Collingbournebdaa1342013-05-27 21:40:20 +00006111static StringRef getLinuxDynamicLinker(const ArgList &Args,
6112 const toolchains::Linux &ToolChain) {
6113 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6114 return "/system/bin/linker";
6115 else if (ToolChain.getArch() == llvm::Triple::x86)
6116 return "/lib/ld-linux.so.2";
6117 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6118 return "/lib/ld-linux-aarch64.so.1";
6119 else if (ToolChain.getArch() == llvm::Triple::arm ||
6120 ToolChain.getArch() == llvm::Triple::thumb) {
6121 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6122 return "/lib/ld-linux-armhf.so.3";
6123 else
6124 return "/lib/ld-linux.so.3";
6125 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6126 ToolChain.getArch() == llvm::Triple::mipsel)
6127 return "/lib/ld.so.1";
6128 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6129 ToolChain.getArch() == llvm::Triple::mips64el) {
6130 if (hasMipsN32ABIArg(Args))
6131 return "/lib32/ld.so.1";
6132 else
6133 return "/lib64/ld.so.1";
6134 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6135 return "/lib/ld.so.1";
6136 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00006137 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbournebdaa1342013-05-27 21:40:20 +00006138 ToolChain.getArch() == llvm::Triple::systemz)
6139 return "/lib64/ld64.so.1";
6140 else
6141 return "/lib64/ld-linux-x86-64.so.2";
6142}
6143
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00006144void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6145 const InputInfo &Output,
6146 const InputInfoList &Inputs,
6147 const ArgList &Args,
6148 const char *LinkingOutput) const {
Rafael Espindolac1da9812010-11-07 20:14:31 +00006149 const toolchains::Linux& ToolChain =
6150 static_cast<const toolchains::Linux&>(getToolChain());
6151 const Driver &D = ToolChain.getDriver();
Rafael Espindola715852c2012-11-02 20:41:30 +00006152 const bool isAndroid =
6153 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Alexey Samsonov1b8f12d2013-08-19 09:14:21 +00006154 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006155 const bool IsPIE =
6156 !Args.hasArg(options::OPT_shared) &&
Alexey Samsonov8bdc92c2013-08-09 07:42:13 +00006157 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow(ToolChain));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006158
Rafael Espindolac1da9812010-11-07 20:14:31 +00006159 ArgStringList CmdArgs;
6160
Rafael Espindola26f14c32010-11-15 18:28:16 +00006161 // Silence warning for "clang -g foo.o -o foo"
6162 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00006163 // and "clang -emit-llvm foo.o -o foo"
6164 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnalldfa210b2012-07-29 15:24:44 +00006165 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindola7f6458b2010-11-17 20:37:10 +00006166 // handled somewhere else.
6167 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola26f14c32010-11-15 18:28:16 +00006168
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006169 if (!D.SysRoot.empty())
6170 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006171
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006172 if (IsPIE)
Rafael Espindolafdda1712010-11-17 22:26:15 +00006173 CmdArgs.push_back("-pie");
6174
Rafael Espindoladc1b76d2010-11-07 22:57:16 +00006175 if (Args.hasArg(options::OPT_rdynamic))
6176 CmdArgs.push_back("-export-dynamic");
6177
Rafael Espindolae0e6d3b2010-11-11 19:34:42 +00006178 if (Args.hasArg(options::OPT_s))
6179 CmdArgs.push_back("-s");
6180
Rafael Espindolac1da9812010-11-07 20:14:31 +00006181 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6182 e = ToolChain.ExtraOpts.end();
6183 i != e; ++i)
6184 CmdArgs.push_back(i->c_str());
6185
6186 if (!Args.hasArg(options::OPT_static)) {
6187 CmdArgs.push_back("--eh-frame-hdr");
6188 }
6189
6190 CmdArgs.push_back("-m");
6191 if (ToolChain.getArch() == llvm::Triple::x86)
6192 CmdArgs.push_back("elf_i386");
Tim Northoverc264e162013-01-31 12:13:10 +00006193 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6194 CmdArgs.push_back("aarch64linux");
Eric Christopher88b7cf02011-08-19 00:30:14 +00006195 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregorf0594d82011-03-06 19:11:49 +00006196 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00006197 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43ac2972011-04-05 22:04:27 +00006198 else if (ToolChain.getArch() == llvm::Triple::ppc)
6199 CmdArgs.push_back("elf32ppclinux");
6200 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6201 CmdArgs.push_back("elf64ppc");
Eli Friedman5bea4f62011-11-08 19:43:37 +00006202 else if (ToolChain.getArch() == llvm::Triple::mips)
6203 CmdArgs.push_back("elf32btsmip");
6204 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6205 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00006206 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6207 if (hasMipsN32ABIArg(Args))
6208 CmdArgs.push_back("elf32btsmipn32");
6209 else
6210 CmdArgs.push_back("elf64btsmip");
6211 }
6212 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6213 if (hasMipsN32ABIArg(Args))
6214 CmdArgs.push_back("elf32ltsmipn32");
6215 else
6216 CmdArgs.push_back("elf64ltsmip");
6217 }
Ulrich Weigandb8409212013-05-06 16:26:41 +00006218 else if (ToolChain.getArch() == llvm::Triple::systemz)
6219 CmdArgs.push_back("elf64_s390");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006220 else
6221 CmdArgs.push_back("elf_x86_64");
6222
6223 if (Args.hasArg(options::OPT_static)) {
Douglas Gregorf0594d82011-03-06 19:11:49 +00006224 if (ToolChain.getArch() == llvm::Triple::arm
6225 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00006226 CmdArgs.push_back("-Bstatic");
6227 else
6228 CmdArgs.push_back("-static");
6229 } else if (Args.hasArg(options::OPT_shared)) {
6230 CmdArgs.push_back("-shared");
Rafael Espindola715852c2012-11-02 20:41:30 +00006231 if (isAndroid) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006232 CmdArgs.push_back("-Bsymbolic");
6233 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006234 }
6235
6236 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregorf0594d82011-03-06 19:11:49 +00006237 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac1da9812010-11-07 20:14:31 +00006238 (!Args.hasArg(options::OPT_static) &&
6239 !Args.hasArg(options::OPT_shared))) {
6240 CmdArgs.push_back("-dynamic-linker");
Peter Collingbournebdaa1342013-05-27 21:40:20 +00006241 CmdArgs.push_back(Args.MakeArgString(
6242 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006243 }
6244
6245 CmdArgs.push_back("-o");
6246 CmdArgs.push_back(Output.getFilename());
6247
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006248 if (!Args.hasArg(options::OPT_nostdlib) &&
6249 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006250 if (!isAndroid) {
6251 const char *crt1 = NULL;
6252 if (!Args.hasArg(options::OPT_shared)){
Eric Christopher61f08682013-06-07 23:25:01 +00006253 if (Args.hasArg(options::OPT_pg))
6254 crt1 = "gcrt1.o";
6255 else if (IsPIE)
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006256 crt1 = "Scrt1.o";
6257 else
6258 crt1 = "crt1.o";
6259 }
6260 if (crt1)
6261 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006262
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006263 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6264 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006265
Rafael Espindola89414b32010-11-12 03:00:39 +00006266 const char *crtbegin;
6267 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006268 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006269 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006270 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006271 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006272 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006273 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006274 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006275 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramere20e5082012-10-04 19:42:20 +00006276
6277 // Add crtfastmath.o if available and fast math is enabled.
6278 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola89414b32010-11-12 03:00:39 +00006279 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006280
6281 Args.AddAllArgs(CmdArgs, options::OPT_L);
6282
6283 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6284
Roman Divacky58e5ac92011-03-01 17:53:14 +00006285 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6286 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00006287 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006288
Rafael Espindolac5151542012-04-09 23:53:34 +00006289 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6290 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6291 // forward.
Rafael Espindola6155fbe2013-09-04 19:37:35 +00006292 if (D.IsUsingLTO(Args)) {
Rafael Espindolac5151542012-04-09 23:53:34 +00006293 CmdArgs.push_back("-plugin");
6294 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6295 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth700d4e42013-01-13 11:46:33 +00006296
6297 // Try to pass driver level flags relevant to LTO code generation down to
6298 // the plugin.
6299
Rafael Espindolab330e402013-08-20 22:12:08 +00006300 // Handle flags for selecting CPU variants.
6301 std::string CPU = getCPUName(Args, ToolChain.getTriple());
6302 if (!CPU.empty()) {
Chandler Carruth700d4e42013-01-13 11:46:33 +00006303 CmdArgs.push_back(
Rafael Espindolab330e402013-08-20 22:12:08 +00006304 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6305 CPU));
6306 }
Rafael Espindolac5151542012-04-09 23:53:34 +00006307 }
6308
Chandler Carruth700d4e42013-01-13 11:46:33 +00006309
Nick Lewyckye276cfc2012-08-17 03:39:16 +00006310 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6311 CmdArgs.push_back("--no-demangle");
6312
Rafael Espindolac1da9812010-11-07 20:14:31 +00006313 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6314
Eric Christopher6716d942012-11-29 18:51:05 +00006315 // Call these before we add the C++ ABI library.
Richard Smithc4dabad2012-11-05 22:04:41 +00006316 if (Sanitize.needsUbsanRt())
Hans Wennborg76b86c22013-07-18 20:29:38 +00006317 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
Richard Smith61a574f2013-03-20 23:49:07 +00006318 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev050309f2013-05-27 11:17:01 +00006319 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher6716d942012-11-29 18:51:05 +00006320 if (Sanitize.needsAsanRt())
6321 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6322 if (Sanitize.needsTsanRt())
6323 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00006324 if (Sanitize.needsMsanRt())
6325 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev050309f2013-05-27 11:17:01 +00006326 if (Sanitize.needsLsanRt())
6327 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Peter Collingbourne2eeed712013-08-07 22:47:34 +00006328 if (Sanitize.needsDfsanRt())
6329 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith8e1cee62012-10-25 02:14:12 +00006330
Chandler Carruth80a393e2013-06-24 09:38:45 +00006331 // The profile runtime also needs access to system libraries.
6332 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6333
Hans Wennborg76b86c22013-07-18 20:29:38 +00006334 if (D.CCCIsCXX() &&
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006335 !Args.hasArg(options::OPT_nostdlib) &&
6336 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola19706f82011-10-17 22:14:51 +00006337 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6338 !Args.hasArg(options::OPT_static);
6339 if (OnlyLibstdcxxStatic)
6340 CmdArgs.push_back("-Bstatic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006341 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola19706f82011-10-17 22:14:51 +00006342 if (OnlyLibstdcxxStatic)
6343 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006344 CmdArgs.push_back("-lm");
6345 }
6346
Rafael Espindola89414b32010-11-12 03:00:39 +00006347 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006348 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6349 if (Args.hasArg(options::OPT_static))
6350 CmdArgs.push_back("--start-group");
Nick Lewycky80df0252011-06-04 06:27:06 +00006351
Chandler Carruthdf96e022013-01-17 13:19:29 +00006352 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6353 if (OpenMP) {
6354 CmdArgs.push_back("-lgomp");
6355
6356 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6357 // librt. Most modern Linux platfroms require it, but some may not.
6358 CmdArgs.push_back("-lrt");
6359 }
6360
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006361 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola89414b32010-11-12 03:00:39 +00006362
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006363 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruthdf96e022013-01-17 13:19:29 +00006364 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006365 CmdArgs.push_back("-lpthread");
6366
6367 CmdArgs.push_back("-lc");
6368
6369 if (Args.hasArg(options::OPT_static))
6370 CmdArgs.push_back("--end-group");
6371 else
6372 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6373 }
Rafael Espindolafdda1712010-11-17 22:26:15 +00006374
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006375 if (!Args.hasArg(options::OPT_nostartfiles)) {
6376 const char *crtend;
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006377 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006378 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006379 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006380 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006381 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006382 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006383
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006384 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006385 if (!isAndroid)
6386 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006387 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006388 }
6389
Rafael Espindolac1da9812010-11-07 20:14:31 +00006390 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6391}
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006392
Chris Lattner38e317d2010-07-07 16:01:42 +00006393void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006394 const InputInfo &Output,
6395 const InputInfoList &Inputs,
6396 const ArgList &Args,
6397 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00006398 ArgStringList CmdArgs;
6399
6400 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6401 options::OPT_Xassembler);
6402
6403 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006404 CmdArgs.push_back(Output.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00006405
6406 for (InputInfoList::const_iterator
6407 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6408 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006409 CmdArgs.push_back(II.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00006410 }
6411
6412 const char *Exec =
Eli Friedman6d402dc2011-12-08 23:54:21 +00006413 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006414 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00006415}
6416
6417void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006418 const InputInfo &Output,
6419 const InputInfoList &Inputs,
6420 const ArgList &Args,
6421 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00006422 const Driver &D = getToolChain().getDriver();
6423 ArgStringList CmdArgs;
6424
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006425 if (Output.isFilename()) {
Chris Lattner38e317d2010-07-07 16:01:42 +00006426 CmdArgs.push_back("-o");
6427 CmdArgs.push_back(Output.getFilename());
6428 } else {
6429 assert(Output.isNothing() && "Invalid output.");
6430 }
6431
6432 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman6d402dc2011-12-08 23:54:21 +00006433 !Args.hasArg(options::OPT_nostartfiles)) {
6434 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6435 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6436 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6437 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6438 }
Chris Lattner38e317d2010-07-07 16:01:42 +00006439
6440 Args.AddAllArgs(CmdArgs, options::OPT_L);
6441 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6442 Args.AddAllArgs(CmdArgs, options::OPT_e);
6443
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006444 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00006445
Eli Friedman6d402dc2011-12-08 23:54:21 +00006446 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6447
Chris Lattner38e317d2010-07-07 16:01:42 +00006448 if (!Args.hasArg(options::OPT_nostdlib) &&
6449 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006450 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006451 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00006452 CmdArgs.push_back("-lm");
6453 }
Chris Lattner38e317d2010-07-07 16:01:42 +00006454 }
6455
6456 if (!Args.hasArg(options::OPT_nostdlib) &&
6457 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman6d402dc2011-12-08 23:54:21 +00006458 if (Args.hasArg(options::OPT_pthread))
6459 CmdArgs.push_back("-lpthread");
6460 CmdArgs.push_back("-lc");
6461 CmdArgs.push_back("-lCompilerRT-Generic");
6462 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6463 CmdArgs.push_back(
Eric Christopher27e2b982012-12-18 00:31:10 +00006464 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006465 }
6466
Eli Friedman6d402dc2011-12-08 23:54:21 +00006467 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006468 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00006469}
6470
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006471/// DragonFly Tools
6472
6473// For now, DragonFly Assemble does just about the same as for
6474// FreeBSD, but this may change soon.
6475void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006476 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00006477 const InputInfoList &Inputs,
6478 const ArgList &Args,
6479 const char *LinkingOutput) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006480 ArgStringList CmdArgs;
6481
6482 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6483 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006484 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006485 CmdArgs.push_back("--32");
6486
6487 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6488 options::OPT_Xassembler);
6489
6490 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006491 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006492
6493 for (InputInfoList::const_iterator
6494 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6495 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006496 CmdArgs.push_back(II.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006497 }
6498
6499 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006500 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006501 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006502}
6503
6504void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006505 const InputInfo &Output,
6506 const InputInfoList &Inputs,
6507 const ArgList &Args,
6508 const char *LinkingOutput) const {
John McCall8cfb7202013-04-11 22:55:55 +00006509 bool UseGCC47 = false;
Daniel Dunbaree788e72009-12-21 18:54:17 +00006510 const Driver &D = getToolChain().getDriver();
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006511 ArgStringList CmdArgs;
6512
John McCall8cfb7202013-04-11 22:55:55 +00006513 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6514 UseGCC47 = false;
6515
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006516 if (!D.SysRoot.empty())
6517 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6518
John McCall8cfb7202013-04-11 22:55:55 +00006519 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006520 if (Args.hasArg(options::OPT_static)) {
6521 CmdArgs.push_back("-Bstatic");
6522 } else {
John McCall8cfb7202013-04-11 22:55:55 +00006523 if (Args.hasArg(options::OPT_rdynamic))
6524 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006525 if (Args.hasArg(options::OPT_shared))
6526 CmdArgs.push_back("-Bshareable");
6527 else {
6528 CmdArgs.push_back("-dynamic-linker");
6529 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6530 }
John McCall8cfb7202013-04-11 22:55:55 +00006531 CmdArgs.push_back("--hash-style=both");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006532 }
6533
6534 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6535 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006536 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006537 CmdArgs.push_back("-m");
6538 CmdArgs.push_back("elf_i386");
6539 }
6540
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006541 if (Output.isFilename()) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006542 CmdArgs.push_back("-o");
6543 CmdArgs.push_back(Output.getFilename());
6544 } else {
6545 assert(Output.isNothing() && "Invalid output.");
6546 }
6547
6548 if (!Args.hasArg(options::OPT_nostdlib) &&
6549 !Args.hasArg(options::OPT_nostartfiles)) {
6550 if (!Args.hasArg(options::OPT_shared)) {
John McCall8cfb7202013-04-11 22:55:55 +00006551 if (Args.hasArg(options::OPT_pg))
6552 CmdArgs.push_back(Args.MakeArgString(
6553 getToolChain().GetFilePath("gcrt1.o")));
6554 else {
6555 if (Args.hasArg(options::OPT_pie))
6556 CmdArgs.push_back(Args.MakeArgString(
6557 getToolChain().GetFilePath("Scrt1.o")));
6558 else
6559 CmdArgs.push_back(Args.MakeArgString(
6560 getToolChain().GetFilePath("crt1.o")));
6561 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006562 }
John McCall8cfb7202013-04-11 22:55:55 +00006563 CmdArgs.push_back(Args.MakeArgString(
6564 getToolChain().GetFilePath("crti.o")));
6565 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6566 CmdArgs.push_back(Args.MakeArgString(
6567 getToolChain().GetFilePath("crtbeginS.o")));
6568 else
6569 CmdArgs.push_back(Args.MakeArgString(
6570 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006571 }
6572
6573 Args.AddAllArgs(CmdArgs, options::OPT_L);
6574 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6575 Args.AddAllArgs(CmdArgs, options::OPT_e);
6576
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006577 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006578
6579 if (!Args.hasArg(options::OPT_nostdlib) &&
6580 !Args.hasArg(options::OPT_nodefaultlibs)) {
6581 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6582 // rpaths
John McCall8cfb7202013-04-11 22:55:55 +00006583 if (UseGCC47)
6584 CmdArgs.push_back("-L/usr/lib/gcc47");
6585 else
6586 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006587
6588 if (!Args.hasArg(options::OPT_static)) {
John McCall8cfb7202013-04-11 22:55:55 +00006589 if (UseGCC47) {
6590 CmdArgs.push_back("-rpath");
6591 CmdArgs.push_back("/usr/lib/gcc47");
6592 } else {
6593 CmdArgs.push_back("-rpath");
6594 CmdArgs.push_back("/usr/lib/gcc44");
6595 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006596 }
6597
Hans Wennborg76b86c22013-07-18 20:29:38 +00006598 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006599 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola405861d2010-07-20 12:59:03 +00006600 CmdArgs.push_back("-lm");
6601 }
6602
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006603 if (Args.hasArg(options::OPT_pthread))
Mike Stump4d63f8b2009-10-31 20:11:46 +00006604 CmdArgs.push_back("-lpthread");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006605
6606 if (!Args.hasArg(options::OPT_nolibc)) {
6607 CmdArgs.push_back("-lc");
6608 }
6609
John McCall8cfb7202013-04-11 22:55:55 +00006610 if (UseGCC47) {
6611 if (Args.hasArg(options::OPT_static) ||
6612 Args.hasArg(options::OPT_static_libgcc)) {
6613 CmdArgs.push_back("-lgcc");
6614 CmdArgs.push_back("-lgcc_eh");
6615 } else {
6616 if (Args.hasArg(options::OPT_shared_libgcc)) {
6617 CmdArgs.push_back("-lgcc_pic");
6618 if (!Args.hasArg(options::OPT_shared))
6619 CmdArgs.push_back("-lgcc");
6620 } else {
6621 CmdArgs.push_back("-lgcc");
6622 CmdArgs.push_back("--as-needed");
6623 CmdArgs.push_back("-lgcc_pic");
6624 CmdArgs.push_back("--no-as-needed");
6625 }
6626 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006627 } else {
John McCall8cfb7202013-04-11 22:55:55 +00006628 if (Args.hasArg(options::OPT_shared)) {
6629 CmdArgs.push_back("-lgcc_pic");
6630 } else {
6631 CmdArgs.push_back("-lgcc");
6632 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006633 }
6634 }
6635
6636 if (!Args.hasArg(options::OPT_nostdlib) &&
6637 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall8cfb7202013-04-11 22:55:55 +00006638 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner38e317d2010-07-07 16:01:42 +00006639 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006640 getToolChain().GetFilePath("crtendS.o")));
John McCall8cfb7202013-04-11 22:55:55 +00006641 else
6642 CmdArgs.push_back(Args.MakeArgString(
6643 getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006644 CmdArgs.push_back(Args.MakeArgString(
John McCall8cfb7202013-04-11 22:55:55 +00006645 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006646 }
6647
Bill Wendling3f4be6f2011-06-27 19:15:03 +00006648 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00006649
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006650 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006651 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006652 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006653}
Michael J. Spencerff58e362010-08-21 21:55:07 +00006654
6655void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6656 const InputInfo &Output,
6657 const InputInfoList &Inputs,
6658 const ArgList &Args,
6659 const char *LinkingOutput) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006660 ArgStringList CmdArgs;
6661
6662 if (Output.isFilename()) {
Daniel Dunbare5a37f42010-09-17 00:45:02 +00006663 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6664 Output.getFilename()));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006665 } else {
6666 assert(Output.isNothing() && "Invalid output.");
6667 }
6668
6669 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg746974d2013-08-09 17:38:42 +00006670 !Args.hasArg(options::OPT_nostartfiles) &&
6671 !C.getDriver().IsCLMode()) {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006672 CmdArgs.push_back("-defaultlib:libcmt");
6673 }
6674
6675 CmdArgs.push_back("-nologo");
6676
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00006677 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
6678
6679 if (DLL) {
6680 CmdArgs.push_back(Args.MakeArgString("-dll"));
6681
6682 SmallString<128> ImplibName(Output.getFilename());
6683 llvm::sys::path::replace_extension(ImplibName, "lib");
6684 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
6685 ImplibName.str()));
6686 }
6687
Hans Wennborg3c4da0c2013-08-27 18:10:21 +00006688 if (getToolChain().getDriver().getOrParseSanitizerArgs(Args).needsAsanRt()) {
Hans Wennborg324cc032013-08-28 17:36:07 +00006689 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborg2ddffa12013-08-30 10:50:52 +00006690 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg3c4da0c2013-08-27 18:10:21 +00006691 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00006692 llvm::sys::path::append(LibSanitizer, "lib", "windows");
6693 if (DLL) {
Timur Iskhodzhanove4814132013-09-11 11:45:31 +00006694 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00006695 } else {
6696 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
6697 }
6698 // FIXME: Handle 64-bit.
Hans Wennborg3c4da0c2013-08-27 18:10:21 +00006699 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
6700 }
6701
Michael J. Spencera2284f52012-06-18 16:56:04 +00006702 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg5db95272013-08-13 23:38:57 +00006703 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencera2284f52012-06-18 16:56:04 +00006704
6705 // Add filenames immediately.
6706 for (InputInfoList::const_iterator
6707 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6708 if (it->isFilename())
6709 CmdArgs.push_back(it->getFilename());
Hans Wennborg2388b772013-08-14 01:24:35 +00006710 else
6711 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencera2284f52012-06-18 16:56:04 +00006712 }
Michael J. Spencerff58e362010-08-21 21:55:07 +00006713
6714 const char *Exec =
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006715 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006716 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6717}
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006718
6719void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
6720 const InputInfo &Output,
6721 const InputInfoList &Inputs,
6722 const ArgList &Args,
6723 const char *LinkingOutput) const {
6724 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
6725}
6726
Hans Wennborgdc40bf92013-09-20 18:16:35 +00006727// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
6728// If one cannot be found, return FallbackName.
6729// We do this special search to prevent clang-cl from falling back onto itself
6730// if it's available as cl.exe on the path.
6731static std::string FindFallback(const char *FallbackName,
6732 const char *ClangProgramPath) {
6733 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
6734 if (!OptPath.hasValue())
6735 return FallbackName;
6736
6737#ifdef LLVM_ON_WIN32
6738 const StringRef PathSeparators = ";";
6739#else
6740 const StringRef PathSeparators = ":";
6741#endif
6742
6743 SmallVector<StringRef, 8> PathSegments;
6744 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
6745
6746 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
6747 const StringRef &PathSegment = PathSegments[i];
6748 if (PathSegment.empty())
6749 continue;
6750
6751 SmallString<128> FilePath(PathSegment);
6752 llvm::sys::path::append(FilePath, FallbackName);
6753 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
6754 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
6755 return FilePath.str();
6756 }
6757
6758 return FallbackName;
6759}
6760
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006761Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
6762 const InputInfo &Output,
6763 const InputInfoList &Inputs,
6764 const ArgList &Args,
6765 const char *LinkingOutput) const {
6766 ArgStringList CmdArgs;
Hans Wennborg1413d622013-09-24 17:36:21 +00006767 CmdArgs.push_back("/nologo");
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006768 CmdArgs.push_back("/c"); // Compile only.
6769 CmdArgs.push_back("/W0"); // No warnings.
6770
6771 // The goal is to be able to invoke this tool correctly based on
6772 // any flag accepted by clang-cl.
6773
6774 // These are spelled the same way in clang and cl.exe,.
6775 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
6776 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborga8ffc162013-09-24 18:17:21 +00006777
6778 // Optimization level.
6779 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
6780 if (A->getOption().getID() == options::OPT_O0) {
6781 CmdArgs.push_back("/Od");
6782 } else {
6783 StringRef OptLevel = A->getValue();
6784 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
6785 A->render(Args, CmdArgs);
6786 else if (OptLevel == "3")
6787 CmdArgs.push_back("/Ox");
6788 }
6789 }
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006790
6791 // Flags for which clang-cl have an alias.
6792 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
6793
6794 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
6795 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
6796 : "/GR-");
6797 if (Args.hasArg(options::OPT_fsyntax_only))
6798 CmdArgs.push_back("/Zs");
6799
Hans Wennborg4fe475a2013-09-27 17:54:18 +00006800 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
6801 for (size_t I = 0, E = Includes.size(); I != E; ++I)
6802 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
6803
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006804 // Flags that can simply be passed through.
6805 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
6806 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
6807
6808 // The order of these flags is relevant, so pick the last one.
6809 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
6810 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
6811 A->render(Args, CmdArgs);
6812
6813
6814 // Input filename.
6815 assert(Inputs.size() == 1);
6816 const InputInfo &II = Inputs[0];
6817 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
6818 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
6819 if (II.isFilename())
6820 CmdArgs.push_back(II.getFilename());
6821 else
6822 II.getInputArg().renderAsInput(Args, CmdArgs);
6823
6824 // Output filename.
6825 assert(Output.getType() == types::TY_Object);
6826 const char *Fo = Args.MakeArgString(std::string("/Fo") +
6827 Output.getFilename());
6828 CmdArgs.push_back(Fo);
6829
Hans Wennborgdc40bf92013-09-20 18:16:35 +00006830 const Driver &D = getToolChain().getDriver();
6831 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006832
Hans Wennborgdc40bf92013-09-20 18:16:35 +00006833 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006834}
Robert Lytton4e490e22013-10-11 10:29:40 +00006835
6836
6837/// XCore Tools
6838// We pass assemble and link construction to the xcc tool.
6839
6840void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6841 const InputInfo &Output,
6842 const InputInfoList &Inputs,
6843 const ArgList &Args,
6844 const char *LinkingOutput) const {
6845 ArgStringList CmdArgs;
6846
6847 CmdArgs.push_back("-o");
6848 CmdArgs.push_back(Output.getFilename());
6849
6850 CmdArgs.push_back("-c");
6851
6852 if (Args.hasArg(options::OPT_g_Group)) {
6853 CmdArgs.push_back("-g");
6854 }
6855
6856 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6857 options::OPT_Xassembler);
6858
6859 for (InputInfoList::const_iterator
6860 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6861 const InputInfo &II = *it;
6862 CmdArgs.push_back(II.getFilename());
6863 }
6864
6865 const char *Exec =
6866 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6867 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6868}
6869
6870void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
6871 const InputInfo &Output,
6872 const InputInfoList &Inputs,
6873 const ArgList &Args,
6874 const char *LinkingOutput) const {
6875 ArgStringList CmdArgs;
6876
6877 if (Output.isFilename()) {
6878 CmdArgs.push_back("-o");
6879 CmdArgs.push_back(Output.getFilename());
6880 } else {
6881 assert(Output.isNothing() && "Invalid output.");
6882 }
6883
6884 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6885
6886 const char *Exec =
6887 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6888 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6889}