blob: 646fb61363805c7064e9f5db86f15a8e7fd0be37 [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
Amara Emerson3bb1b5c2013-10-31 09:32:33 +0000542/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are targeting.
543//
544// FIXME: tblgen this.
545static std::string getAArch64TargetCPU(const ArgList &Args,
546 const llvm::Triple &Triple) {
547 // FIXME: Warn on inconsistent use of -mcpu and -march.
548
549 // If we have -mcpu=, use that.
550 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
551 StringRef MCPU = A->getValue();
552 // Handle -mcpu=native.
553 if (MCPU == "native")
554 return llvm::sys::getHostCPUName();
555 else
556 return MCPU;
557 }
558
559 return "generic";
560}
561
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000562// FIXME: Move to target hook.
563static bool isSignedCharDefault(const llvm::Triple &Triple) {
564 switch (Triple.getArch()) {
565 default:
566 return true;
567
Tim Northoverc264e162013-01-31 12:13:10 +0000568 case llvm::Triple::aarch64:
Jim Grosbach5b4e7b12011-05-24 15:40:46 +0000569 case llvm::Triple::arm:
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000570 case llvm::Triple::ppc:
571 case llvm::Triple::ppc64:
Bob Wilson905c45f2011-10-14 05:03:44 +0000572 if (Triple.isOSDarwin())
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000573 return true;
574 return false;
Ulrich Weigandb8409212013-05-06 16:26:41 +0000575
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000576 case llvm::Triple::ppc64le:
Ulrich Weigandb8409212013-05-06 16:26:41 +0000577 case llvm::Triple::systemz:
Robert Lytton5f15f4d2013-08-13 09:43:10 +0000578 case llvm::Triple::xcore:
Ulrich Weigandb8409212013-05-06 16:26:41 +0000579 return false;
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000580 }
581}
582
Robert Lytton5f15f4d2013-08-13 09:43:10 +0000583static bool isNoCommonDefault(const llvm::Triple &Triple) {
584 switch (Triple.getArch()) {
585 default:
586 return false;
587
588 case llvm::Triple::xcore:
589 return true;
590 }
591}
592
Chad Rosier99317272012-04-04 20:51:35 +0000593// Handle -mfpu=.
594//
595// FIXME: Centralize feature selection, defaulting shouldn't be also in the
596// frontend target.
Amara Emersonfe7ed042013-10-01 10:20:54 +0000597static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
598 const ArgList &Args,
599 std::vector<const char *> &Features) {
600 StringRef FPU = A->getValue();
601 if (FPU == "fp-armv8") {
602 Features.push_back("+fp-armv8");
603 } else if (FPU == "neon-fp-armv8") {
604 Features.push_back("+fp-armv8");
605 Features.push_back("+neon");
606 } else if (FPU == "crypto-neon-fp-armv8") {
607 Features.push_back("+fp-armv8");
608 Features.push_back("+neon");
609 Features.push_back("+crypto");
610 } else if (FPU == "neon") {
611 Features.push_back("+neon");
612 } else if (FPU == "none") {
613 Features.push_back("-fp-armv8");
614 Features.push_back("-crypto");
615 Features.push_back("-neon");
616 } else
617 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
618}
619
Silviu Baranga1db2e272013-10-21 10:54:53 +0000620// Handle -mhwdiv=.
621static void getARMHWDivFeatures(const Driver &D, const Arg *A,
622 const ArgList &Args,
623 std::vector<const char *> &Features) {
624 StringRef HWDiv = A->getValue();
625 if (HWDiv == "arm") {
626 Features.push_back("+hwdiv-arm");
627 Features.push_back("-hwdiv");
628 } else if (HWDiv == "thumb") {
629 Features.push_back("-hwdiv-arm");
630 Features.push_back("+hwdiv");
631 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
632 Features.push_back("+hwdiv-arm");
633 Features.push_back("+hwdiv");
634 } else if (HWDiv == "none") {
635 Features.push_back("-hwdiv-arm");
636 Features.push_back("-hwdiv");
637 } else
638 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
639}
640
Amara Emersonfe7ed042013-10-01 10:20:54 +0000641// Handle -mfpu=.
642//
643// FIXME: Centralize feature selection, defaulting shouldn't be also in the
644// frontend target.
645static void getARMFPUFeatures(const Driver &D, const Arg *A,
646 const ArgList &Args,
647 std::vector<const char *> &Features) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000648 StringRef FPU = A->getValue();
Chad Rosier99317272012-04-04 20:51:35 +0000649
650 // Set the target features based on the FPU.
651 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
652 // Disable any default FPU support.
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000653 Features.push_back("-vfp2");
654 Features.push_back("-vfp3");
655 Features.push_back("-neon");
Chad Rosier99317272012-04-04 20:51:35 +0000656 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000657 Features.push_back("+vfp3");
658 Features.push_back("+d16");
659 Features.push_back("-neon");
Chad Rosier99317272012-04-04 20:51:35 +0000660 } else if (FPU == "vfp") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000661 Features.push_back("+vfp2");
662 Features.push_back("-neon");
Chad Rosier99317272012-04-04 20:51:35 +0000663 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000664 Features.push_back("+vfp3");
665 Features.push_back("-neon");
Joey Goulycbed3bf2013-06-27 13:19:54 +0000666 } else if (FPU == "fp-armv8") {
Joey Gouly2b33b7e2013-09-13 13:48:33 +0000667 Features.push_back("+fp-armv8");
Bernard Ogdenf779e652013-10-24 18:32:51 +0000668 Features.push_back("-neon");
669 Features.push_back("-crypto");
Joey Goulycbed3bf2013-06-27 13:19:54 +0000670 } else if (FPU == "neon-fp-armv8") {
Joey Gouly2b33b7e2013-09-13 13:48:33 +0000671 Features.push_back("+fp-armv8");
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000672 Features.push_back("+neon");
Bernard Ogdenf779e652013-10-24 18:32:51 +0000673 Features.push_back("-crypto");
Amara Emersoncdc532c2013-09-19 13:54:03 +0000674 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersoncdc532c2013-09-19 13:54:03 +0000675 Features.push_back("+fp-armv8");
Bernard Ogdenf779e652013-10-24 18:32:51 +0000676 Features.push_back("+neon");
677 Features.push_back("+crypto");
Chad Rosier99317272012-04-04 20:51:35 +0000678 } else if (FPU == "neon") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000679 Features.push_back("+neon");
Amara Emersonfe7ed042013-10-01 10:20:54 +0000680 } else if (FPU == "none") {
681 Features.push_back("-vfp2");
682 Features.push_back("-vfp3");
683 Features.push_back("-vfp4");
684 Features.push_back("-fp-armv8");
685 Features.push_back("-crypto");
686 Features.push_back("-neon");
Chad Rosier99317272012-04-04 20:51:35 +0000687 } else
688 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
689}
690
Anton Korobeynikove2571792012-04-09 13:38:30 +0000691// Select the float ABI as determined by -msoft-float, -mhard-float, and
692// -mfloat-abi=.
693static StringRef getARMFloatABI(const Driver &D,
694 const ArgList &Args,
695 const llvm::Triple &Triple) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000696 StringRef FloatABI;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000697 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
698 options::OPT_mhard_float,
699 options::OPT_mfloat_abi_EQ)) {
700 if (A->getOption().matches(options::OPT_msoft_float))
701 FloatABI = "soft";
702 else if (A->getOption().matches(options::OPT_mhard_float))
703 FloatABI = "hard";
704 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000705 FloatABI = A->getValue();
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000706 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000707 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000708 << A->getAsString(Args);
709 FloatABI = "soft";
710 }
711 }
712 }
713
714 // If unspecified, choose the default based on the platform.
715 if (FloatABI.empty()) {
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000716 switch (Triple.getOS()) {
Bob Wilson905c45f2011-10-14 05:03:44 +0000717 case llvm::Triple::Darwin:
718 case llvm::Triple::MacOSX:
719 case llvm::Triple::IOS: {
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000720 // Darwin defaults to "softfp" for v6 and v7.
721 //
722 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000723 std::string ArchName =
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000724 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000725 if (StringRef(ArchName).startswith("v6") ||
726 StringRef(ArchName).startswith("v7"))
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000727 FloatABI = "softfp";
728 else
729 FloatABI = "soft";
730 break;
731 }
732
Rafael Espindola27fa2362012-12-13 04:17:14 +0000733 case llvm::Triple::FreeBSD:
734 // FreeBSD defaults to soft float
735 FloatABI = "soft";
736 break;
737
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000738 default:
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000739 switch(Triple.getEnvironment()) {
Jiangning Liuff104a12012-07-31 08:06:29 +0000740 case llvm::Triple::GNUEABIHF:
741 FloatABI = "hard";
742 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000743 case llvm::Triple::GNUEABI:
744 FloatABI = "softfp";
745 break;
746 case llvm::Triple::EABI:
747 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
748 FloatABI = "softfp";
749 break;
Logan Chien94a71422012-09-02 09:30:11 +0000750 case llvm::Triple::Android: {
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000751 std::string ArchName =
Chandler Carruthb43550b2012-01-10 19:47:42 +0000752 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000753 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthb43550b2012-01-10 19:47:42 +0000754 FloatABI = "softfp";
755 else
756 FloatABI = "soft";
757 break;
758 }
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000759 default:
760 // Assume "soft", but warn the user we are guessing.
761 FloatABI = "soft";
Chris Lattner5f9e2722011-07-23 10:55:15 +0000762 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000763 break;
764 }
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000765 }
766 }
767
Anton Korobeynikove2571792012-04-09 13:38:30 +0000768 return FloatABI;
769}
770
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000771static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
772 const ArgList &Args,
773 std::vector<const char *> &Features) {
774 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
775 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
776 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
777 // stripped out by the ARM target.
778 // Use software floating point operations?
779 if (FloatABI == "soft")
780 Features.push_back("+soft-float");
781
782 // Use software floating point argument passing?
783 if (FloatABI != "hard")
784 Features.push_back("+soft-float-abi");
785
786 // Honor -mfpu=.
787 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emersonfe7ed042013-10-01 10:20:54 +0000788 getARMFPUFeatures(D, A, Args, Features);
Silviu Baranga1db2e272013-10-21 10:54:53 +0000789 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
790 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000791
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000792 // Setting -msoft-float effectively disables NEON because of the GCC
793 // implementation, although the same isn't true of VFP or VFP3.
794 if (FloatABI == "soft")
795 Features.push_back("-neon");
Bernard Ogden909f35a2013-10-29 09:47:51 +0000796
797 // En/disable crc
798 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
799 options::OPT_mnocrc)) {
800 if (A->getOption().matches(options::OPT_mcrc))
801 Features.push_back("+crc");
802 else
803 Features.push_back("-crc");
804 }
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000805}
Anton Korobeynikove2571792012-04-09 13:38:30 +0000806
807void Clang::AddARMTargetArgs(const ArgList &Args,
808 ArgStringList &CmdArgs,
809 bool KernelOrKext) const {
810 const Driver &D = getToolChain().getDriver();
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000811 // Get the effective triple, which takes into account the deployment target.
812 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
813 llvm::Triple Triple(TripleStr);
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000814 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikove2571792012-04-09 13:38:30 +0000815
816 // Select the ABI to use.
817 //
818 // FIXME: Support -meabi.
819 const char *ABIName = 0;
820 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000821 ABIName = A->getValue();
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000822 } else if (Triple.isOSDarwin()) {
823 // The backend is hardwired to assume AAPCS for M-class processors, ensure
824 // the frontend matches that.
Tim Northoverfc1a75b2013-10-03 14:23:28 +0000825 if (Triple.getEnvironment() == llvm::Triple::EABI ||
826 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000827 ABIName = "aapcs";
828 } else {
829 ABIName = "apcs-gnu";
830 }
Anton Korobeynikove2571792012-04-09 13:38:30 +0000831 } else {
832 // Select the default based on the platform.
833 switch(Triple.getEnvironment()) {
Logan Chien94a71422012-09-02 09:30:11 +0000834 case llvm::Triple::Android:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000835 case llvm::Triple::GNUEABI:
Jiangning Liuff104a12012-07-31 08:06:29 +0000836 case llvm::Triple::GNUEABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000837 ABIName = "aapcs-linux";
838 break;
839 case llvm::Triple::EABI:
840 ABIName = "aapcs";
841 break;
842 default:
843 ABIName = "apcs-gnu";
844 }
845 }
846 CmdArgs.push_back("-target-abi");
847 CmdArgs.push_back(ABIName);
848
Anton Korobeynikove2571792012-04-09 13:38:30 +0000849 // Determine floating point ABI from the options & target defaults.
850 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000851 if (FloatABI == "soft") {
852 // Floating point operations and argument passing are soft.
853 //
854 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbar3b315262009-11-30 08:42:00 +0000855 CmdArgs.push_back("-msoft-float");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000856 CmdArgs.push_back("-mfloat-abi");
857 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000858 } else if (FloatABI == "softfp") {
859 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000860 CmdArgs.push_back("-mfloat-abi");
861 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000862 } else {
863 // Floating point operations and argument passing are hard.
864 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000865 CmdArgs.push_back("-mfloat-abi");
866 CmdArgs.push_back("hard");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000867 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +0000868
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000869 // Kernel code has more strict alignment requirements.
870 if (KernelOrKext) {
Cameron Esfahani57b1da12013-09-14 01:09:11 +0000871 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000872 CmdArgs.push_back("-backend-option");
873 CmdArgs.push_back("-arm-long-calls");
874 }
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000875
Daniel Dunbar3c66d302011-03-22 16:48:17 +0000876 CmdArgs.push_back("-backend-option");
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000877 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000878
879 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000880 CmdArgs.push_back("-backend-option");
Renato Golinebc313d2013-08-15 20:54:45 +0000881 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000882 }
Chad Rosier1b906052011-08-26 00:26:29 +0000883
884 // Setting -mno-global-merge disables the codegen global merge pass. Setting
885 // -mglobal-merge has no effect as the pass is enabled by default.
886 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
887 options::OPT_mno_global_merge)) {
888 if (A->getOption().matches(options::OPT_mno_global_merge))
889 CmdArgs.push_back("-mno-global-merge");
890 }
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000891
Bob Wilsonf6f77bd2013-04-11 18:53:25 +0000892 if (!Args.hasFlag(options::OPT_mimplicit_float,
893 options::OPT_mno_implicit_float,
894 true))
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000895 CmdArgs.push_back("-no-implicit-float");
Renato Golin45bd2942013-08-24 14:44:35 +0000896
897 // llvm does not support reserving registers in general. There is support
898 // for reserving r9 on ARM though (defined as a platform-specific register
899 // in ARM EABI).
900 if (Args.hasArg(options::OPT_ffixed_r9)) {
901 CmdArgs.push_back("-backend-option");
902 CmdArgs.push_back("-arm-reserve-r9");
903 }
Daniel Dunbarb163ef72009-09-10 04:57:17 +0000904}
905
Simon Atanasyana2768be2012-04-07 22:09:23 +0000906// Get CPU and ABI names. They are not independent
907// so we have to calculate them together.
908static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindolab330e402013-08-20 22:12:08 +0000909 const llvm::Triple &Triple,
Simon Atanasyana2768be2012-04-07 22:09:23 +0000910 StringRef &CPUName,
911 StringRef &ABIName) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000912 const char *DefMips32CPU = "mips32";
913 const char *DefMips64CPU = "mips64";
Akira Hatanaka9f360622011-09-26 21:07:52 +0000914
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000915 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan66751bc2013-10-09 12:12:24 +0000916 options::OPT_mcpu_EQ))
917 CPUName = A->getValue();
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000918
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +0000919 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000920 ABIName = A->getValue();
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +0000921 // Convert a GNU style Mips ABI name to the name
922 // accepted by LLVM Mips backend.
923 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
924 .Case("32", "o32")
925 .Case("64", "n64")
926 .Default(ABIName);
927 }
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000928
929 // Setup default CPU and ABI names.
930 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindolab330e402013-08-20 22:12:08 +0000931 switch (Triple.getArch()) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000932 default:
933 llvm_unreachable("Unexpected triple arch name");
934 case llvm::Triple::mips:
935 case llvm::Triple::mipsel:
936 CPUName = DefMips32CPU;
937 break;
938 case llvm::Triple::mips64:
939 case llvm::Triple::mips64el:
940 CPUName = DefMips64CPU;
941 break;
942 }
943 }
944
945 if (!ABIName.empty()) {
946 // Deduce CPU name from ABI name.
947 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyane9616a42013-02-27 14:55:49 +0000948 .Cases("32", "o32", "eabi", DefMips32CPU)
949 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000950 .Default("");
951 }
952 else if (!CPUName.empty()) {
953 // Deduce ABI name from CPU name.
954 ABIName = llvm::StringSwitch<const char *>(CPUName)
955 .Cases("mips32", "mips32r2", "o32")
956 .Cases("mips64", "mips64r2", "n64")
957 .Default("");
958 }
959
960 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyana2768be2012-04-07 22:09:23 +0000961}
962
Simon Atanasyane9616a42013-02-27 14:55:49 +0000963// Convert ABI name to the GNU tools acceptable variant.
964static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
965 return llvm::StringSwitch<llvm::StringRef>(ABI)
966 .Case("o32", "32")
967 .Case("n64", "64")
968 .Default(ABI);
969}
970
Simon Atanasyan5e627792012-06-02 15:06:29 +0000971// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
972// and -mfloat-abi=.
973static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000974 StringRef FloatABI;
Eric Christophered734732010-03-02 02:41:08 +0000975 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000976 options::OPT_mhard_float,
977 options::OPT_mfloat_abi_EQ)) {
Eric Christophered734732010-03-02 02:41:08 +0000978 if (A->getOption().matches(options::OPT_msoft_float))
979 FloatABI = "soft";
980 else if (A->getOption().matches(options::OPT_mhard_float))
981 FloatABI = "hard";
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000982 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000983 FloatABI = A->getValue();
Simon Atanasyan2ed42b82013-04-14 08:37:15 +0000984 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan5e627792012-06-02 15:06:29 +0000985 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000986 FloatABI = "hard";
987 }
988 }
Eric Christophered734732010-03-02 02:41:08 +0000989 }
990
991 // If unspecified, choose the default based on the platform.
992 if (FloatABI.empty()) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000993 // Assume "hard", because it's a default value used by gcc.
994 // When we start to recognize specific target MIPS processors,
995 // we will be able to select the default more correctly.
996 FloatABI = "hard";
Eric Christophered734732010-03-02 02:41:08 +0000997 }
998
Simon Atanasyan5e627792012-06-02 15:06:29 +0000999 return FloatABI;
1000}
1001
Simon Atanasyandc536f52012-07-05 18:51:43 +00001002static void AddTargetFeature(const ArgList &Args,
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001003 std::vector<const char *> &Features,
1004 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyandc536f52012-07-05 18:51:43 +00001005 StringRef FeatureName) {
1006 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyandc536f52012-07-05 18:51:43 +00001007 if (A->getOption().matches(OnOpt))
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001008 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyandc536f52012-07-05 18:51:43 +00001009 else
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001010 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyandc536f52012-07-05 18:51:43 +00001011 }
1012}
1013
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001014static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
1015 std::vector<const char *> &Features) {
1016 StringRef FloatABI = getMipsFloatABI(D, Args);
1017 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
1018 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
1019 // FIXME: Note, this is a hack. We need to pass the selected float
1020 // mode to the MipsTargetInfoBase to define appropriate macros there.
1021 // Now it is the only method.
1022 Features.push_back("+soft-float");
1023 }
1024
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00001025 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
1026 if (StringRef(A->getValue()) == "2008")
1027 Features.push_back("+nan2008");
1028 }
1029
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001030 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1031 options::OPT_mdouble_float, "single-float");
1032 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1033 "mips16");
1034 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1035 options::OPT_mno_micromips, "micromips");
1036 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1037 "dsp");
1038 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1039 "dspr2");
1040 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1041 "msa");
Daniel Sandersaf7ed9e2013-10-17 14:55:58 +00001042 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
1043 "fp64");
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001044}
1045
Simon Atanasyan5e627792012-06-02 15:06:29 +00001046void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyana8141612013-04-14 14:07:41 +00001047 ArgStringList &CmdArgs) const {
Simon Atanasyan5e627792012-06-02 15:06:29 +00001048 const Driver &D = getToolChain().getDriver();
1049 StringRef CPUName;
1050 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00001051 const llvm::Triple &Triple = getToolChain().getTriple();
1052 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan5e627792012-06-02 15:06:29 +00001053
1054 CmdArgs.push_back("-target-abi");
1055 CmdArgs.push_back(ABIName.data());
1056
1057 StringRef FloatABI = getMipsFloatABI(D, Args);
1058
Simon Atanasyane1d792f2013-01-10 12:36:19 +00001059 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
1060
1061 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christophered734732010-03-02 02:41:08 +00001062 // Floating point operations and argument passing are soft.
Eric Christophered734732010-03-02 02:41:08 +00001063 CmdArgs.push_back("-msoft-float");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001064 CmdArgs.push_back("-mfloat-abi");
1065 CmdArgs.push_back("soft");
1066
Simon Atanasyane1d792f2013-01-10 12:36:19 +00001067 if (FloatABI == "hard" && IsMips16) {
1068 CmdArgs.push_back("-mllvm");
1069 CmdArgs.push_back("-mips16-hard-float");
1070 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001071 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001072 else {
1073 // Floating point operations and argument passing are hard.
Eric Christophered734732010-03-02 02:41:08 +00001074 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001075 CmdArgs.push_back("-mfloat-abi");
1076 CmdArgs.push_back("hard");
Eric Christophered734732010-03-02 02:41:08 +00001077 }
Simon Atanasyan0b273ef2012-07-05 14:19:39 +00001078
Simon Atanasyanbda07ac2012-12-01 18:27:21 +00001079 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1080 if (A->getOption().matches(options::OPT_mxgot)) {
1081 CmdArgs.push_back("-mllvm");
1082 CmdArgs.push_back("-mxgot");
1083 }
1084 }
1085
Simon Atanasyan6bdc4c62013-05-11 06:33:44 +00001086 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1087 options::OPT_mno_ldc1_sdc1)) {
1088 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1089 CmdArgs.push_back("-mllvm");
1090 CmdArgs.push_back("-mno-ldc1-sdc1");
1091 }
1092 }
1093
Akira Hatanakacdbc3b32013-07-19 18:58:48 +00001094 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1095 options::OPT_mno_check_zero_division)) {
1096 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1097 CmdArgs.push_back("-mllvm");
1098 CmdArgs.push_back("-mno-check-zero-division");
1099 }
1100 }
1101
Simon Atanasyan9804b762012-08-27 20:55:56 +00001102 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001103 StringRef v = A->getValue();
Simon Atanasyan9804b762012-08-27 20:55:56 +00001104 CmdArgs.push_back("-mllvm");
1105 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1106 A->claim();
1107 }
Eric Christophered734732010-03-02 02:41:08 +00001108}
1109
Hal Finkel02a84272012-06-11 22:35:19 +00001110/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1111static std::string getPPCTargetCPU(const ArgList &Args) {
1112 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001113 StringRef CPUName = A->getValue();
Hal Finkel02a84272012-06-11 22:35:19 +00001114
1115 if (CPUName == "native") {
1116 std::string CPU = llvm::sys::getHostCPUName();
1117 if (!CPU.empty() && CPU != "generic")
1118 return CPU;
1119 else
1120 return "";
1121 }
1122
1123 return llvm::StringSwitch<const char *>(CPUName)
1124 .Case("common", "generic")
1125 .Case("440", "440")
1126 .Case("440fp", "440")
1127 .Case("450", "450")
1128 .Case("601", "601")
1129 .Case("602", "602")
1130 .Case("603", "603")
1131 .Case("603e", "603e")
1132 .Case("603ev", "603ev")
1133 .Case("604", "604")
1134 .Case("604e", "604e")
1135 .Case("620", "620")
Bill Schmidt2821e182013-02-01 20:23:10 +00001136 .Case("630", "pwr3")
Hal Finkel02a84272012-06-11 22:35:19 +00001137 .Case("G3", "g3")
1138 .Case("7400", "7400")
1139 .Case("G4", "g4")
1140 .Case("7450", "7450")
1141 .Case("G4+", "g4+")
1142 .Case("750", "750")
1143 .Case("970", "970")
1144 .Case("G5", "g5")
1145 .Case("a2", "a2")
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001146 .Case("a2q", "a2q")
Hal Finkel7de32962012-09-18 22:25:03 +00001147 .Case("e500mc", "e500mc")
1148 .Case("e5500", "e5500")
Bill Schmidt2821e182013-02-01 20:23:10 +00001149 .Case("power3", "pwr3")
1150 .Case("power4", "pwr4")
1151 .Case("power5", "pwr5")
1152 .Case("power5x", "pwr5x")
Hal Finkel02a84272012-06-11 22:35:19 +00001153 .Case("power6", "pwr6")
Bill Schmidt2821e182013-02-01 20:23:10 +00001154 .Case("power6x", "pwr6x")
Hal Finkel02a84272012-06-11 22:35:19 +00001155 .Case("power7", "pwr7")
Bill Schmidt2821e182013-02-01 20:23:10 +00001156 .Case("pwr3", "pwr3")
1157 .Case("pwr4", "pwr4")
1158 .Case("pwr5", "pwr5")
1159 .Case("pwr5x", "pwr5x")
1160 .Case("pwr6", "pwr6")
1161 .Case("pwr6x", "pwr6x")
1162 .Case("pwr7", "pwr7")
Hal Finkel02a84272012-06-11 22:35:19 +00001163 .Case("powerpc", "ppc")
1164 .Case("powerpc64", "ppc64")
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001165 .Case("powerpc64le", "ppc64le")
Hal Finkel02a84272012-06-11 22:35:19 +00001166 .Default("");
1167 }
1168
1169 return "";
1170}
1171
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001172static void getPPCTargetFeatures(const ArgList &Args,
1173 std::vector<const char *> &Features) {
Eric Christopherd5e59fc2013-10-16 20:40:08 +00001174 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1175 ie = Args.filtered_end();
1176 it != ie; ++it) {
1177 StringRef Name = (*it)->getOption().getName();
1178 (*it)->claim();
1179
1180 // Skip over "-m".
1181 assert(Name.startswith("m") && "Invalid feature name.");
1182 Name = Name.substr(1);
1183
1184 bool IsNegative = Name.startswith("no-");
1185 if (IsNegative)
1186 Name = Name.substr(3);
1187
1188 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1189 // pass the correct option to the backend while calling the frontend
1190 // option the same.
1191 // TODO: Change the LLVM backend option maybe?
1192 if (Name == "mfcrf")
1193 Name = "mfocrf";
1194
1195 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1196 }
1197
1198 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001199 AddTargetFeature(Args, Features, options::OPT_faltivec,
1200 options::OPT_fno_altivec, "altivec");
Hal Finkel02a84272012-06-11 22:35:19 +00001201}
1202
Tom Stellarde25d2f62013-04-01 20:56:53 +00001203/// Get the (LLVM) name of the R600 gpu we are targeting.
1204static std::string getR600TargetGPU(const ArgList &Args) {
1205 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001206 const char *GPUName = A->getValue();
Tom Stellarde25d2f62013-04-01 20:56:53 +00001207 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardfd4aa4b2013-05-06 16:12:05 +00001208 .Cases("rv630", "rv635", "r600")
1209 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellarde25d2f62013-04-01 20:56:53 +00001210 .Case("rv740", "rv770")
1211 .Case("palm", "cedar")
Tom Stellardfd4aa4b2013-05-06 16:12:05 +00001212 .Cases("sumo", "sumo2", "sumo")
Tom Stellarde25d2f62013-04-01 20:56:53 +00001213 .Case("hemlock", "cypress")
1214 .Case("aruba", "cayman")
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001215 .Default(GPUName);
Tom Stellarde25d2f62013-04-01 20:56:53 +00001216 }
1217 return "";
1218}
1219
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001220static void getSparcTargetFeatures(const ArgList &Args,
1221 std::vector<const char *> Features) {
1222 bool SoftFloatABI = true;
1223 if (Arg *A =
1224 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1225 if (A->getOption().matches(options::OPT_mhard_float))
1226 SoftFloatABI = false;
1227 }
1228 if (SoftFloatABI)
1229 Features.push_back("+soft-float");
1230}
1231
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001232void Clang::AddSparcTargetArgs(const ArgList &Args,
1233 ArgStringList &CmdArgs) const {
1234 const Driver &D = getToolChain().getDriver();
1235
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001236 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner5f9e2722011-07-23 10:55:15 +00001237 StringRef FloatABI;
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001238 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1239 options::OPT_mhard_float)) {
1240 if (A->getOption().matches(options::OPT_msoft_float))
1241 FloatABI = "soft";
1242 else if (A->getOption().matches(options::OPT_mhard_float))
1243 FloatABI = "hard";
1244 }
1245
1246 // If unspecified, choose the default based on the platform.
1247 if (FloatABI.empty()) {
Aaron Ballmand58915e2013-07-15 13:41:33 +00001248 // Assume "soft", but warn the user we are guessing.
1249 FloatABI = "soft";
1250 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001251 }
1252
1253 if (FloatABI == "soft") {
1254 // Floating point operations and argument passing are soft.
1255 //
1256 // FIXME: This changes CPP defines, we need -target-soft-float.
1257 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001258 } else {
1259 assert(FloatABI == "hard" && "Invalid float abi!");
1260 CmdArgs.push_back("-mhard-float");
1261 }
1262}
1263
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00001264static const char *getSystemZTargetCPU(const ArgList &Args) {
1265 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1266 return A->getValue();
1267 return "z10";
1268}
1269
Chandler Carruth700d4e42013-01-13 11:46:33 +00001270static const char *getX86TargetCPU(const ArgList &Args,
1271 const llvm::Triple &Triple) {
1272 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1273 if (StringRef(A->getValue()) != "native")
1274 return A->getValue();
1275
1276 // FIXME: Reject attempts to use -march=native unless the target matches
1277 // the host.
1278 //
1279 // FIXME: We should also incorporate the detected target features for use
1280 // with -native.
1281 std::string CPU = llvm::sys::getHostCPUName();
1282 if (!CPU.empty() && CPU != "generic")
1283 return Args.MakeArgString(CPU);
1284 }
1285
1286 // Select the default CPU if none was given (or detection failed).
1287
1288 if (Triple.getArch() != llvm::Triple::x86_64 &&
1289 Triple.getArch() != llvm::Triple::x86)
1290 return 0; // This routine is only handling x86 targets.
1291
1292 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1293
1294 // FIXME: Need target hooks.
1295 if (Triple.isOSDarwin())
1296 return Is64Bit ? "core2" : "yonah";
1297
Chandler Carruth700d4e42013-01-13 11:46:33 +00001298 // All x86 devices running Android have core2 as their common
1299 // denominator. This makes a better choice than pentium4.
1300 if (Triple.getEnvironment() == llvm::Triple::Android)
1301 return "core2";
1302
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001303 // Everything else goes to x86-64 in 64-bit mode.
1304 if (Is64Bit)
1305 return "x86-64";
1306
1307 switch (Triple.getOS()) {
1308 case llvm::Triple::FreeBSD:
1309 case llvm::Triple::NetBSD:
1310 case llvm::Triple::OpenBSD:
1311 return "i486";
1312 case llvm::Triple::Haiku:
1313 return "i586";
1314 case llvm::Triple::Bitrig:
1315 return "i686";
1316 default:
1317 // Fallback to p4.
1318 return "pentium4";
1319 }
Chandler Carruth700d4e42013-01-13 11:46:33 +00001320}
1321
Rafael Espindolab330e402013-08-20 22:12:08 +00001322static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1323 switch(T.getArch()) {
1324 default:
1325 return "";
1326
Amara Emerson3bb1b5c2013-10-31 09:32:33 +00001327 case llvm::Triple::aarch64:
1328 return getAArch64TargetCPU(Args, T);
1329
Rafael Espindolab330e402013-08-20 22:12:08 +00001330 case llvm::Triple::arm:
1331 case llvm::Triple::thumb:
1332 return getARMTargetCPU(Args, T);
1333
1334 case llvm::Triple::mips:
1335 case llvm::Triple::mipsel:
1336 case llvm::Triple::mips64:
1337 case llvm::Triple::mips64el: {
1338 StringRef CPUName;
1339 StringRef ABIName;
1340 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1341 return CPUName;
1342 }
1343
1344 case llvm::Triple::ppc:
1345 case llvm::Triple::ppc64:
1346 case llvm::Triple::ppc64le: {
1347 std::string TargetCPUName = getPPCTargetCPU(Args);
1348 // LLVM may default to generating code for the native CPU,
1349 // but, like gcc, we default to a more generic option for
1350 // each architecture. (except on Darwin)
1351 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1352 if (T.getArch() == llvm::Triple::ppc64)
1353 TargetCPUName = "ppc64";
1354 else if (T.getArch() == llvm::Triple::ppc64le)
1355 TargetCPUName = "ppc64le";
1356 else
1357 TargetCPUName = "ppc";
1358 }
1359 return TargetCPUName;
1360 }
1361
1362 case llvm::Triple::sparc:
1363 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1364 return A->getValue();
1365 return "";
1366
1367 case llvm::Triple::x86:
1368 case llvm::Triple::x86_64:
1369 return getX86TargetCPU(Args, T);
1370
1371 case llvm::Triple::hexagon:
1372 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1373
1374 case llvm::Triple::systemz:
1375 return getSystemZTargetCPU(Args);
1376
1377 case llvm::Triple::r600:
1378 return getR600TargetGPU(Args);
1379 }
1380}
1381
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001382static void getX86TargetFeatures(const ArgList &Args,
1383 std::vector<const char *> &Features) {
1384 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1385 ie = Args.filtered_end();
1386 it != ie; ++it) {
1387 StringRef Name = (*it)->getOption().getName();
1388 (*it)->claim();
1389
1390 // Skip over "-m".
1391 assert(Name.startswith("m") && "Invalid feature name.");
1392 Name = Name.substr(1);
1393
1394 bool IsNegative = Name.startswith("no-");
1395 if (IsNegative)
1396 Name = Name.substr(3);
1397
1398 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1399 }
1400}
1401
Daniel Dunbar6acda162009-09-09 22:33:08 +00001402void Clang::AddX86TargetArgs(const ArgList &Args,
1403 ArgStringList &CmdArgs) const {
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001404 if (!Args.hasFlag(options::OPT_mred_zone,
1405 options::OPT_mno_red_zone,
1406 true) ||
1407 Args.hasArg(options::OPT_mkernel) ||
1408 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar66861e02009-11-20 22:21:36 +00001409 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001410
Bob Wilsonf0c54562013-02-10 16:01:41 +00001411 // Default to avoid implicit floating-point for kernel/kext code, but allow
1412 // that to be overridden with -mno-soft-float.
1413 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1414 Args.hasArg(options::OPT_fapple_kext));
1415 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1416 options::OPT_mno_soft_float,
Bob Wilsonf6f77bd2013-04-11 18:53:25 +00001417 options::OPT_mimplicit_float,
Bob Wilsonf0c54562013-02-10 16:01:41 +00001418 options::OPT_mno_implicit_float)) {
1419 const Option &O = A->getOption();
1420 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1421 O.matches(options::OPT_msoft_float));
1422 }
1423 if (NoImplicitFloat)
Daniel Dunbar66861e02009-11-20 22:21:36 +00001424 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar6acda162009-09-09 22:33:08 +00001425}
1426
Matthew Curtis33c95f12012-12-06 17:49:03 +00001427static inline bool HasPICArg(const ArgList &Args) {
1428 return Args.hasArg(options::OPT_fPIC)
1429 || Args.hasArg(options::OPT_fpic);
1430}
1431
1432static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1433 return Args.getLastArg(options::OPT_G,
1434 options::OPT_G_EQ,
1435 options::OPT_msmall_data_threshold_EQ);
1436}
1437
1438static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1439 std::string value;
1440 if (HasPICArg(Args))
1441 value = "0";
1442 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1443 value = A->getValue();
1444 A->claim();
1445 }
1446 return value;
1447}
1448
Tony Linthicum96319392011-12-12 21:14:55 +00001449void Clang::AddHexagonTargetArgs(const ArgList &Args,
1450 ArgStringList &CmdArgs) const {
Tony Linthicum96319392011-12-12 21:14:55 +00001451 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis1dbaef52012-12-07 13:52:44 +00001452 CmdArgs.push_back("-mqdsp6-compat");
1453 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum96319392011-12-12 21:14:55 +00001454
Matthew Curtis33c95f12012-12-06 17:49:03 +00001455 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1456 if (!SmallDataThreshold.empty()) {
Tony Linthicum96319392011-12-12 21:14:55 +00001457 CmdArgs.push_back ("-mllvm");
Matthew Curtis33c95f12012-12-06 17:49:03 +00001458 CmdArgs.push_back(Args.MakeArgString(
1459 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00001460 }
1461
Sirish Pande5f9688b2012-05-10 20:19:54 +00001462 if (!Args.hasArg(options::OPT_fno_short_enums))
1463 CmdArgs.push_back("-fshort-enums");
1464 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1465 CmdArgs.push_back ("-mllvm");
1466 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1467 }
Tony Linthicum96319392011-12-12 21:14:55 +00001468 CmdArgs.push_back ("-mllvm");
1469 CmdArgs.push_back ("-machine-sink-split=0");
1470}
1471
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001472static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1473 std::vector<const char *> &Features) {
Tim Northoverb793f0d2013-08-01 09:23:19 +00001474 // Honor -mfpu=.
1475 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emersonfe7ed042013-10-01 10:20:54 +00001476 getAArch64FPUFeatures(D, A, Args, Features);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001477}
1478
1479static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1480 const ArgList &Args, ArgStringList &CmdArgs) {
1481 std::vector<const char *> Features;
1482 switch (Triple.getArch()) {
1483 default:
1484 break;
1485 case llvm::Triple::mips:
1486 case llvm::Triple::mipsel:
1487 case llvm::Triple::mips64:
1488 case llvm::Triple::mips64el:
1489 getMIPSTargetFeatures(D, Args, Features);
1490 break;
1491
1492 case llvm::Triple::arm:
1493 case llvm::Triple::thumb:
1494 getARMTargetFeatures(D, Triple, Args, Features);
1495 break;
1496
1497 case llvm::Triple::ppc:
1498 case llvm::Triple::ppc64:
1499 case llvm::Triple::ppc64le:
1500 getPPCTargetFeatures(Args, Features);
1501 break;
1502 case llvm::Triple::sparc:
1503 getSparcTargetFeatures(Args, Features);
1504 break;
1505 case llvm::Triple::aarch64:
1506 getAArch64TargetFeatures(D, Args, Features);
1507 break;
1508 case llvm::Triple::x86:
1509 case llvm::Triple::x86_64:
1510 getX86TargetFeatures(Args, Features);
1511 break;
1512 }
Rafael Espindolabc1e5452013-08-21 17:34:32 +00001513
1514 // Find the last of each feature.
1515 llvm::StringMap<unsigned> LastOpt;
1516 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1517 const char *Name = Features[I];
1518 assert(Name[0] == '-' || Name[0] == '+');
1519 LastOpt[Name + 1] = I;
1520 }
1521
1522 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1523 // If this feature was overridden, ignore it.
1524 const char *Name = Features[I];
1525 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1526 assert(LastI != LastOpt.end());
1527 unsigned Last = LastI->second;
1528 if (Last != I)
1529 continue;
1530
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001531 CmdArgs.push_back("-target-feature");
Rafael Espindolabc1e5452013-08-21 17:34:32 +00001532 CmdArgs.push_back(Name);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001533 }
Tim Northoverb793f0d2013-08-01 09:23:19 +00001534}
1535
Eric Christopher88b7cf02011-08-19 00:30:14 +00001536static bool
John McCall260611a2012-06-20 06:18:46 +00001537shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson525544d2011-02-28 00:44:51 +00001538 const llvm::Triple &Triple) {
1539 // We use the zero-cost exception tables for Objective-C if the non-fragile
1540 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1541 // later.
John McCall260611a2012-06-20 06:18:46 +00001542 if (runtime.isNonFragile())
Anders Carlsson525544d2011-02-28 00:44:51 +00001543 return true;
1544
Bob Wilson905c45f2011-10-14 05:03:44 +00001545 if (!Triple.isOSDarwin())
Anders Carlsson525544d2011-02-28 00:44:51 +00001546 return false;
1547
Eric Christopheraa7333c2011-07-02 00:20:22 +00001548 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson525544d2011-02-28 00:44:51 +00001549 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher88b7cf02011-08-19 00:30:14 +00001550 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson525544d2011-02-28 00:44:51 +00001551}
1552
Anders Carlsson15348ae2011-02-28 02:27:16 +00001553/// addExceptionArgs - Adds exception related arguments to the driver command
1554/// arguments. There's a master flag, -fexceptions and also language specific
1555/// flags to enable/disable C++ and Objective-C exceptions.
1556/// This makes it possible to for example disable C++ exceptions but enable
1557/// Objective-C exceptions.
1558static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1559 const llvm::Triple &Triple,
Fariborz Jahanian15b77312012-04-04 18:28:00 +00001560 bool KernelOrKext,
John McCall260611a2012-06-20 06:18:46 +00001561 const ObjCRuntime &objcRuntime,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001562 ArgStringList &CmdArgs) {
Chad Rosierafc4baa2012-03-26 22:04:46 +00001563 if (KernelOrKext) {
1564 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1565 // arguments now to avoid warnings about unused arguments.
1566 Args.ClaimAllArgs(options::OPT_fexceptions);
1567 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1568 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1569 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1570 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1571 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001572 return;
Chad Rosierafc4baa2012-03-26 22:04:46 +00001573 }
Anders Carlsson15348ae2011-02-28 02:27:16 +00001574
1575 // Exceptions are enabled by default.
1576 bool ExceptionsEnabled = true;
1577
1578 // This keeps track of whether exceptions were explicitly turned on or off.
1579 bool DidHaveExplicitExceptionFlag = false;
1580
Rafael Espindolaf759df02009-10-01 13:33:33 +00001581 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1582 options::OPT_fno_exceptions)) {
1583 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001584 ExceptionsEnabled = true;
Eric Christopher88b7cf02011-08-19 00:30:14 +00001585 else
Anders Carlsson15348ae2011-02-28 02:27:16 +00001586 ExceptionsEnabled = false;
1587
1588 DidHaveExplicitExceptionFlag = true;
Rafael Espindolaf759df02009-10-01 13:33:33 +00001589 }
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001590
Anders Carlsson15348ae2011-02-28 02:27:16 +00001591 bool ShouldUseExceptionTables = false;
Fariborz Jahanian85caf032009-10-01 20:30:46 +00001592
Anders Carlsson15348ae2011-02-28 02:27:16 +00001593 // Exception tables and cleanups can be enabled with -fexceptions even if the
1594 // language itself doesn't support exceptions.
1595 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1596 ShouldUseExceptionTables = true;
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001597
Daniel Dunbard47ea692011-03-17 23:28:31 +00001598 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1599 // is not necessarily sensible, but follows GCC.
1600 if (types::isObjC(InputType) &&
Eric Christopher88b7cf02011-08-19 00:30:14 +00001601 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbard47ea692011-03-17 23:28:31 +00001602 options::OPT_fno_objc_exceptions,
1603 true)) {
1604 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlsson15348ae2011-02-28 02:27:16 +00001605
Eric Christopher88b7cf02011-08-19 00:30:14 +00001606 ShouldUseExceptionTables |=
John McCall260611a2012-06-20 06:18:46 +00001607 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001608 }
1609
1610 if (types::isCXX(InputType)) {
1611 bool CXXExceptionsEnabled = ExceptionsEnabled;
1612
Eric Christopher88b7cf02011-08-19 00:30:14 +00001613 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1614 options::OPT_fno_cxx_exceptions,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001615 options::OPT_fexceptions,
1616 options::OPT_fno_exceptions)) {
1617 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1618 CXXExceptionsEnabled = true;
Chandler Carruth43f220f2011-02-28 07:25:18 +00001619 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001620 CXXExceptionsEnabled = false;
1621 }
1622
1623 if (CXXExceptionsEnabled) {
1624 CmdArgs.push_back("-fcxx-exceptions");
1625
1626 ShouldUseExceptionTables = true;
1627 }
1628 }
1629
1630 if (ShouldUseExceptionTables)
1631 CmdArgs.push_back("-fexceptions");
Rafael Espindolaf759df02009-10-01 13:33:33 +00001632}
1633
Daniel Dunbarf4910132013-04-16 18:21:19 +00001634static bool ShouldDisableAutolink(const ArgList &Args,
1635 const ToolChain &TC) {
1636 bool Default = true;
1637 if (TC.getTriple().isOSDarwin()) {
1638 // The native darwin assembler doesn't support the linker_option directives,
1639 // so we disable them if we think the .s file will be passed to it.
1640 Default = TC.useIntegratedAs();
1641 }
1642 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1643 Default);
1644}
1645
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001646static bool ShouldDisableCFI(const ArgList &Args,
1647 const ToolChain &TC) {
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001648 bool Default = true;
Bob Wilson905c45f2011-10-14 05:03:44 +00001649 if (TC.getTriple().isOSDarwin()) {
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001650 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindolacb773922011-05-17 19:06:58 +00001651 // we disable them if we think the .s file will be passed to it.
Rafael Espindolaaf370e62013-03-18 18:10:27 +00001652 Default = TC.useIntegratedAs();
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001653 }
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001654 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher27e2b982012-12-18 00:31:10 +00001655 options::OPT_fno_dwarf2_cfi_asm,
1656 Default);
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001657}
1658
Ted Kremenekc06fcdf2013-03-12 17:02:12 +00001659static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1660 const ToolChain &TC) {
Nick Lewyckyea523d72011-10-17 23:05:52 +00001661 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1662 options::OPT_fno_dwarf_directory_asm,
Rafael Espindolaaf370e62013-03-18 18:10:27 +00001663 TC.useIntegratedAs());
Nick Lewyckyea523d72011-10-17 23:05:52 +00001664 return !UseDwarfDirectory;
1665}
1666
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001667/// \brief Check whether the given input tree contains any compilation actions.
1668static bool ContainsCompileAction(const Action *A) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001669 if (isa<CompileJobAction>(A))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001670 return true;
1671
1672 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1673 if (ContainsCompileAction(*it))
1674 return true;
1675
1676 return false;
1677}
1678
1679/// \brief Check if -relax-all should be passed to the internal assembler.
1680/// This is done by default when compiling non-assembler source with -O0.
1681static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1682 bool RelaxDefault = true;
1683
1684 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1685 RelaxDefault = A->getOption().matches(options::OPT_O0);
1686
1687 if (RelaxDefault) {
1688 RelaxDefault = false;
1689 for (ActionList::const_iterator it = C.getActions().begin(),
1690 ie = C.getActions().end(); it != ie; ++it) {
1691 if (ContainsCompileAction(*it)) {
1692 RelaxDefault = true;
1693 break;
1694 }
1695 }
1696 }
1697
1698 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1699 RelaxDefault);
1700}
1701
David Blaikie73168db2013-07-25 21:19:01 +00001702static void CollectArgsForIntegratedAssembler(Compilation &C,
1703 const ArgList &Args,
1704 ArgStringList &CmdArgs,
1705 const Driver &D) {
1706 if (UseRelaxAll(C, Args))
1707 CmdArgs.push_back("-mrelax-all");
1708
1709 // When using an integrated assembler, translate -Wa, and -Xassembler
1710 // options.
1711 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1712 options::OPT_Xassembler),
1713 ie = Args.filtered_end(); it != ie; ++it) {
1714 const Arg *A = *it;
1715 A->claim();
1716
1717 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1718 StringRef Value = A->getValue(i);
1719
1720 if (Value == "-force_cpusubtype_ALL") {
1721 // Do nothing, this is the default and we don't support anything else.
1722 } else if (Value == "-L") {
1723 CmdArgs.push_back("-msave-temp-labels");
1724 } else if (Value == "--fatal-warnings") {
1725 CmdArgs.push_back("-mllvm");
1726 CmdArgs.push_back("-fatal-assembler-warnings");
1727 } else if (Value == "--noexecstack") {
1728 CmdArgs.push_back("-mnoexecstack");
1729 } else {
1730 D.Diag(diag::err_drv_unsupported_option_argument)
1731 << A->getOption().getName() << Value;
1732 }
1733 }
1734 }
1735}
1736
Chandler Carruth9db37cd2013-06-23 11:28:48 +00001737static void addProfileRTLinux(
1738 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1739 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1740 Args.hasArg(options::OPT_fprofile_generate) ||
1741 Args.hasArg(options::OPT_fcreate_profile) ||
1742 Args.hasArg(options::OPT_coverage)))
1743 return;
1744
1745 // The profile runtime is located in the Linux library directory and has name
1746 // "libclang_rt.profile-<ArchName>.a".
1747 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1748 llvm::sys::path::append(
1749 LibProfile, "lib", "linux",
1750 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1751
1752 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1753}
1754
Alexey Samsonov86143042013-02-27 11:14:55 +00001755static void addSanitizerRTLinkFlagsLinux(
1756 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smith76e6e132013-03-23 00:30:08 +00001757 const StringRef Sanitizer, bool BeforeLibStdCXX,
1758 bool ExportSymbols = true) {
Alexey Samsonov86143042013-02-27 11:14:55 +00001759 // Sanitizer runtime is located in the Linux library directory and
1760 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1761 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1762 llvm::sys::path::append(
1763 LibSanitizer, "lib", "linux",
1764 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smith61a574f2013-03-20 23:49:07 +00001765
Alexey Samsonov86143042013-02-27 11:14:55 +00001766 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1767 // etc.) so that the linker picks custom versions of the global 'operator
1768 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournebf548552013-10-20 21:29:13 +00001769 // strategy of inserting it at the front of the link command. It also
1770 // needs to be forced to end up in the executable, so wrap it in
1771 // whole-archive.
Richard Smith61a574f2013-03-20 23:49:07 +00001772 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournebf548552013-10-20 21:29:13 +00001773 LibSanitizerArgs.push_back("-whole-archive");
Richard Smith61a574f2013-03-20 23:49:07 +00001774 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournebf548552013-10-20 21:29:13 +00001775 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smith61a574f2013-03-20 23:49:07 +00001776
1777 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1778 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1779
Alexey Samsonov86143042013-02-27 11:14:55 +00001780 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov3a8aff92013-05-24 14:28:03 +00001781 CmdArgs.push_back("-lrt");
Alexey Samsonov86143042013-02-27 11:14:55 +00001782 CmdArgs.push_back("-ldl");
Evgeniy Stepanov6d0943f2013-10-29 19:48:47 +00001783 CmdArgs.push_back("-lm");
Richard Smith76e6e132013-03-23 00:30:08 +00001784
1785 // If possible, use a dynamic symbols file to export the symbols from the
1786 // runtime library. If we can't do so, use -export-dynamic instead to export
1787 // all symbols from the binary.
1788 if (ExportSymbols) {
1789 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1790 CmdArgs.push_back(
1791 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1792 else
1793 CmdArgs.push_back("-export-dynamic");
1794 }
Alexey Samsonov86143042013-02-27 11:14:55 +00001795}
1796
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001797/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1798/// This needs to be called before we add the C run-time (malloc, etc).
1799static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00001800 ArgStringList &CmdArgs) {
Nick Lewyckyd4705682013-10-11 03:33:53 +00001801 if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov8ba75412012-09-12 09:09:08 +00001802 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1803 llvm::sys::path::append(LibAsan, "lib", "linux",
1804 (Twine("libclang_rt.asan-") +
1805 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay45b27382012-12-04 21:18:26 +00001806 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001807 } else {
Sergey Matveev050309f2013-05-27 11:17:01 +00001808 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001809 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001810 }
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001811}
1812
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001813/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1814/// This needs to be called before we add the C run-time (malloc, etc).
1815static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1816 ArgStringList &CmdArgs) {
Sergey Matveev050309f2013-05-27 11:17:01 +00001817 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001818 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001819}
1820
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00001821/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1822/// This needs to be called before we add the C run-time (malloc, etc).
1823static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1824 ArgStringList &CmdArgs) {
Sergey Matveev050309f2013-05-27 11:17:01 +00001825 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001826 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev050309f2013-05-27 11:17:01 +00001827}
1828
1829/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1830/// This needs to be called before we add the C run-time (malloc, etc).
1831static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1832 ArgStringList &CmdArgs) {
1833 if (!Args.hasArg(options::OPT_shared))
1834 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00001835}
1836
Richard Smith4def70d2012-10-09 19:52:38 +00001837/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1838/// (Linux).
1839static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smith61a574f2013-03-20 23:49:07 +00001840 ArgStringList &CmdArgs, bool IsCXX,
1841 bool HasOtherSanitizerRt) {
Nick Lewycky63d29e22013-10-19 00:27:23 +00001842 // Need a copy of sanitizer_common. This could come from another sanitizer
1843 // runtime; if we're not including one, include our own copy.
1844 if (!HasOtherSanitizerRt)
Peter Collingbournebf548552013-10-20 21:29:13 +00001845 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
1846
1847 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
1848
1849 // Only include the bits of the runtime which need a C++ ABI library if
1850 // we're linking in C++ mode.
1851 if (IsCXX)
1852 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smith4def70d2012-10-09 19:52:38 +00001853}
1854
Peter Collingbourne2eeed712013-08-07 22:47:34 +00001855static void addDfsanRTLinux(const ToolChain &TC, const ArgList &Args,
1856 ArgStringList &CmdArgs) {
1857 if (!Args.hasArg(options::OPT_shared))
1858 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "dfsan", true);
1859}
1860
Benjamin Kramer5322a552013-10-16 17:42:39 +00001861static bool shouldUseFramePointerForTarget(const ArgList &Args,
1862 const llvm::Triple &Triple) {
1863 switch (Triple.getArch()) {
1864 // Don't use a frame pointer on linux if optimizing for certain targets.
1865 case llvm::Triple::mips64:
1866 case llvm::Triple::mips64el:
1867 case llvm::Triple::mips:
1868 case llvm::Triple::mipsel:
1869 case llvm::Triple::systemz:
1870 case llvm::Triple::x86:
1871 case llvm::Triple::x86_64:
1872 if (Triple.isOSLinux())
1873 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1874 if (!A->getOption().matches(options::OPT_O0))
1875 return false;
1876 return true;
1877 case llvm::Triple::xcore:
1878 return false;
1879 default:
1880 return true;
1881 }
1882}
1883
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001884static bool shouldUseFramePointer(const ArgList &Args,
1885 const llvm::Triple &Triple) {
1886 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1887 options::OPT_fomit_frame_pointer))
1888 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1889
Benjamin Kramer5322a552013-10-16 17:42:39 +00001890 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001891}
1892
Eric Christopherd3e22df2013-04-03 01:58:53 +00001893static bool shouldUseLeafFramePointer(const ArgList &Args,
1894 const llvm::Triple &Triple) {
1895 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1896 options::OPT_momit_leaf_frame_pointer))
1897 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1898
Benjamin Kramer5322a552013-10-16 17:42:39 +00001899 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherd3e22df2013-04-03 01:58:53 +00001900}
1901
Rafael Espindolaa2148242013-08-10 01:40:10 +00001902/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruthd566df62012-12-17 21:40:04 +00001903static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer6089adc2013-04-27 08:12:29 +00001904 SmallString<128> cwd;
1905 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosierb1c81222013-04-26 20:49:50 +00001906 CmdArgs.push_back("-fdebug-compilation-dir");
1907 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruthd566df62012-12-17 21:40:04 +00001908 }
1909}
1910
Eric Christopher80190392013-02-22 20:12:52 +00001911static const char *SplitDebugName(const ArgList &Args,
1912 const InputInfoList &Inputs) {
1913 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1914 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1915 SmallString<128> T(FinalOutput->getValue());
1916 llvm::sys::path::replace_extension(T, "dwo");
1917 return Args.MakeArgString(T);
1918 } else {
1919 // Use the compilation dir.
1920 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1921 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1922 llvm::sys::path::replace_extension(F, "dwo");
1923 T += F;
1924 return Args.MakeArgString(F);
1925 }
1926}
1927
1928static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1929 const Tool &T, const JobAction &JA,
1930 const ArgList &Args, const InputInfo &Output,
1931 const char *OutFile) {
Eric Christopher59320e72013-02-21 22:35:01 +00001932 ArgStringList ExtractArgs;
1933 ExtractArgs.push_back("--extract-dwo");
1934
1935 ArgStringList StripArgs;
1936 StripArgs.push_back("--strip-dwo");
1937
1938 // Grabbing the output of the earlier compile step.
1939 StripArgs.push_back(Output.getFilename());
1940 ExtractArgs.push_back(Output.getFilename());
Eric Christopher59320e72013-02-21 22:35:01 +00001941 ExtractArgs.push_back(OutFile);
1942
1943 const char *Exec =
Eric Christopher80190392013-02-22 20:12:52 +00001944 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher59320e72013-02-21 22:35:01 +00001945
1946 // First extract the dwo sections.
Eric Christopher80190392013-02-22 20:12:52 +00001947 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00001948
1949 // Then remove them from the original .o file.
Eric Christopher80190392013-02-22 20:12:52 +00001950 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00001951}
1952
Chad Rosierb82e1172013-04-24 18:09:54 +00001953static bool isOptimizationLevelFast(const ArgList &Args) {
1954 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1955 if (A->getOption().matches(options::OPT_Ofast))
1956 return true;
1957 return false;
1958}
1959
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001960/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
1961static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
1962 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindola55ee1eb2013-08-27 16:58:15 +00001963 if (A->getOption().matches(options::OPT_O4) ||
1964 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001965 return true;
1966
1967 if (A->getOption().matches(options::OPT_O0))
1968 return false;
1969
1970 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
1971
Rafael Espindola168de192013-08-26 14:05:41 +00001972 // Vectorize -Os.
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001973 StringRef S(A->getValue());
Rafael Espindola168de192013-08-26 14:05:41 +00001974 if (S == "s")
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001975 return true;
1976
1977 // Don't vectorize -Oz.
1978 if (S == "z")
1979 return false;
1980
1981 unsigned OptLevel = 0;
1982 if (S.getAsInteger(10, OptLevel))
1983 return false;
1984
1985 return OptLevel > 1;
1986 }
1987
1988 return false;
1989}
1990
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001991void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar871adcf2009-03-18 07:06:02 +00001992 const InputInfo &Output,
Daniel Dunbar62cf6012009-03-18 06:07:59 +00001993 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00001994 const ArgList &Args,
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001995 const char *LinkingOutput) const {
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00001996 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1997 options::OPT_fapple_kext);
Daniel Dunbaree788e72009-12-21 18:54:17 +00001998 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001999 ArgStringList CmdArgs;
2000
Daniel Dunbar077ba6a2009-03-31 20:53:55 +00002001 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2002
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00002003 // Invoke ourselves in -cc1 mode.
2004 //
2005 // FIXME: Implement custom jobs for internal actions.
2006 CmdArgs.push_back("-cc1");
2007
Daniel Dunbardd4fe002009-10-30 18:12:20 +00002008 // Add the "effective" target triple.
Daniel Dunbaraf07f932009-03-31 17:35:15 +00002009 CmdArgs.push_back("-triple");
Daniel Dunbar00577ad2010-08-23 22:35:37 +00002010 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbardd4fe002009-10-30 18:12:20 +00002011 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbar728a5122009-09-10 06:49:20 +00002012
Daniel Dunbardd4fe002009-10-30 18:12:20 +00002013 // Select the appropriate action.
John McCall260611a2012-06-20 06:18:46 +00002014 RewriteKind rewriteKind = RK_None;
Fariborz Jahaniane982cc02012-04-04 18:50:28 +00002015
Daniel Dunbar1d460332009-03-18 10:01:51 +00002016 if (isa<AnalyzeJobAction>(JA)) {
2017 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2018 CmdArgs.push_back("-analyze");
Ted Kremenek30660a82012-03-06 20:06:33 +00002019 } else if (isa<MigrateJobAction>(JA)) {
2020 CmdArgs.push_back("-migrate");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002021 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00002022 if (Output.getType() == types::TY_Dependencies)
2023 CmdArgs.push_back("-Eonly");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00002024 else {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00002025 CmdArgs.push_back("-E");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00002026 if (Args.hasArg(options::OPT_rewrite_objc) &&
2027 !Args.hasArg(options::OPT_g_Group))
2028 CmdArgs.push_back("-P");
2029 }
Daniel Dunbar8767cbc2010-02-03 03:07:56 +00002030 } else if (isa<AssembleJobAction>(JA)) {
2031 CmdArgs.push_back("-emit-obj");
Daniel Dunbar99298002010-05-27 06:18:05 +00002032
David Blaikie73168db2013-07-25 21:19:01 +00002033 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbard02bba82010-11-19 16:23:35 +00002034
2035 // Also ignore explicit -force_cpusubtype_ALL option.
2036 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002037 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +00002038 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00002039 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00002040
Aaron Ballman761322b2012-07-31 01:21:00 +00002041 if (JA.getType() == types::TY_Nothing)
2042 CmdArgs.push_back("-fsyntax-only");
2043 else if (UsePCH)
Douglas Gregordf91ef32009-04-18 00:34:01 +00002044 CmdArgs.push_back("-emit-pch");
2045 else
2046 CmdArgs.push_back("-emit-pth");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002047 } else {
2048 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002049
Daniel Dunbar1d460332009-03-18 10:01:51 +00002050 if (JA.getType() == types::TY_Nothing) {
2051 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00002052 } else if (JA.getType() == types::TY_LLVM_IR ||
2053 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002054 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00002055 } else if (JA.getType() == types::TY_LLVM_BC ||
2056 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002057 CmdArgs.push_back("-emit-llvm-bc");
2058 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbare3b8d072009-09-17 00:47:53 +00002059 CmdArgs.push_back("-S");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00002060 } else if (JA.getType() == types::TY_AST) {
2061 CmdArgs.push_back("-emit-pch");
Douglas Gregorc544ba02013-03-27 16:47:18 +00002062 } else if (JA.getType() == types::TY_ModuleFile) {
2063 CmdArgs.push_back("-module-file-info");
Daniel Dunbar64952502010-02-11 03:16:21 +00002064 } else if (JA.getType() == types::TY_RewrittenObjC) {
2065 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00002066 rewriteKind = RK_NonFragile;
Fariborz Jahanian582b3952012-04-02 15:59:19 +00002067 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2068 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00002069 rewriteKind = RK_Fragile;
Daniel Dunbar64952502010-02-11 03:16:21 +00002070 } else {
2071 assert(JA.getType() == types::TY_PP_Asm &&
2072 "Unexpected output type!");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002073 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002074 }
2075
Daniel Dunbar1d460332009-03-18 10:01:51 +00002076 // The make clang go fast button.
2077 CmdArgs.push_back("-disable-free");
2078
John McCallb689afb2010-02-13 03:50:24 +00002079 // Disable the verification pass in -asserts builds.
2080#ifdef NDEBUG
2081 CmdArgs.push_back("-disable-llvm-verifier");
2082#endif
2083
Daniel Dunbarc9abc042009-04-08 05:11:16 +00002084 // Set the main file name, so that debug info works even with
2085 // -save-temps.
2086 CmdArgs.push_back("-main-file-name");
Bob Wilson66b8a662012-11-23 06:14:39 +00002087 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbarc9abc042009-04-08 05:11:16 +00002088
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00002089 // Some flags which affect the language (via preprocessor
Bob Wilson66b8a662012-11-23 06:14:39 +00002090 // defines).
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00002091 if (Args.hasArg(options::OPT_static))
2092 CmdArgs.push_back("-static-define");
2093
Daniel Dunbar1d460332009-03-18 10:01:51 +00002094 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenekb8bb3e72009-09-25 05:55:59 +00002095 // Enable region store model by default.
2096 CmdArgs.push_back("-analyzer-store=region");
2097
Ted Kremenekb40d06d2009-12-07 22:26:14 +00002098 // Treat blocks as analysis entry points.
2099 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2100
Ted Kremenek51885072011-03-24 00:28:47 +00002101 CmdArgs.push_back("-analyzer-eagerly-assume");
2102
Daniel Dunbar1d460332009-03-18 10:01:51 +00002103 // Add default argument set.
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002104 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002105 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek51885072011-03-24 00:28:47 +00002106
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002107 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2108 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek51885072011-03-24 00:28:47 +00002109
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002110 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek51885072011-03-24 00:28:47 +00002111 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremeneka8180e52012-01-20 06:00:17 +00002112
2113 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek8dc05062012-01-26 02:27:38 +00002114
Jordan Rosee449edc2013-04-05 17:55:07 +00002115 if (types::isCXX(Inputs[0].getType()))
2116 CmdArgs.push_back("-analyzer-checker=cplusplus");
2117
Ted Kremenek8dc05062012-01-26 02:27:38 +00002118 // Enable the following experimental checkers for testing.
Ted Kremenek8dc05062012-01-26 02:27:38 +00002119 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2120 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2121 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2122 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2123 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2124 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002125 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002126
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002127 // Set the output format. The default is plist, for (lame) historical
2128 // reasons.
2129 CmdArgs.push_back("-analyzer-output");
2130 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smith1d489cf2012-11-01 04:30:05 +00002131 CmdArgs.push_back(A->getValue());
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002132 else
2133 CmdArgs.push_back("plist");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002134
Ted Kremenek0647a7b2010-03-22 22:32:05 +00002135 // Disable the presentation of standard compiler warnings when
2136 // using --analyze. We only want to show static analyzer diagnostics
2137 // or frontend errors.
2138 CmdArgs.push_back("-w");
2139
Daniel Dunbar1d460332009-03-18 10:01:51 +00002140 // Add -Xanalyzer arguments when running as analyzer.
2141 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump1eb44332009-09-09 15:08:12 +00002142 }
2143
Daniel Dunbare2fd6642009-09-10 01:21:12 +00002144 CheckCodeGenerationOptions(D, Args);
2145
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002146 bool PIE = getToolChain().isPIEDefault();
2147 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002148 bool IsPICLevelTwo = PIC;
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002149
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002150 // For the PIC and PIE flag options, this logic is different from the
2151 // legacy logic in very old versions of GCC, as that logic was just
2152 // a bug no one had ever fixed. This logic is both more rational and
2153 // consistent with GCC's new logic now that the bugs are fixed. The last
2154 // argument relating to either PIC or PIE wins, and no other argument is
2155 // used. If the last argument is any flavor of the '-fno-...' arguments,
2156 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2157 // at the same level.
2158 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2159 options::OPT_fpic, options::OPT_fno_pic,
2160 options::OPT_fPIE, options::OPT_fno_PIE,
2161 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002162 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2163 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002164 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002165 if (LastPICArg) {
2166 Option O = LastPICArg->getOption();
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002167 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2168 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2169 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2170 PIC = PIE || O.matches(options::OPT_fPIC) ||
2171 O.matches(options::OPT_fpic);
2172 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2173 O.matches(options::OPT_fPIC);
2174 } else {
2175 PIE = PIC = false;
2176 }
2177 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002178 }
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002179
Nick Lewyckyd4705682013-10-11 03:33:53 +00002180 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002181 // specified while enabling PIC enabled level 1 PIC, just force it back to
2182 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2183 // informal testing).
2184 if (PIC && getToolChain().getTriple().isOSDarwin())
2185 IsPICLevelTwo |= getToolChain().isPICDefault();
2186
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002187 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2188 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00002189 llvm::Triple Triple(TripleStr);
Eric Christopher6c7db892013-02-18 01:16:37 +00002190 if (KernelOrKext &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00002191 (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002192 PIC = PIE = false;
Simon Atanasyanc0e83642013-10-04 11:46:54 +00002193 if (Args.hasArg(options::OPT_static))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002194 PIC = PIE = false;
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002195
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002196 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2197 // This is a very special mode. It trumps the other modes, almost no one
2198 // uses it, and it isn't even valid on any OS but Darwin.
2199 if (!getToolChain().getTriple().isOSDarwin())
2200 D.Diag(diag::err_drv_unsupported_opt_for_target)
2201 << A->getSpelling() << getToolChain().getTriple().str();
2202
2203 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2204
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002205 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002206 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002207
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002208 // Only a forced PIC mode can cause the actual compile to have PIC defines
2209 // etc., no flags are sufficient. This behavior was selected to closely
2210 // match that of llvm-gcc and Apple GCC before that.
2211 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2212 CmdArgs.push_back("-pic-level");
2213 CmdArgs.push_back("2");
2214 }
2215 } else {
2216 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2217 // handled in Clang's IRGen by the -pie-level flag.
2218 CmdArgs.push_back("-mrelocation-model");
2219 CmdArgs.push_back(PIC ? "pic" : "static");
2220
2221 if (PIC) {
2222 CmdArgs.push_back("-pic-level");
2223 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2224 if (PIE) {
2225 CmdArgs.push_back("-pie-level");
2226 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2227 }
2228 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002229 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002230
Tanya Lattner59876c22009-11-04 01:18:09 +00002231 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2232 options::OPT_fno_merge_all_constants))
Chris Lattnerf44a1a02011-04-08 18:06:54 +00002233 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002234
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002235 // LLVM Code Generator Options.
2236
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002237 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2238 CmdArgs.push_back("-mregparm");
Richard Smith1d489cf2012-11-01 04:30:05 +00002239 CmdArgs.push_back(A->getValue());
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002240 }
2241
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00002242 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2243 options::OPT_freg_struct_return)) {
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002244 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCallb8b52972013-06-18 02:46:29 +00002245 D.Diag(diag::err_drv_unsupported_opt_for_target)
2246 << A->getSpelling() << getToolChain().getTriple().str();
2247 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2248 CmdArgs.push_back("-fpcc-struct-return");
2249 } else {
2250 assert(A->getOption().matches(options::OPT_freg_struct_return));
2251 CmdArgs.push_back("-freg-struct-return");
2252 }
2253 }
2254
Roman Divackycfe9af22011-03-01 17:40:53 +00002255 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2256 CmdArgs.push_back("-mrtd");
2257
Rafael Espindola6af27ec2011-12-14 21:02:23 +00002258 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002259 CmdArgs.push_back("-mdisable-fp-elim");
2260 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2261 options::OPT_fno_zero_initialized_in_bss))
2262 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb82e1172013-04-24 18:09:54 +00002263
2264 bool OFastEnabled = isOptimizationLevelFast(Args);
2265 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2266 // enabled. This alias option is being used to simplify the hasFlag logic.
2267 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2268 options::OPT_fstrict_aliasing;
2269 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Daniel Dunbar398c6102011-02-04 02:20:39 +00002270 options::OPT_fno_strict_aliasing,
2271 getToolChain().IsStrictAliasingDefault()))
Dan Gohman4d5625e2010-10-14 22:36:56 +00002272 CmdArgs.push_back("-relaxed-aliasing");
Manman Ren96d6c452013-10-11 20:48:38 +00002273 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2274 options::OPT_fno_struct_path_tbaa))
2275 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth82fe6ae2012-03-27 23:58:37 +00002276 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2277 false))
2278 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1db772b2012-01-23 08:29:12 +00002279 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2280 options::OPT_fno_optimize_sibling_calls))
2281 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002282
Eric Christopher31056272013-04-04 06:29:47 +00002283 // Handle segmented stacks.
2284 if (Args.hasArg(options::OPT_fsplit_stack))
2285 CmdArgs.push_back("-split-stacks");
Chad Rosierb82e1172013-04-24 18:09:54 +00002286
2287 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2288 // This alias option is being used to simplify the getLastArg logic.
2289 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2290 options::OPT_ffast_math;
Eric Christopher31056272013-04-04 06:29:47 +00002291
Chandler Carruthabf07a72012-01-02 14:19:45 +00002292 // Handle various floating point optimization flags, mapping them to the
2293 // appropriate LLVM code generation flags. The pattern for all of these is to
2294 // default off the codegen optimizations, and if any flag enables them and no
2295 // flag disables them after the flag enabling them, enable the codegen
2296 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb82e1172013-04-24 18:09:54 +00002297 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002298 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002299 options::OPT_ffinite_math_only,
2300 options::OPT_fno_finite_math_only,
2301 options::OPT_fhonor_infinities,
2302 options::OPT_fno_honor_infinities))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002303 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2304 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002305 A->getOption().getID() != options::OPT_fhonor_infinities)
2306 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb82e1172013-04-24 18:09:54 +00002307 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002308 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002309 options::OPT_ffinite_math_only,
2310 options::OPT_fno_finite_math_only,
2311 options::OPT_fhonor_nans,
2312 options::OPT_fno_honor_nans))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002313 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2314 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002315 A->getOption().getID() != options::OPT_fhonor_nans)
2316 CmdArgs.push_back("-menable-no-nans");
2317
Benjamin Kramer769aa2d2012-05-02 14:55:48 +00002318 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2319 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb82e1172013-04-24 18:09:54 +00002320 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002321 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002322 options::OPT_fmath_errno,
Chandler Carruthb69557e2013-05-18 20:47:36 +00002323 options::OPT_fno_math_errno)) {
2324 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2325 // However, turning *off* -ffast_math merely restores the toolchain default
2326 // (which may be false).
2327 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2328 A->getOption().getID() == options::OPT_ffast_math ||
2329 A->getOption().getID() == options::OPT_Ofast)
2330 MathErrno = false;
2331 else if (A->getOption().getID() == options::OPT_fmath_errno)
2332 MathErrno = true;
2333 }
Chandler Carruth4f50c502012-04-26 02:10:51 +00002334 if (MathErrno)
2335 CmdArgs.push_back("-fmath-errno");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002336
2337 // There are several flags which require disabling very specific
2338 // optimizations. Any of these being disabled forces us to turn off the
2339 // entire set of LLVM optimizations, so collect them through all the flag
2340 // madness.
2341 bool AssociativeMath = false;
Chad Rosierb82e1172013-04-24 18:09:54 +00002342 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002343 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002344 options::OPT_funsafe_math_optimizations,
2345 options::OPT_fno_unsafe_math_optimizations,
2346 options::OPT_fassociative_math,
2347 options::OPT_fno_associative_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002348 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2349 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002350 A->getOption().getID() != options::OPT_fno_associative_math)
2351 AssociativeMath = true;
2352 bool ReciprocalMath = false;
Chad Rosierb82e1172013-04-24 18:09:54 +00002353 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002354 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002355 options::OPT_funsafe_math_optimizations,
2356 options::OPT_fno_unsafe_math_optimizations,
2357 options::OPT_freciprocal_math,
2358 options::OPT_fno_reciprocal_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002359 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2360 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002361 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2362 ReciprocalMath = true;
2363 bool SignedZeros = true;
Chad Rosierb82e1172013-04-24 18:09:54 +00002364 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002365 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002366 options::OPT_funsafe_math_optimizations,
2367 options::OPT_fno_unsafe_math_optimizations,
2368 options::OPT_fsigned_zeros,
2369 options::OPT_fno_signed_zeros))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002370 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2371 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002372 A->getOption().getID() != options::OPT_fsigned_zeros)
2373 SignedZeros = false;
2374 bool TrappingMath = true;
Chad Rosierb82e1172013-04-24 18:09:54 +00002375 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002376 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002377 options::OPT_funsafe_math_optimizations,
2378 options::OPT_fno_unsafe_math_optimizations,
2379 options::OPT_ftrapping_math,
2380 options::OPT_fno_trapping_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002381 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2382 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002383 A->getOption().getID() != options::OPT_ftrapping_math)
2384 TrappingMath = false;
2385 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2386 !TrappingMath)
2387 CmdArgs.push_back("-menable-unsafe-fp-math");
2388
Lang Hamesc9686712012-07-06 00:59:19 +00002389
2390 // Validate and pass through -fp-contract option.
Chad Rosierb82e1172013-04-24 18:09:54 +00002391 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002392 options::OPT_fno_fast_math,
Lang Hamesc9686712012-07-06 00:59:19 +00002393 options::OPT_ffp_contract)) {
2394 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002395 StringRef Val = A->getValue();
Lang Hamesc9686712012-07-06 00:59:19 +00002396 if (Val == "fast" || Val == "on" || Val == "off") {
2397 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2398 } else {
2399 D.Diag(diag::err_drv_unsupported_option_argument)
2400 << A->getOption().getName() << Val;
2401 }
Chad Rosierb82e1172013-04-24 18:09:54 +00002402 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2403 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesc9686712012-07-06 00:59:19 +00002404 // If fast-math is set then set the fp-contract mode to fast.
2405 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2406 }
2407 }
2408
Bob Wilson455e72e2012-07-19 03:52:53 +00002409 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2410 // and if we find them, tell the frontend to provide the appropriate
2411 // preprocessor macros. This is distinct from enabling any optimizations as
2412 // these options induce language changes which must survive serialization
2413 // and deserialization, etc.
Chad Rosierb82e1172013-04-24 18:09:54 +00002414 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2415 options::OPT_fno_fast_math))
2416 if (!A->getOption().matches(options::OPT_fno_fast_math))
2417 CmdArgs.push_back("-ffast-math");
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002418 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2419 if (A->getOption().matches(options::OPT_ffinite_math_only))
2420 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002421
Daniel Dunbar1b718482010-05-14 22:00:22 +00002422 // Decide whether to use verbose asm. Verbose assembly is the default on
2423 // toolchains which have the integrated assembler on by default.
2424 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2425 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer20249a12010-10-21 03:16:25 +00002426 IsVerboseAsmDefault) ||
Daniel Dunbar1b718482010-05-14 22:00:22 +00002427 Args.hasArg(options::OPT_dA))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002428 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002429
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002430 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2431 CmdArgs.push_back("-mdebug-pass");
2432 CmdArgs.push_back("Structure");
2433 }
2434 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2435 CmdArgs.push_back("-mdebug-pass");
2436 CmdArgs.push_back("Arguments");
2437 }
2438
John McCalld0c2ec42010-02-19 02:45:38 +00002439 // Enable -mconstructor-aliases except on darwin, where we have to
2440 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson905c45f2011-10-14 05:03:44 +00002441 if (!getToolChain().getTriple().isOSDarwin())
John McCalld0c2ec42010-02-19 02:45:38 +00002442 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00002443
John McCall32096692011-03-18 02:56:14 +00002444 // Darwin's kernel doesn't support guard variables; just die if we
2445 // try to use them.
Bob Wilson905c45f2011-10-14 05:03:44 +00002446 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall32096692011-03-18 02:56:14 +00002447 CmdArgs.push_back("-fforbid-guard-variables");
2448
Douglas Gregor6f755502011-02-01 15:15:22 +00002449 if (Args.hasArg(options::OPT_mms_bitfields)) {
2450 CmdArgs.push_back("-mms-bitfields");
2451 }
John McCalld0c2ec42010-02-19 02:45:38 +00002452
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002453 // This is a coarse approximation of what llvm-gcc actually does, both
2454 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2455 // complicated ways.
2456 bool AsynchronousUnwindTables =
2457 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2458 options::OPT_fno_asynchronous_unwind_tables,
2459 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002460 !KernelOrKext);
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002461 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2462 AsynchronousUnwindTables))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002463 CmdArgs.push_back("-munwind-tables");
2464
Chandler Carrutha6b25812012-11-21 23:40:23 +00002465 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola8af669f2012-06-19 01:26:10 +00002466
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002467 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2468 CmdArgs.push_back("-mlimit-float-precision");
Richard Smith1d489cf2012-11-01 04:30:05 +00002469 CmdArgs.push_back(A->getValue());
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002470 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002471
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002472 // FIXME: Handle -mtune=.
2473 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002474
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002475 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002476 CmdArgs.push_back("-mcode-model");
Richard Smith1d489cf2012-11-01 04:30:05 +00002477 CmdArgs.push_back(A->getValue());
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002478 }
2479
Rafael Espindolab330e402013-08-20 22:12:08 +00002480 // Add the target cpu
2481 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2482 llvm::Triple ETriple(ETripleStr);
2483 std::string CPU = getCPUName(Args, ETriple);
2484 if (!CPU.empty()) {
2485 CmdArgs.push_back("-target-cpu");
2486 CmdArgs.push_back(Args.MakeArgString(CPU));
2487 }
2488
Rafael Espindola5389b842013-08-21 21:59:03 +00002489 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2490 CmdArgs.push_back("-mfpmath");
2491 CmdArgs.push_back(A->getValue());
2492 }
2493
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002494 // Add the target features
2495 getTargetFeatures(D, ETriple, Args, CmdArgs);
2496
Rafael Espindolab330e402013-08-20 22:12:08 +00002497 // Add target specific flags.
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002498 switch(getToolChain().getArch()) {
Daniel Dunbar6acda162009-09-09 22:33:08 +00002499 default:
2500 break;
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002501
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002502 case llvm::Triple::arm:
2503 case llvm::Triple::thumb:
Daniel Dunbarfa41d692011-03-17 17:10:06 +00002504 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002505 break;
2506
Eric Christophered734732010-03-02 02:41:08 +00002507 case llvm::Triple::mips:
2508 case llvm::Triple::mipsel:
Akira Hatanaka7ec02582011-09-21 02:13:07 +00002509 case llvm::Triple::mips64:
2510 case llvm::Triple::mips64el:
Eric Christophered734732010-03-02 02:41:08 +00002511 AddMIPSTargetArgs(Args, CmdArgs);
2512 break;
2513
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002514 case llvm::Triple::sparc:
2515 AddSparcTargetArgs(Args, CmdArgs);
2516 break;
2517
Daniel Dunbar6acda162009-09-09 22:33:08 +00002518 case llvm::Triple::x86:
2519 case llvm::Triple::x86_64:
2520 AddX86TargetArgs(Args, CmdArgs);
2521 break;
Tony Linthicum96319392011-12-12 21:14:55 +00002522
2523 case llvm::Triple::hexagon:
2524 AddHexagonTargetArgs(Args, CmdArgs);
2525 break;
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002526 }
2527
Hans Wennborgb3574792013-08-08 00:17:41 +00002528 // Add clang-cl arguments.
2529 if (getToolChain().getDriver().IsCLMode())
2530 AddClangCLArgs(Args, CmdArgs);
2531
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002532 // Pass the linker version in use.
2533 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2534 CmdArgs.push_back("-target-linker-version");
Richard Smith1d489cf2012-11-01 04:30:05 +00002535 CmdArgs.push_back(A->getValue());
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002536 }
2537
Eric Christopherd3e22df2013-04-03 01:58:53 +00002538 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbar1ad66482010-07-01 01:31:45 +00002539 CmdArgs.push_back("-momit-leaf-frame-pointer");
2540
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002541 // Explicitly error on some things we know we don't support and can't just
2542 // ignore.
2543 types::ID InputType = Inputs[0].getType();
Daniel Dunbare94db472010-09-24 19:39:37 +00002544 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2545 Arg *Unsupported;
Daniel Dunbare94db472010-09-24 19:39:37 +00002546 if (types::isCXX(InputType) &&
Bob Wilson905c45f2011-10-14 05:03:44 +00002547 getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002548 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilsona544aee2011-08-13 23:48:55 +00002549 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2550 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002551 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbare94db472010-09-24 19:39:37 +00002552 << Unsupported->getOption().getName();
2553 }
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002554 }
2555
Daniel Dunbar1d460332009-03-18 10:01:51 +00002556 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbarf7c16d92010-08-24 22:44:13 +00002557 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosier2b819102011-08-02 17:58:04 +00002558 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbar322c29f2011-02-02 21:11:35 +00002559 CmdArgs.push_back("-header-include-file");
2560 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2561 D.CCPrintHeadersFilename : "-");
2562 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002563 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump1eb44332009-09-09 15:08:12 +00002564 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002565
Chad Rosier2b819102011-08-02 17:58:04 +00002566 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00002567 CmdArgs.push_back("-diagnostic-log-file");
2568 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2569 D.CCLogDiagnosticsFilename : "-");
2570 }
2571
Eric Christopherc706c8e2013-02-05 07:29:57 +00002572 // Use the last option from "-g" group. "-gline-tables-only"
2573 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola18f36d92010-03-07 04:46:18 +00002574 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002575 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopherc706c8e2013-02-05 07:29:57 +00002576 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002577 CmdArgs.push_back("-gline-tables-only");
Manman Renfc0f91c2013-06-19 01:46:49 +00002578 else if (A->getOption().matches(options::OPT_gdwarf_2))
2579 CmdArgs.push_back("-gdwarf-2");
2580 else if (A->getOption().matches(options::OPT_gdwarf_3))
2581 CmdArgs.push_back("-gdwarf-3");
2582 else if (A->getOption().matches(options::OPT_gdwarf_4))
2583 CmdArgs.push_back("-gdwarf-4");
Eric Christopherc706c8e2013-02-05 07:29:57 +00002584 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren8ed38d82013-07-02 23:15:25 +00002585 !A->getOption().matches(options::OPT_ggdb0)) {
2586 // Default is dwarf-2 for darwin.
2587 if (getToolChain().getTriple().isOSDarwin())
2588 CmdArgs.push_back("-gdwarf-2");
2589 else
2590 CmdArgs.push_back("-g");
2591 }
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002592 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002593
Alexey Samsonov7f326072012-06-21 08:22:39 +00002594 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2595 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christopherda3301e2012-10-18 21:52:18 +00002596 if (Args.hasArg(options::OPT_gcolumn_info))
2597 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonov7f326072012-06-21 08:22:39 +00002598
Eric Christopher0f43a6d2013-09-13 22:37:55 +00002599 // FIXME: Move backend command line options to the module.
Eric Christopherc706c8e2013-02-05 07:29:57 +00002600 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2601 // splitting and extraction.
Eric Christopherf870e122013-02-21 22:35:05 +00002602 // FIXME: Currently only works on Linux.
Cameron Esfahani57b1da12013-09-14 01:09:11 +00002603 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherf870e122013-02-21 22:35:05 +00002604 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopherc706c8e2013-02-05 07:29:57 +00002605 CmdArgs.push_back("-g");
2606 CmdArgs.push_back("-backend-option");
2607 CmdArgs.push_back("-split-dwarf=Enable");
2608 }
2609
Eric Christopher0f43a6d2013-09-13 22:37:55 +00002610 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2611 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2612 CmdArgs.push_back("-backend-option");
2613 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2614 }
Eric Christopher3e8ac1b2013-06-18 00:03:50 +00002615
2616 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2617
Rafael Espindola9cf933a2010-05-06 21:06:04 +00002618 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2619 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2620
Chris Lattner7255a2d2010-06-22 00:03:40 +00002621 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2622
Nick Lewyckye8ba8d72011-04-21 23:44:07 +00002623 if (Args.hasArg(options::OPT_ftest_coverage) ||
2624 Args.hasArg(options::OPT_coverage))
2625 CmdArgs.push_back("-femit-coverage-notes");
2626 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2627 Args.hasArg(options::OPT_coverage))
2628 CmdArgs.push_back("-femit-coverage-data");
2629
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002630 if (C.getArgs().hasArg(options::OPT_c) ||
2631 C.getArgs().hasArg(options::OPT_S)) {
2632 if (Output.isFilename()) {
Nick Lewycky3dc05412011-05-05 00:08:20 +00002633 CmdArgs.push_back("-coverage-file");
Eric Christopher025b3d42013-02-22 00:24:40 +00002634 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky0f815f12013-03-07 08:28:53 +00002635 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolaa2148242013-08-10 01:40:10 +00002636 SmallString<128> Pwd;
2637 if (!llvm::sys::fs::current_path(Pwd)) {
2638 llvm::sys::path::append(Pwd, CoverageFilename.str());
2639 CoverageFilename.swap(Pwd);
Nick Lewycky0f815f12013-03-07 08:28:53 +00002640 }
2641 }
Eric Christopher025b3d42013-02-22 00:24:40 +00002642 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002643 }
2644 }
2645
Daniel Dunbara268fc02011-10-11 18:20:10 +00002646 // Pass options for controlling the default header search paths.
2647 if (Args.hasArg(options::OPT_nostdinc)) {
2648 CmdArgs.push_back("-nostdsysteminc");
2649 CmdArgs.push_back("-nobuiltininc");
2650 } else {
Daniel Dunbar92d6d402011-10-11 18:20:16 +00002651 if (Args.hasArg(options::OPT_nostdlibinc))
2652 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbara268fc02011-10-11 18:20:10 +00002653 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2654 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2655 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002656
Daniel Dunbar5f122322009-12-15 01:02:52 +00002657 // Pass the path to compiler resource files.
Daniel Dunbar5f122322009-12-15 01:02:52 +00002658 CmdArgs.push_back("-resource-dir");
Daniel Dunbar225c4172010-01-20 02:35:16 +00002659 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar2ac9fc22009-04-07 21:42:00 +00002660
Argyrios Kyrtzidis389db162010-11-03 22:45:23 +00002661 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2662
Ted Kremenek30660a82012-03-06 20:06:33 +00002663 bool ARCMTEnabled = false;
Argyrios Kyrtzidisdce3ce32013-09-17 19:14:29 +00002664 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002665 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002666 options::OPT_ccc_arcmt_modify,
2667 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002668 ARCMTEnabled = true;
John McCall8f0e8d22011-06-15 23:25:17 +00002669 switch (A->getOption().getID()) {
2670 default:
2671 llvm_unreachable("missed a case");
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002672 case options::OPT_ccc_arcmt_check:
John McCall8f0e8d22011-06-15 23:25:17 +00002673 CmdArgs.push_back("-arcmt-check");
2674 break;
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002675 case options::OPT_ccc_arcmt_modify:
John McCall8f0e8d22011-06-15 23:25:17 +00002676 CmdArgs.push_back("-arcmt-modify");
2677 break;
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002678 case options::OPT_ccc_arcmt_migrate:
2679 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenek30660a82012-03-06 20:06:33 +00002680 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002681 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidis7ee20492011-07-19 17:20:03 +00002682
2683 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2684 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002685 break;
John McCall8f0e8d22011-06-15 23:25:17 +00002686 }
2687 }
Argyrios Kyrtzidisf75ece42013-06-24 19:01:18 +00002688 } else {
2689 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2690 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2691 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCall8f0e8d22011-06-15 23:25:17 +00002692 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002693
Ted Kremenek30660a82012-03-06 20:06:33 +00002694 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2695 if (ARCMTEnabled) {
2696 D.Diag(diag::err_drv_argument_not_allowed_with)
2697 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2698 }
2699 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002700 CmdArgs.push_back(A->getValue());
Ted Kremenek30660a82012-03-06 20:06:33 +00002701
2702 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand4129992013-07-09 16:59:14 +00002703 options::OPT_objcmt_migrate_subscripting,
2704 options::OPT_objcmt_migrate_property)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002705 // None specified, means enable them all.
2706 CmdArgs.push_back("-objcmt-migrate-literals");
2707 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand4129992013-07-09 16:59:14 +00002708 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenek30660a82012-03-06 20:06:33 +00002709 } else {
2710 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2711 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand4129992013-07-09 16:59:14 +00002712 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenek30660a82012-03-06 20:06:33 +00002713 }
2714 }
2715
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002716 // Add preprocessing options like -I, -D, etc. if we are using the
2717 // preprocessor.
2718 //
2719 // FIXME: Support -fpreprocessed
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002720 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier9d718632013-01-24 19:14:47 +00002721 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002722
Rafael Espindola19d9d2e2011-07-21 23:40:37 +00002723 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2724 // that "The compiler can only warn and ignore the option if not recognized".
2725 // When building with ccache, it will pass -D options to clang even on
2726 // preprocessed inputs and configure concludes that -fPIC is not supported.
2727 Args.ClaimAllArgs(options::OPT_D);
2728
Rafael Espindola55ee1eb2013-08-27 16:58:15 +00002729 // Manually translate -O4 to -O3; let clang reject others.
2730 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2731 if (A->getOption().matches(options::OPT_O4)) {
2732 CmdArgs.push_back("-O3");
2733 D.Diag(diag::warn_O4_is_O3);
2734 } else {
2735 A->render(Args, CmdArgs);
2736 }
2737 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002738
Chad Rosierb2c08872012-12-12 20:06:31 +00002739 // Don't warn about unused -flto. This can happen when we're preprocessing or
2740 // precompiling.
2741 Args.ClaimAllArgs(options::OPT_flto);
2742
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002743 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremeneke8cf7d12012-07-07 05:53:30 +00002744 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2745 CmdArgs.push_back("-pedantic");
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002746 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002747 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard573d262009-04-07 22:13:21 +00002748
2749 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgadbb4552013-07-31 16:57:56 +00002750 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbard573d262009-04-07 22:13:21 +00002751 //
2752 // If a std is supplied, only add -trigraphs if it follows the
2753 // option.
2754 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2755 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes528365d2009-10-16 14:28:06 +00002756 if (types::isCXX(InputType))
Daniel Dunbar294691e2009-11-04 06:24:38 +00002757 CmdArgs.push_back("-std=c++98");
Nuno Lopes528365d2009-10-16 14:28:06 +00002758 else
Daniel Dunbar294691e2009-11-04 06:24:38 +00002759 CmdArgs.push_back("-std=c89");
Daniel Dunbard573d262009-04-07 22:13:21 +00002760 else
2761 Std->render(Args, CmdArgs);
2762
Daniel Dunbar0e100312010-06-14 21:23:08 +00002763 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2764 options::OPT_trigraphs))
2765 if (A != Std)
Daniel Dunbard573d262009-04-07 22:13:21 +00002766 A->render(Args, CmdArgs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002767 } else {
2768 // Honor -std-default.
Daniel Dunbar4a5290e2010-01-29 21:03:02 +00002769 //
2770 // FIXME: Clang doesn't correctly handle -std= when the input language
2771 // doesn't match. For the time being just ignore this for C++ inputs;
2772 // eventually we want to do all the standard defaulting here instead of
2773 // splitting it between the driver and clang -cc1.
2774 if (!types::isCXX(InputType))
Nico Weber50f88b92012-08-30 02:08:31 +00002775 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2776 "-std=", /*Joined=*/true);
2777 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2778 CmdArgs.push_back("-std=c++11");
2779
Daniel Dunbard573d262009-04-07 22:13:21 +00002780 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002781 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002782
Richard Smithe9813b32013-09-04 22:50:31 +00002783 // GCC's behavior for -Wwrite-strings is a bit strange:
2784 // * In C, this "warning flag" changes the types of string literals from
2785 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
2786 // for the discarded qualifier.
2787 // * In C++, this is just a normal warning flag.
2788 //
2789 // Implementing this warning correctly in C is hard, so we follow GCC's
2790 // behavior for now. FIXME: Directly diagnose uses of a string literal as
2791 // a non-const char* in C, rather than using this crude hack.
2792 if (!types::isCXX(InputType)) {
2793 // FIXME: This should behave just like a warning flag, and thus should also
2794 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
2795 Arg *WriteStrings =
2796 Args.getLastArg(options::OPT_Wwrite_strings,
2797 options::OPT_Wno_write_strings, options::OPT_w);
2798 if (WriteStrings &&
2799 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
2800 CmdArgs.push_back("-fconst-strings");
Chandler Carruth50465d12011-04-23 06:30:43 +00002801 }
2802
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002803 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruthf8c247d2011-04-23 19:48:40 +00002804 // during C++ compilation, which it is by default. GCC keeps this define even
2805 // in the presence of '-w', match this behavior bug-for-bug.
2806 if (types::isCXX(InputType) &&
2807 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2808 true)) {
2809 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002810 }
2811
Chandler Carruthc304ba32010-05-22 02:21:53 +00002812 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2813 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2814 if (Asm->getOption().matches(options::OPT_fasm))
2815 CmdArgs.push_back("-fgnu-keywords");
2816 else
2817 CmdArgs.push_back("-fno-gnu-keywords");
2818 }
2819
Rafael Espindola61b1efe2011-05-02 17:43:32 +00002820 if (ShouldDisableCFI(Args, getToolChain()))
2821 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolaf24a1512011-04-30 18:35:43 +00002822
Nick Lewyckyea523d72011-10-17 23:05:52 +00002823 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2824 CmdArgs.push_back("-fno-dwarf-directory-asm");
2825
Daniel Dunbarf4910132013-04-16 18:21:19 +00002826 if (ShouldDisableAutolink(Args, getToolChain()))
2827 CmdArgs.push_back("-fno-autolink");
2828
Chandler Carruthd566df62012-12-17 21:40:04 +00002829 // Add in -fdebug-compilation-dir if necessary.
2830 addDebugCompDirArg(Args, CmdArgs);
Nick Lewycky7c4fd912011-10-21 02:32:14 +00002831
Richard Smithc18c4232011-11-21 19:36:32 +00002832 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2833 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002834 CmdArgs.push_back("-ftemplate-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002835 CmdArgs.push_back(A->getValue());
Daniel Dunbar1d460332009-03-18 10:01:51 +00002836 }
2837
Richard Smithc18c4232011-11-21 19:36:32 +00002838 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2839 CmdArgs.push_back("-fconstexpr-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002840 CmdArgs.push_back(A->getValue());
Richard Smithc18c4232011-11-21 19:36:32 +00002841 }
2842
Richard Smithe7565632013-05-08 02:12:03 +00002843 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2844 CmdArgs.push_back("-fconstexpr-steps");
2845 CmdArgs.push_back(A->getValue());
2846 }
2847
Richard Smith9e738cc2013-02-22 01:59:51 +00002848 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2849 CmdArgs.push_back("-fbracket-depth");
2850 CmdArgs.push_back(A->getValue());
2851 }
2852
Argyrios Kyrtzidis1380a142010-11-18 00:20:36 +00002853 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2854 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002855 if (A->getNumValues()) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002856 StringRef bytes = A->getValue();
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002857 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2858 } else
2859 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidis3532fdd2010-11-17 23:11:54 +00002860 }
2861
Nuno Lopesb3198a82012-05-08 22:10:46 +00002862
Michael J. Spencerc6357102012-10-22 22:13:48 +00002863 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar66861e02009-11-20 22:21:36 +00002864 CmdArgs.push_back("-relocatable-pch");
Mike Stump1eb44332009-09-09 15:08:12 +00002865
Daniel Dunbar294691e2009-11-04 06:24:38 +00002866 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2867 CmdArgs.push_back("-fconstant-string-class");
Richard Smith1d489cf2012-11-01 04:30:05 +00002868 CmdArgs.push_back(A->getValue());
Daniel Dunbar294691e2009-11-04 06:24:38 +00002869 }
David Chisnall8a5a9aa2009-08-31 16:41:57 +00002870
Chris Lattner124fca52010-01-09 21:54:33 +00002871 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2872 CmdArgs.push_back("-ftabstop");
Richard Smith1d489cf2012-11-01 04:30:05 +00002873 CmdArgs.push_back(A->getValue());
Chris Lattner124fca52010-01-09 21:54:33 +00002874 }
2875
Chris Lattner0f0c9632010-04-07 20:49:23 +00002876 CmdArgs.push_back("-ferror-limit");
2877 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smith1d489cf2012-11-01 04:30:05 +00002878 CmdArgs.push_back(A->getValue());
Chris Lattner0f0c9632010-04-07 20:49:23 +00002879 else
2880 CmdArgs.push_back("19");
Douglas Gregor575cf372010-04-20 07:18:24 +00002881
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002882 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2883 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002884 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002885 }
2886
2887 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2888 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002889 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002890 }
2891
Richard Smith08d6e032011-12-16 19:06:07 +00002892 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2893 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002894 CmdArgs.push_back(A->getValue());
Richard Smith08d6e032011-12-16 19:06:07 +00002895 }
2896
Daniel Dunbar55efe142009-11-04 06:24:47 +00002897 // Pass -fmessage-length=.
Daniel Dunbara28690e2009-11-30 08:40:54 +00002898 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar55efe142009-11-04 06:24:47 +00002899 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002900 CmdArgs.push_back(A->getValue());
Daniel Dunbar55efe142009-11-04 06:24:47 +00002901 } else {
2902 // If -fmessage-length=N was not specified, determine whether this is a
2903 // terminal and, if so, implicitly define -fmessage-length appropriately.
2904 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner5f9e2722011-07-23 10:55:15 +00002905 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar55efe142009-11-04 06:24:47 +00002906 }
2907
John McCalla880b192013-02-19 01:57:35 +00002908 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2909 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2910 options::OPT_fvisibility_ms_compat)) {
2911 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2912 CmdArgs.push_back("-fvisibility");
2913 CmdArgs.push_back(A->getValue());
2914 } else {
2915 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2916 CmdArgs.push_back("-fvisibility");
2917 CmdArgs.push_back("hidden");
2918 CmdArgs.push_back("-ftype-visibility");
2919 CmdArgs.push_back("default");
2920 }
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002921 }
2922
Douglas Gregor7cf84d62010-06-15 17:05:35 +00002923 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002924
Hans Wennborgde981f32012-06-28 08:01:44 +00002925 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2926
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002927 // -fhosted is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002928 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2929 KernelOrKext)
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002930 CmdArgs.push_back("-ffreestanding");
2931
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002932 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002933 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002934 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patelc69e1cf2010-09-30 19:05:55 +00002935 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel033be8b2011-11-04 20:05:58 +00002936 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christophere88c4512011-10-25 07:13:06 +00002937 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidt9e0b6472013-07-03 15:36:02 +00002938 // AltiVec language extensions aren't relevant for assembling.
2939 if (!isa<PreprocessJobAction>(JA) ||
2940 Output.getType() != types::TY_PP_Asm)
2941 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu246b6aa2012-06-26 18:18:47 +00002942 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2943 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier4574c3d2012-03-13 23:45:51 +00002944
Alexey Samsonov1b8f12d2013-08-19 09:14:21 +00002945 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Alexey Samsonov8bdc92c2013-08-09 07:42:13 +00002946 Sanitize.addArgs(getToolChain(), Args, CmdArgs);
Richard Smithc4dabad2012-11-05 22:04:41 +00002947
Will Dietz2d382d12012-12-30 20:53:28 +00002948 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2949 options::OPT_fno_sanitize_recover,
2950 true))
2951 CmdArgs.push_back("-fno-sanitize-recover");
2952
Chad Rosier78d85b12013-01-29 23:31:22 +00002953 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2954 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2955 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2956 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2957
Eric Christopher98654c92013-02-19 06:16:53 +00002958 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier4574c3d2012-03-13 23:45:51 +00002959 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002960 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00002961 getToolChain().getArch() == llvm::Triple::ppc64 ||
2962 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier4574c3d2012-03-13 23:45:51 +00002963 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00002964 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier4574c3d2012-03-13 23:45:51 +00002965
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00002966 if (getToolChain().SupportsProfiling())
2967 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00002968
2969 // -flax-vector-conversions is default.
2970 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2971 options::OPT_fno_lax_vector_conversions))
2972 CmdArgs.push_back("-fno-lax-vector-conversions");
2973
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002974 if (Args.getLastArg(options::OPT_fapple_kext))
2975 CmdArgs.push_back("-fapple-kext");
2976
David Blaikie940152f2012-06-14 18:55:27 +00002977 if (Args.hasFlag(options::OPT_frewrite_includes,
2978 options::OPT_fno_rewrite_includes, false))
2979 CmdArgs.push_back("-frewrite-includes");
2980
Fariborz Jahanian34e65772009-05-22 20:17:16 +00002981 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner182e0922009-04-21 05:34:31 +00002982 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregor4786c152010-08-19 20:24:43 +00002983 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002984 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2985 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnall7f18e672010-09-17 18:29:54 +00002986
2987 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2988 CmdArgs.push_back("-ftrapv-handler");
Richard Smith1d489cf2012-11-01 04:30:05 +00002989 CmdArgs.push_back(A->getValue());
David Chisnall7f18e672010-09-17 18:29:54 +00002990 }
2991
Bob Wilson71fd6cc2012-02-03 06:27:22 +00002992 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng49af1f32011-04-08 21:37:45 +00002993
Chandler Carruth5adb5a82011-03-27 00:04:55 +00002994 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2995 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2996 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2997 options::OPT_fno_wrapv)) {
2998 if (A->getOption().matches(options::OPT_fwrapv))
2999 CmdArgs.push_back("-fwrapv");
3000 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3001 options::OPT_fno_strict_overflow)) {
3002 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3003 CmdArgs.push_back("-fwrapv");
3004 }
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00003005 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruthb26404a2013-08-08 08:34:35 +00003006 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3007 options::OPT_fno_unroll_loops);
Daniel Dunbar1d460332009-03-18 10:01:51 +00003008
Daniel Dunbar5345c392009-09-03 04:54:28 +00003009 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3010
Mahesha Sf3b52312012-10-27 07:47:56 +00003011
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003012 // -stack-protector=0 is default.
3013 unsigned StackProtectorLevel = 0;
Bill Wendling45483f72009-06-28 07:36:13 +00003014 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3015 options::OPT_fstack_protector_all,
3016 options::OPT_fstack_protector)) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003017 if (A->getOption().matches(options::OPT_fstack_protector))
3018 StackProtectorLevel = 1;
3019 else if (A->getOption().matches(options::OPT_fstack_protector_all))
3020 StackProtectorLevel = 2;
Nico Weber2fef1112011-08-23 07:38:27 +00003021 } else {
3022 StackProtectorLevel =
3023 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3024 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003025 if (StackProtectorLevel) {
3026 CmdArgs.push_back("-stack-protector");
Chris Lattner5f9e2722011-07-23 10:55:15 +00003027 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003028 }
Chad Rosiera7afeb02012-08-21 16:16:06 +00003029
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003030 // --param ssp-buffer-size=
3031 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3032 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003033 StringRef Str((*it)->getValue());
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003034 if (Str.startswith("ssp-buffer-size=")) {
3035 if (StackProtectorLevel) {
Chad Rosiera7afeb02012-08-21 16:16:06 +00003036 CmdArgs.push_back("-stack-protector-buffer-size");
3037 // FIXME: Verify the argument is a valid integer.
3038 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosiera7afeb02012-08-21 16:16:06 +00003039 }
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003040 (*it)->claim();
Chad Rosiera7afeb02012-08-21 16:16:06 +00003041 }
Bill Wendling45483f72009-06-28 07:36:13 +00003042 }
3043
Nick Lewycky4e785c92011-12-06 03:33:03 +00003044 // Translate -mstackrealign
3045 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3046 false)) {
3047 CmdArgs.push_back("-backend-option");
3048 CmdArgs.push_back("-force-align-stack");
3049 }
3050 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3051 false)) {
3052 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3053 }
3054
Joerg Sonnenbergere9d11db2011-12-05 23:05:23 +00003055 if (Args.hasArg(options::OPT_mstack_alignment)) {
3056 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3057 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopher1a584022011-05-02 21:18:22 +00003058 }
Chad Rosier586a0612012-11-29 00:42:06 +00003059 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golin02ab7d32013-08-24 14:44:41 +00003060 if (!KernelOrKext) {
Renato Golinb69f9e02013-08-28 23:56:07 +00003061 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3062 options::OPT_munaligned_access)) {
3063 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3064 CmdArgs.push_back("-backend-option");
3065 CmdArgs.push_back("-arm-strict-align");
3066 } else {
3067 CmdArgs.push_back("-backend-option");
3068 CmdArgs.push_back("-arm-no-strict-align");
3069 }
Renato Golin02ab7d32013-08-24 14:44:41 +00003070 }
Chad Rosier7e293272012-11-09 17:29:19 +00003071 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00003072
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003073 // Forward -f options with positive and negative forms; we translate
3074 // these by hand.
3075
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003076 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar2843c192011-02-04 17:24:47 +00003077 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003078 CmdArgs.push_back("-fapple-kext");
3079 if (!Args.hasArg(options::OPT_fbuiltin))
3080 CmdArgs.push_back("-fno-builtin");
Chad Rosier3d265502012-03-26 21:29:17 +00003081 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003082 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003083 // -fbuiltin is default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003084 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar53e84842009-11-19 04:55:23 +00003085 CmdArgs.push_back("-fno-builtin");
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003086
Nuno Lopesfc284482009-12-16 16:59:22 +00003087 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3088 options::OPT_fno_assume_sane_operator_new))
3089 CmdArgs.push_back("-fno-assume-sane-operator-new");
3090
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003091 // -fblocks=0 is default.
3092 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnalle6533ff2011-02-28 17:11:43 +00003093 getToolChain().IsBlocksDefault()) ||
3094 (Args.hasArg(options::OPT_fgnu_runtime) &&
3095 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3096 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003097 CmdArgs.push_back("-fblocks");
John McCall13db5cf2011-09-09 20:41:01 +00003098
3099 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3100 !getToolChain().hasBlocksRuntime())
3101 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall5e530af2009-11-17 19:33:30 +00003102 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003103
Douglas Gregor64554ba2012-01-18 15:19:58 +00003104 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3105 // users must also pass -fcxx-modules. The latter flag will disappear once the
3106 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorf43b7212013-01-16 01:23:41 +00003107 bool HaveModules = false;
Douglas Gregor64554ba2012-01-18 15:19:58 +00003108 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3109 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3110 options::OPT_fno_cxx_modules,
3111 false);
Douglas Gregorf43b7212013-01-16 01:23:41 +00003112 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor64554ba2012-01-18 15:19:58 +00003113 CmdArgs.push_back("-fmodules");
Douglas Gregorf43b7212013-01-16 01:23:41 +00003114 HaveModules = true;
3115 }
3116 }
3117
Daniel Jasper056ec122013-08-05 20:26:17 +00003118 // -fmodule-maps enables module map processing (off by default) for header
3119 // checking. It is implied by -fmodules.
3120 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3121 false)) {
3122 CmdArgs.push_back("-fmodule-maps");
3123 }
3124
Daniel Jasper95411412013-10-21 06:34:34 +00003125 // -fmodules-decluse checks that modules used are declared so (off by
3126 // default).
Daniel Jasperddd2dfc2013-09-24 09:14:14 +00003127 if (Args.hasFlag(options::OPT_fmodules_decluse,
3128 options::OPT_fno_modules_decluse,
3129 false)) {
Daniel Jasper097595a2013-09-29 12:40:54 +00003130 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperddd2dfc2013-09-24 09:14:14 +00003131 }
3132
Daniel Jasper95411412013-10-21 06:34:34 +00003133 // -fmodule-name specifies the module that is currently being built (or
3134 // used for header checking by -fmodule-maps).
3135 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3136 A->claim();
3137 A->render(Args, CmdArgs);
3138 }
3139
3140 // -fmodule-map-file can be used to specify a file containing module
3141 // definitions.
3142 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3143 A->claim();
3144 A->render(Args, CmdArgs);
3145 }
3146
Douglas Gregor953a61f2013-02-07 19:01:24 +00003147 // If a module path was provided, pass it along. Otherwise, use a temporary
3148 // directory.
3149 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3150 A->claim();
3151 if (HaveModules) {
3152 A->render(Args, CmdArgs);
3153 }
3154 } else if (HaveModules) {
3155 SmallString<128> DefaultModuleCache;
3156 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3157 DefaultModuleCache);
Douglas Gregor892b6fb2013-03-21 21:48:48 +00003158 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3159 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor250172a2013-02-07 22:59:12 +00003160 const char Arg[] = "-fmodules-cache-path=";
3161 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3162 Arg, Arg + strlen(Arg));
Douglas Gregor953a61f2013-02-07 19:01:24 +00003163 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3164 }
3165
3166 // Pass through all -fmodules-ignore-macro arguments.
3167 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregord44d2872013-03-25 21:19:16 +00003168 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3169 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor953a61f2013-02-07 19:01:24 +00003170
John McCall32579cf2010-04-09 19:12:06 +00003171 // -faccess-control is default.
John McCall7002f4c2010-04-09 19:03:51 +00003172 if (Args.hasFlag(options::OPT_fno_access_control,
3173 options::OPT_faccess_control,
John McCall32579cf2010-04-09 19:12:06 +00003174 false))
John McCall7002f4c2010-04-09 19:03:51 +00003175 CmdArgs.push_back("-fno-access-control");
John McCall3ddd6e02010-03-17 01:32:13 +00003176
Anders Carlssona4c24752010-11-21 00:09:52 +00003177 // -felide-constructors is the default.
3178 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3179 options::OPT_felide_constructors,
3180 false))
3181 CmdArgs.push_back("-fno-elide-constructors");
3182
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003183 // -frtti is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00003184 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smithc4dabad2012-11-05 22:04:41 +00003185 KernelOrKext) {
Daniel Dunbar53e84842009-11-19 04:55:23 +00003186 CmdArgs.push_back("-fno-rtti");
Mike Stump738f8c22009-07-31 23:15:31 +00003187
Richard Smithc4dabad2012-11-05 22:04:41 +00003188 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonovbb1071c2012-11-06 15:09:03 +00003189 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumi03c60762012-11-06 22:02:00 +00003190 std::string NoRttiArg =
Richard Smithc4dabad2012-11-05 22:04:41 +00003191 Args.getLastArg(options::OPT_mkernel,
3192 options::OPT_fapple_kext,
Richard Smith04fd3822012-11-06 01:12:02 +00003193 options::OPT_fno_rtti)->getAsString(Args);
Richard Smithc4dabad2012-11-05 22:04:41 +00003194 D.Diag(diag::err_drv_argument_not_allowed_with)
3195 << "-fsanitize=vptr" << NoRttiArg;
3196 }
3197 }
3198
Tony Linthicum96319392011-12-12 21:14:55 +00003199 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00003200 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum96319392011-12-12 21:14:55 +00003201 options::OPT_fno_short_enums,
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003202 getToolChain().getArch() ==
Tony Linthicum96319392011-12-12 21:14:55 +00003203 llvm::Triple::hexagon))
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00003204 CmdArgs.push_back("-fshort-enums");
3205
Daniel Dunbar1f95e652009-11-17 06:37:03 +00003206 // -fsigned-char is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00003207 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbar1f95e652009-11-17 06:37:03 +00003208 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar76743522009-11-29 02:39:08 +00003209 CmdArgs.push_back("-fno-signed-char");
Eli Friedman5a779732009-06-05 07:21:14 +00003210
Anders Carlssona508b7d2010-02-06 23:23:06 +00003211 // -fthreadsafe-static is default.
Michael J. Spencer20249a12010-10-21 03:16:25 +00003212 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssona508b7d2010-02-06 23:23:06 +00003213 options::OPT_fno_threadsafe_statics))
3214 CmdArgs.push_back("-fno-threadsafe-statics");
3215
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00003216 // -fuse-cxa-atexit is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00003217 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3218 options::OPT_fno_use_cxa_atexit,
3219 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum96319392011-12-12 21:14:55 +00003220 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003221 getToolChain().getArch() != llvm::Triple::hexagon) ||
Chad Rosierafc4baa2012-03-26 22:04:46 +00003222 KernelOrKext)
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00003223 CmdArgs.push_back("-fno-use-cxa-atexit");
3224
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003225 // -fms-extensions=0 is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00003226 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003227 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3228 CmdArgs.push_back("-fms-extensions");
3229
Francois Pichetae556082011-09-17 04:32:15 +00003230 // -fms-compatibility=0 is default.
Douglas Gregorba97b6e2011-10-24 15:49:38 +00003231 if (Args.hasFlag(options::OPT_fms_compatibility,
3232 options::OPT_fno_ms_compatibility,
3233 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3234 Args.hasFlag(options::OPT_fms_extensions,
3235 options::OPT_fno_ms_extensions,
3236 true))))
Francois Pichetae556082011-09-17 04:32:15 +00003237 CmdArgs.push_back("-fms-compatibility");
3238
Reid Kleckner8c64c182013-09-18 00:33:59 +00003239 // -fmsc-version=1700 is default.
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003240 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3241 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3242 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00003243 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003244 if (msc_ver.empty())
Reid Kleckner8c64c182013-09-18 00:33:59 +00003245 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003246 else
3247 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3248 }
3249
3250
Eric Christophercfc01e42013-02-18 00:38:31 +00003251 // -fno-borland-extensions is default.
Dawn Perchik400b6072010-09-02 23:59:25 +00003252 if (Args.hasFlag(options::OPT_fborland_extensions,
3253 options::OPT_fno_borland_extensions, false))
3254 CmdArgs.push_back("-fborland-extensions");
3255
Francois Pichet8efcc012011-09-01 16:38:08 +00003256 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3257 // needs it.
Francois Pichet8387e2a2011-04-22 22:18:13 +00003258 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3259 options::OPT_fno_delayed_template_parsing,
Francois Pichet8efcc012011-09-01 16:38:08 +00003260 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet805bc1f2011-08-26 00:22:34 +00003261 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet8387e2a2011-04-22 22:18:13 +00003262
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00003263 // -fgnu-keywords default varies depending on language; only pass if
3264 // specified.
3265 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbar40788d92010-04-24 17:56:39 +00003266 options::OPT_fno_gnu_keywords))
3267 A->render(Args, CmdArgs);
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00003268
Rafael Espindola01ba8542011-06-02 17:30:53 +00003269 if (Args.hasFlag(options::OPT_fgnu89_inline,
3270 options::OPT_fno_gnu89_inline,
3271 false))
Rafael Espindolafb3f4aa2011-06-02 16:13:27 +00003272 CmdArgs.push_back("-fgnu89-inline");
3273
Chad Rosierfc055f92012-03-15 22:31:42 +00003274 if (Args.hasArg(options::OPT_fno_inline))
3275 CmdArgs.push_back("-fno-inline");
3276
Chad Rosier634a4b12012-03-06 21:17:19 +00003277 if (Args.hasArg(options::OPT_fno_inline_functions))
3278 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier250008b2012-03-06 18:49:20 +00003279
John McCall260611a2012-06-20 06:18:46 +00003280 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall9f084a32011-07-06 00:26:06 +00003281
John McCall260611a2012-06-20 06:18:46 +00003282 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahaniana6f5cc32013-10-15 17:16:30 +00003283 // legacy is the default. Next runtime is always legacy dispatch and
3284 // -fno-objc-legacy-dispatch gets ignored silently.
3285 if (objcRuntime.isNonFragile() && !objcRuntime.isNeXTFamily()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003286 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3287 options::OPT_fno_objc_legacy_dispatch,
David Chisnall2c7886d2012-07-04 11:52:24 +00003288 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003289 getToolChain().getArch()))) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003290 if (getToolChain().UseObjCMixedDispatch())
3291 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3292 else
3293 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3294 }
3295 }
3296
Fariborz Jahanian3d145f62012-11-15 19:02:45 +00003297 // -fencode-extended-block-signature=1 is default.
3298 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3299 CmdArgs.push_back("-fencode-extended-block-signature");
3300 }
3301
John McCall9f084a32011-07-06 00:26:06 +00003302 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3303 // NOTE: This logic is duplicated in ToolChains.cpp.
3304 bool ARC = isObjCAutoRefCount(Args);
3305 if (ARC) {
John McCall0a7dd782012-08-21 02:47:43 +00003306 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis5840dd92012-02-29 03:43:52 +00003307
John McCall9f084a32011-07-06 00:26:06 +00003308 CmdArgs.push_back("-fobjc-arc");
3309
Chandler Carruth7ffa0322011-11-04 07:34:47 +00003310 // FIXME: It seems like this entire block, and several around it should be
3311 // wrapped in isObjC, but for now we just use it here as this is where it
3312 // was being used previously.
3313 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3314 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3315 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3316 else
3317 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3318 }
3319
John McCall9f084a32011-07-06 00:26:06 +00003320 // Allow the user to enable full exceptions code emission.
3321 // We define off for Objective-CC, on for Objective-C++.
3322 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3323 options::OPT_fno_objc_arc_exceptions,
3324 /*default*/ types::isCXX(InputType)))
3325 CmdArgs.push_back("-fobjc-arc-exceptions");
3326 }
3327
3328 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3329 // rewriter.
John McCall260611a2012-06-20 06:18:46 +00003330 if (rewriteKind != RK_None)
John McCall9f084a32011-07-06 00:26:06 +00003331 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003332
John McCall9f084a32011-07-06 00:26:06 +00003333 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3334 // takes precedence.
3335 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3336 if (!GCArg)
3337 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3338 if (GCArg) {
3339 if (ARC) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00003340 D.Diag(diag::err_drv_objc_gc_arr)
John McCall9f084a32011-07-06 00:26:06 +00003341 << GCArg->getAsString(Args);
3342 } else if (getToolChain().SupportsObjCGC()) {
3343 GCArg->render(Args, CmdArgs);
3344 } else {
3345 // FIXME: We should move this to a hard error.
Chris Lattner5f9e2722011-07-23 10:55:15 +00003346 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall9f084a32011-07-06 00:26:06 +00003347 << GCArg->getAsString(Args);
3348 }
3349 }
3350
John McCalld71315c2011-06-22 00:53:57 +00003351 // Add exception args.
3352 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall260611a2012-06-20 06:18:46 +00003353 KernelOrKext, objcRuntime, CmdArgs);
John McCalld71315c2011-06-22 00:53:57 +00003354
3355 if (getToolChain().UseSjLjExceptions())
3356 CmdArgs.push_back("-fsjlj-exceptions");
3357
3358 // C++ "sane" operator new.
Daniel Dunbar984eb862010-02-01 21:07:25 +00003359 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3360 options::OPT_fno_assume_sane_operator_new))
3361 CmdArgs.push_back("-fno-assume-sane-operator-new");
3362
Daniel Dunbarf35f14d2010-04-27 15:34:57 +00003363 // -fconstant-cfstrings is default, and may be subject to argument translation
3364 // on Darwin.
3365 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3366 options::OPT_fno_constant_cfstrings) ||
3367 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3368 options::OPT_mno_constant_cfstrings))
3369 CmdArgs.push_back("-fno-constant-cfstrings");
3370
John Thompsona6fda122009-11-05 20:14:16 +00003371 // -fshort-wchar default varies depending on platform; only
3372 // pass if specified.
Daniel Dunbar1744a352010-04-27 15:35:03 +00003373 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3374 A->render(Args, CmdArgs);
John Thompsona6fda122009-11-05 20:14:16 +00003375
Hans Wennborgb087a5d2013-07-31 23:39:13 +00003376 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003377 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00003378 options::OPT_fno_pascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00003379 false))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003380 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00003381
Daniel Dunbar88934e82011-10-05 21:04:55 +00003382 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3383 // -fno-pack-struct doesn't apply to -fpack-struct=.
3384 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloy8049c442012-05-02 07:56:14 +00003385 std::string PackStructStr = "-fpack-struct=";
Richard Smith1d489cf2012-11-01 04:30:05 +00003386 PackStructStr += A->getValue();
James Molloy8049c442012-05-02 07:56:14 +00003387 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar88934e82011-10-05 21:04:55 +00003388 } else if (Args.hasFlag(options::OPT_fpack_struct,
3389 options::OPT_fno_pack_struct, false)) {
James Molloy8049c442012-05-02 07:56:14 +00003390 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar88934e82011-10-05 21:04:55 +00003391 }
3392
Robert Lytton5f15f4d2013-08-13 09:43:10 +00003393 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003394 if (!Args.hasArg(options::OPT_fcommon))
3395 CmdArgs.push_back("-fno-common");
Chad Rosierec09b3e2012-03-26 21:35:40 +00003396 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003397 }
Daniel Dunbar88934e82011-10-05 21:04:55 +00003398
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003399 // -fcommon is default, only pass non-default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003400 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003401 CmdArgs.push_back("-fno-common");
3402
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003403 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003404 // -funsigned-bitfields.
Mike Stump1eb44332009-09-09 15:08:12 +00003405 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003406 options::OPT_funsigned_bitfields))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003407 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003408 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3409
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003410 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3411 if (!Args.hasFlag(options::OPT_ffor_scope,
3412 options::OPT_fno_for_scope))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003413 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003414 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3415
Jeffrey Yasskin0ea22fd2010-06-08 04:56:20 +00003416 // -fcaret-diagnostics is default.
3417 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3418 options::OPT_fno_caret_diagnostics, true))
3419 CmdArgs.push_back("-fno-caret-diagnostics");
3420
Daniel Dunbar49138fc2009-04-19 21:09:34 +00003421 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump1eb44332009-09-09 15:08:12 +00003422 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar49138fc2009-04-19 21:09:34 +00003423 options::OPT_fno_diagnostics_fixit_info))
3424 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003425
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003426 // Enable -fdiagnostics-show-option by default.
Mike Stump1eb44332009-09-09 15:08:12 +00003427 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003428 options::OPT_fno_diagnostics_show_option))
3429 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar838be482009-11-04 06:24:57 +00003430
Chris Lattner6fbe8392010-05-04 21:55:25 +00003431 if (const Arg *A =
3432 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3433 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smith1d489cf2012-11-01 04:30:05 +00003434 CmdArgs.push_back(A->getValue());
Chris Lattner6fbe8392010-05-04 21:55:25 +00003435 }
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003436
Douglas Gregorc9471b02011-05-21 17:07:29 +00003437 if (const Arg *A =
3438 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3439 CmdArgs.push_back("-fdiagnostics-format");
Richard Smith1d489cf2012-11-01 04:30:05 +00003440 CmdArgs.push_back(A->getValue());
Douglas Gregorc9471b02011-05-21 17:07:29 +00003441 }
3442
Chandler Carruthabaca7a2011-03-27 01:50:55 +00003443 if (Arg *A = Args.getLastArg(
3444 options::OPT_fdiagnostics_show_note_include_stack,
3445 options::OPT_fno_diagnostics_show_note_include_stack)) {
3446 if (A->getOption().matches(
3447 options::OPT_fdiagnostics_show_note_include_stack))
3448 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3449 else
3450 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3451 }
3452
Daniel Dunbar838be482009-11-04 06:24:57 +00003453 // Color diagnostics are the default, unless the terminal doesn't support
3454 // them.
Nico Weber9753d462013-04-17 21:52:44 +00003455 // Support both clang's -f[no-]color-diagnostics and gcc's
3456 // -f[no-]diagnostics-colors[=never|always|auto].
3457 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3458 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3459 it != ie; ++it) {
3460 const Option &O = (*it)->getOption();
3461 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3462 !O.matches(options::OPT_fdiagnostics_color) &&
3463 !O.matches(options::OPT_fno_color_diagnostics) &&
3464 !O.matches(options::OPT_fno_diagnostics_color) &&
3465 !O.matches(options::OPT_fdiagnostics_color_EQ))
3466 continue;
3467
3468 (*it)->claim();
3469 if (O.matches(options::OPT_fcolor_diagnostics) ||
3470 O.matches(options::OPT_fdiagnostics_color)) {
3471 ShowColors = Colors_On;
3472 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3473 O.matches(options::OPT_fno_diagnostics_color)) {
3474 ShowColors = Colors_Off;
3475 } else {
3476 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3477 StringRef value((*it)->getValue());
3478 if (value == "always")
3479 ShowColors = Colors_On;
3480 else if (value == "never")
3481 ShowColors = Colors_Off;
3482 else if (value == "auto")
3483 ShowColors = Colors_Auto;
3484 else
3485 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3486 << ("-fdiagnostics-color=" + value).str();
3487 }
3488 }
3489 if (ShowColors == Colors_On ||
3490 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar838be482009-11-04 06:24:57 +00003491 CmdArgs.push_back("-fcolor-diagnostics");
3492
Nico Rieck2956ef42013-09-11 00:38:02 +00003493 if (Args.hasArg(options::OPT_fansi_escape_codes))
3494 CmdArgs.push_back("-fansi-escape-codes");
3495
Daniel Dunbar75eb1d62009-06-08 21:13:54 +00003496 if (!Args.hasFlag(options::OPT_fshow_source_location,
3497 options::OPT_fno_show_source_location))
3498 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003499
Douglas Gregorc9471b02011-05-21 17:07:29 +00003500 if (!Args.hasFlag(options::OPT_fshow_column,
3501 options::OPT_fno_show_column,
3502 true))
3503 CmdArgs.push_back("-fno-show-column");
3504
Douglas Gregora0068fc2010-07-09 17:35:33 +00003505 if (!Args.hasFlag(options::OPT_fspell_checking,
3506 options::OPT_fno_spell_checking))
3507 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003508
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00003509
Chad Rosier15490fd2012-12-05 21:08:21 +00003510 // -fno-asm-blocks is default.
3511 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3512 false))
3513 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00003514
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003515 // Enable vectorization per default according to the optimization level
3516 // selected. For optimization levels that want vectorization we use the alias
3517 // option to simplify the hasFlag logic.
3518 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3519 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier31422792013-04-24 18:29:59 +00003520 options::OPT_fvectorize;
Chad Rosier31422792013-04-24 18:29:59 +00003521 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkelcf5691e2013-08-28 05:21:45 +00003522 options::OPT_fno_vectorize, EnableVec))
Chad Rosierc04d0932012-12-11 17:12:28 +00003523 CmdArgs.push_back("-vectorize-loops");
Chad Rosierc04d0932012-12-11 17:12:28 +00003524
Rafael Espindolad8360612013-08-01 23:56:42 +00003525 // -fslp-vectorize is default.
3526 if (Args.hasFlag(options::OPT_fslp_vectorize,
3527 options::OPT_fno_slp_vectorize, true))
Nadav Rotem50ea9632013-04-15 04:57:18 +00003528 CmdArgs.push_back("-vectorize-slp");
Hal Finkel443c9992012-12-11 19:59:32 +00003529
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003530 // -fno-slp-vectorize-aggressive is default.
3531 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00003532 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003533 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003534
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00003535 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3536 A->render(Args, CmdArgs);
3537
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003538 // -fdollars-in-identifiers default varies depending on platform and
3539 // language; only pass if specified.
Mike Stump1eb44332009-09-09 15:08:12 +00003540 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003541 options::OPT_fno_dollars_in_identifiers)) {
3542 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar8663b182009-12-16 20:10:18 +00003543 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003544 else
Daniel Dunbar8663b182009-12-16 20:10:18 +00003545 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003546 }
3547
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003548 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3549 // practical purposes.
Mike Stump1eb44332009-09-09 15:08:12 +00003550 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003551 options::OPT_fno_unit_at_a_time)) {
3552 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003553 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003554 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00003555
Eli Friedman19bda3a2011-11-02 01:53:16 +00003556 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3557 options::OPT_fno_apple_pragma_pack, false))
3558 CmdArgs.push_back("-fapple-pragma-pack");
3559
Eli Benderskyf3ecf892013-07-24 18:20:14 +00003560 // le32-specific flags:
3561 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3562 // by default.
3563 if (getToolChain().getArch() == llvm::Triple::le32) {
3564 CmdArgs.push_back("-fno-math-builtin");
3565 }
3566
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003567 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003568 //
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00003569 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003570#if 0
Bob Wilson905c45f2011-10-14 05:03:44 +00003571 if (getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003572 (getToolChain().getArch() == llvm::Triple::arm ||
3573 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003574 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3575 CmdArgs.push_back("-fno-builtin-strcat");
3576 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3577 CmdArgs.push_back("-fno-builtin-strcpy");
3578 }
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003579#endif
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003580
Daniel Dunbard98750f2011-03-18 21:23:40 +00003581 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump1eb44332009-09-09 15:08:12 +00003582 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbard98750f2011-03-18 21:23:40 +00003583 options::OPT_traditional_cpp)) {
3584 if (isa<PreprocessJobAction>(JA))
3585 CmdArgs.push_back("-traditional-cpp");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003586 else
Chris Lattner5f9e2722011-07-23 10:55:15 +00003587 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbard98750f2011-03-18 21:23:40 +00003588 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00003589
Daniel Dunbar1d460332009-03-18 10:01:51 +00003590 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnerd82df3a2009-04-12 01:56:53 +00003591 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremenek36f6e302011-11-11 00:07:43 +00003592
3593 // Handle serialized diagnostics.
3594 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3595 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smith1d489cf2012-11-01 04:30:05 +00003596 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremenek36f6e302011-11-11 00:07:43 +00003597 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003598
Ted Kremenek127ff2e2012-09-13 06:41:18 +00003599 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3600 CmdArgs.push_back("-fretain-comments-from-system-headers");
3601
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00003602 // Forward -fcomment-block-commands to -cc1.
3603 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenko6fd7d302013-04-10 15:35:17 +00003604 // Forward -fparse-all-comments to -cc1.
3605 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00003606
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003607 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3608 // parser.
Daniel Dunbar1d460332009-03-18 10:01:51 +00003609 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003610 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3611 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003612 (*it)->claim();
Daniel Dunbarfb36d212010-04-17 06:10:00 +00003613
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003614 // We translate this by hand to the -cc1 argument, since nightly test uses
3615 // it and developers have been trained to spell it with -mllvm.
Richard Smith1d489cf2012-11-01 04:30:05 +00003616 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003617 CmdArgs.push_back("-disable-llvm-optzns");
3618 else
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003619 (*it)->render(Args, CmdArgs);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003620 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003621
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00003622 if (Output.getType() == types::TY_Dependencies) {
3623 // Handled with other dependency code.
Daniel Dunbar115a7922009-03-19 07:29:38 +00003624 } else if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003625 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003626 CmdArgs.push_back(Output.getFilename());
3627 } else {
3628 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003629 }
3630
Daniel Dunbar1d460332009-03-18 10:01:51 +00003631 for (InputInfoList::const_iterator
3632 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3633 const InputInfo &II = *it;
3634 CmdArgs.push_back("-x");
Fariborz Jahaniana5ee0892012-09-28 19:05:17 +00003635 if (Args.hasArg(options::OPT_rewrite_objc))
3636 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3637 else
3638 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003639 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00003640 CmdArgs.push_back(II.getFilename());
Daniel Dunbar1d460332009-03-18 10:01:51 +00003641 else
Daniel Dunbar115a7922009-03-19 07:29:38 +00003642 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00003643 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003644
Chris Lattnere6113de2009-11-03 19:50:27 +00003645 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3646
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003647 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003648
3649 // Optionally embed the -cc1 level arguments into the debug info, for build
3650 // analysis.
3651 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar6e900472010-06-04 18:47:06 +00003652 ArgStringList OriginalArgs;
3653 for (ArgList::const_iterator it = Args.begin(),
3654 ie = Args.end(); it != ie; ++it)
3655 (*it)->render(Args, OriginalArgs);
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003656
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003657 SmallString<256> Flags;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003658 Flags += Exec;
Daniel Dunbar6e900472010-06-04 18:47:06 +00003659 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003660 Flags += " ";
Daniel Dunbar6e900472010-06-04 18:47:06 +00003661 Flags += OriginalArgs[i];
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003662 }
3663 CmdArgs.push_back("-dwarf-debug-flags");
3664 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3665 }
3666
Eric Christopher80190392013-02-22 20:12:52 +00003667 // Add the split debug info name to the command lines here so we
3668 // can propagate it to the backend.
3669 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00003670 getToolChain().getTriple().isOSLinux() &&
Eric Christopherff971d72013-02-22 23:50:16 +00003671 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopher80190392013-02-22 20:12:52 +00003672 const char *SplitDwarfOut;
3673 if (SplitDwarf) {
3674 CmdArgs.push_back("-split-dwarf-file");
3675 SplitDwarfOut = SplitDebugName(Args, Inputs);
3676 CmdArgs.push_back(SplitDwarfOut);
3677 }
3678
3679 // Finally add the compile command to the compilation.
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00003680 if (Args.hasArg(options::OPT__SLASH_fallback)) {
3681 tools::visualstudio::Compile CL(getToolChain());
3682 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3683 LinkingOutput);
3684 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3685 } else {
3686 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3687 }
3688
Daniel Dunbara880db02009-03-23 19:03:36 +00003689
Eric Christopherff971d72013-02-22 23:50:16 +00003690 // Handle the debug info splitting at object creation time if we're
3691 // creating an object.
Eric Christopher59320e72013-02-21 22:35:01 +00003692 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherff971d72013-02-22 23:50:16 +00003693 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopher80190392013-02-22 20:12:52 +00003694 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher59320e72013-02-21 22:35:01 +00003695
Roman Divackybe4c8702011-02-10 16:52:03 +00003696 if (Arg *A = Args.getLastArg(options::OPT_pg))
3697 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003698 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divackybe4c8702011-02-10 16:52:03 +00003699 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer20249a12010-10-21 03:16:25 +00003700
Daniel Dunbar68fb4692009-04-03 20:51:31 +00003701 // Claim some arguments which clang supports automatically.
3702
Daniel Dunbarf4046862010-04-15 06:18:42 +00003703 // -fpch-preprocess is used with gcc to add a special marker in the output to
3704 // include the PCH file. Clang's PTH solution is completely transparent, so we
3705 // do not need to deal with it at all.
Daniel Dunbar68fb4692009-04-03 20:51:31 +00003706 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003707
Daniel Dunbara880db02009-03-23 19:03:36 +00003708 // Claim some arguments which clang doesn't support, but we don't
3709 // care to warn the user about.
Daniel Dunbarcdd96862009-11-25 11:53:23 +00003710 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3711 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola035ff0c2011-02-28 23:29:45 +00003712
Rafael Espindola6155fbe2013-09-04 19:37:35 +00003713 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003714 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003715}
3716
John McCall260611a2012-06-20 06:18:46 +00003717/// Add options related to the Objective-C runtime/ABI.
3718///
3719/// Returns true if the runtime is non-fragile.
3720ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3721 ArgStringList &cmdArgs,
3722 RewriteKind rewriteKind) const {
3723 // Look for the controlling runtime option.
3724 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3725 options::OPT_fgnu_runtime,
3726 options::OPT_fobjc_runtime_EQ);
3727
3728 // Just forward -fobjc-runtime= to the frontend. This supercedes
3729 // options about fragility.
3730 if (runtimeArg &&
3731 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3732 ObjCRuntime runtime;
Richard Smith1d489cf2012-11-01 04:30:05 +00003733 StringRef value = runtimeArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003734 if (runtime.tryParse(value)) {
3735 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3736 << value;
3737 }
3738
3739 runtimeArg->render(args, cmdArgs);
3740 return runtime;
3741 }
3742
3743 // Otherwise, we'll need the ABI "version". Version numbers are
3744 // slightly confusing for historical reasons:
3745 // 1 - Traditional "fragile" ABI
3746 // 2 - Non-fragile ABI, version 1
3747 // 3 - Non-fragile ABI, version 2
3748 unsigned objcABIVersion = 1;
3749 // If -fobjc-abi-version= is present, use that to set the version.
3750 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003751 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003752 if (value == "1")
3753 objcABIVersion = 1;
3754 else if (value == "2")
3755 objcABIVersion = 2;
3756 else if (value == "3")
3757 objcABIVersion = 3;
3758 else
3759 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3760 << value;
3761 } else {
3762 // Otherwise, determine if we are using the non-fragile ABI.
3763 bool nonFragileABIIsDefault =
3764 (rewriteKind == RK_NonFragile ||
3765 (rewriteKind == RK_None &&
3766 getToolChain().IsObjCNonFragileABIDefault()));
3767 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3768 options::OPT_fno_objc_nonfragile_abi,
3769 nonFragileABIIsDefault)) {
3770 // Determine the non-fragile ABI version to use.
3771#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3772 unsigned nonFragileABIVersion = 1;
3773#else
3774 unsigned nonFragileABIVersion = 2;
3775#endif
3776
3777 if (Arg *abiArg = args.getLastArg(
3778 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003779 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003780 if (value == "1")
3781 nonFragileABIVersion = 1;
3782 else if (value == "2")
3783 nonFragileABIVersion = 2;
3784 else
3785 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3786 << value;
3787 }
3788
3789 objcABIVersion = 1 + nonFragileABIVersion;
3790 } else {
3791 objcABIVersion = 1;
3792 }
3793 }
3794
3795 // We don't actually care about the ABI version other than whether
3796 // it's non-fragile.
3797 bool isNonFragile = objcABIVersion != 1;
3798
3799 // If we have no runtime argument, ask the toolchain for its default runtime.
3800 // However, the rewriter only really supports the Mac runtime, so assume that.
3801 ObjCRuntime runtime;
3802 if (!runtimeArg) {
3803 switch (rewriteKind) {
3804 case RK_None:
3805 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3806 break;
3807 case RK_Fragile:
3808 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3809 break;
3810 case RK_NonFragile:
3811 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3812 break;
3813 }
3814
3815 // -fnext-runtime
3816 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3817 // On Darwin, make this use the default behavior for the toolchain.
3818 if (getToolChain().getTriple().isOSDarwin()) {
3819 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3820
3821 // Otherwise, build for a generic macosx port.
3822 } else {
3823 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3824 }
3825
3826 // -fgnu-runtime
3827 } else {
3828 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnalla422cd02012-07-04 10:37:03 +00003829 // Legacy behaviour is to target the gnustep runtime if we are i
3830 // non-fragile mode or the GCC runtime in fragile mode.
3831 if (isNonFragile)
David Chisnall891dac72012-10-16 15:11:55 +00003832 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnalla422cd02012-07-04 10:37:03 +00003833 else
3834 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall260611a2012-06-20 06:18:46 +00003835 }
3836
3837 cmdArgs.push_back(args.MakeArgString(
3838 "-fobjc-runtime=" + runtime.getAsString()));
3839 return runtime;
3840}
3841
Hans Wennborgb3574792013-08-08 00:17:41 +00003842void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
3843 unsigned RTOptionID = options::OPT__SLASH_MT;
3844
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00003845 if (Args.hasArg(options::OPT__SLASH_LDd))
3846 // The /LDd option implies /MTd. The dependent lib part can be overridden,
3847 // but defining _DEBUG is sticky.
3848 RTOptionID = options::OPT__SLASH_MTd;
3849
Hans Wennborg76da1782013-09-18 22:26:39 +00003850 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborgb3574792013-08-08 00:17:41 +00003851 RTOptionID = A->getOption().getID();
Hans Wennborg42ade492013-09-11 16:38:41 +00003852
Hans Wennborgb3574792013-08-08 00:17:41 +00003853 switch(RTOptionID) {
3854 case options::OPT__SLASH_MD:
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00003855 if (Args.hasArg(options::OPT__SLASH_LDd))
3856 CmdArgs.push_back("-D_DEBUG");
Hans Wennborgb3574792013-08-08 00:17:41 +00003857 CmdArgs.push_back("-D_MT");
3858 CmdArgs.push_back("-D_DLL");
3859 CmdArgs.push_back("--dependent-lib=msvcrt");
3860 break;
3861 case options::OPT__SLASH_MDd:
3862 CmdArgs.push_back("-D_DEBUG");
3863 CmdArgs.push_back("-D_MT");
3864 CmdArgs.push_back("-D_DLL");
3865 CmdArgs.push_back("--dependent-lib=msvcrtd");
3866 break;
3867 case options::OPT__SLASH_MT:
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00003868 if (Args.hasArg(options::OPT__SLASH_LDd))
3869 CmdArgs.push_back("-D_DEBUG");
Hans Wennborgb3574792013-08-08 00:17:41 +00003870 CmdArgs.push_back("-D_MT");
3871 CmdArgs.push_back("--dependent-lib=libcmt");
3872 break;
3873 case options::OPT__SLASH_MTd:
3874 CmdArgs.push_back("-D_DEBUG");
3875 CmdArgs.push_back("-D_MT");
3876 CmdArgs.push_back("--dependent-lib=libcmtd");
3877 break;
3878 default:
3879 llvm_unreachable("Unexpected option ID.");
3880 }
3881
Reid Klecknera32c5232013-08-08 19:33:10 +00003882 // This provides POSIX compatibility (maps 'open' to '_open'), which most
3883 // users want. The /Za flag to cl.exe turns this off, but it's not
3884 // implemented in clang.
3885 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborgf0f98912013-08-08 19:54:30 +00003886
3887 // FIXME: Make this default for the win32 triple.
3888 CmdArgs.push_back("-cxx-abi");
3889 CmdArgs.push_back("microsoft");
Hans Wennborg708002e2013-08-09 00:32:23 +00003890
3891 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
3892 A->render(Args, CmdArgs);
Hans Wennborgb6475522013-09-10 01:07:07 +00003893
3894 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
3895 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborg89e32742013-09-24 00:08:55 +00003896 if (Args.hasArg(options::OPT__SLASH_fallback))
3897 CmdArgs.push_back("msvc-fallback");
3898 else
3899 CmdArgs.push_back("msvc");
Hans Wennborgb6475522013-09-10 01:07:07 +00003900 }
Hans Wennborgb3574792013-08-08 00:17:41 +00003901}
3902
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003903void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003904 const InputInfo &Output,
3905 const InputInfoList &Inputs,
3906 const ArgList &Args,
3907 const char *LinkingOutput) const {
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003908 ArgStringList CmdArgs;
3909
3910 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3911 const InputInfo &Input = Inputs[0];
3912
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003913 // Don't warn about "clang -w -c foo.s"
3914 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003915 // and "clang -emit-llvm -c foo.s"
3916 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003917
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003918 // Invoke ourselves in -cc1as mode.
3919 //
3920 // FIXME: Implement custom jobs for internal actions.
3921 CmdArgs.push_back("-cc1as");
3922
3923 // Add the "effective" target triple.
3924 CmdArgs.push_back("-triple");
Chad Rosier61ab80a2011-09-20 20:44:06 +00003925 std::string TripleStr =
3926 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003927 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3928
3929 // Set the output mode, we currently only expect to be used as a real
3930 // assembler.
3931 CmdArgs.push_back("-filetype");
3932 CmdArgs.push_back("obj");
3933
Eric Christopher27e2b982012-12-18 00:31:10 +00003934 // Set the main file name, so that debug info works even with
3935 // -save-temps or preprocessed assembly.
3936 CmdArgs.push_back("-main-file-name");
3937 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3938
Rafael Espindolab330e402013-08-20 22:12:08 +00003939 // Add the target cpu
Rafael Espindola146dbbf2013-08-21 16:39:20 +00003940 const llvm::Triple &Triple = getToolChain().getTriple();
3941 std::string CPU = getCPUName(Args, Triple);
Rafael Espindolab330e402013-08-20 22:12:08 +00003942 if (!CPU.empty()) {
3943 CmdArgs.push_back("-target-cpu");
3944 CmdArgs.push_back(Args.MakeArgString(CPU));
3945 }
3946
Rafael Espindola146dbbf2013-08-21 16:39:20 +00003947 // Add the target features
3948 const Driver &D = getToolChain().getDriver();
3949 getTargetFeatures(D, Triple, Args, CmdArgs);
Jim Grosbachfc308292012-02-10 20:37:10 +00003950
Daniel Dunbar7f6f8c82011-03-17 17:37:29 +00003951 // Ignore explicit -force_cpusubtype_ALL option.
3952 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003953
Eric Christopher8f0a4032012-01-10 00:38:01 +00003954 // Determine the original source input.
3955 const Action *SourceAction = &JA;
3956 while (SourceAction->getKind() != Action::InputClass) {
3957 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3958 SourceAction = SourceAction->getInputs()[0];
3959 }
3960
Chandler Carruthd566df62012-12-17 21:40:04 +00003961 // Forward -g and handle debug info related flags, assuming we are dealing
3962 // with an actual assembly file.
Eric Christopher8f0a4032012-01-10 00:38:01 +00003963 if (SourceAction->getType() == types::TY_Asm ||
3964 SourceAction->getType() == types::TY_PP_Asm) {
3965 Args.ClaimAllArgs(options::OPT_g_Group);
3966 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3967 if (!A->getOption().matches(options::OPT_g0))
3968 CmdArgs.push_back("-g");
Chandler Carruthd566df62012-12-17 21:40:04 +00003969
3970 // Add the -fdebug-compilation-dir flag if needed.
3971 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderby02341792013-01-17 21:38:06 +00003972
3973 // Set the AT_producer to the clang version when using the integrated
3974 // assembler on assembly source files.
3975 CmdArgs.push_back("-dwarf-debug-producer");
3976 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopher8f0a4032012-01-10 00:38:01 +00003977 }
Kevin Enderby567003e2011-12-22 19:31:58 +00003978
3979 // Optionally embed the -cc1as level arguments into the debug info, for build
3980 // analysis.
3981 if (getToolChain().UseDwarfDebugFlags()) {
3982 ArgStringList OriginalArgs;
3983 for (ArgList::const_iterator it = Args.begin(),
3984 ie = Args.end(); it != ie; ++it)
3985 (*it)->render(Args, OriginalArgs);
3986
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003987 SmallString<256> Flags;
Kevin Enderby567003e2011-12-22 19:31:58 +00003988 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3989 Flags += Exec;
3990 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3991 Flags += " ";
3992 Flags += OriginalArgs[i];
3993 }
3994 CmdArgs.push_back("-dwarf-debug-flags");
3995 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3996 }
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003997
3998 // FIXME: Add -static support, once we have it.
3999
David Blaikie73168db2013-07-25 21:19:01 +00004000 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4001 getToolChain().getDriver());
4002
Daniel Dunbar3df23252011-04-29 17:53:18 +00004003 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00004004
4005 assert(Output.isFilename() && "Unexpected lipo output.");
4006 CmdArgs.push_back("-o");
4007 CmdArgs.push_back(Output.getFilename());
4008
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004009 assert(Input.isFilename() && "Invalid input.");
4010 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00004011
Daniel Dunbara001c1c2010-07-18 21:16:15 +00004012 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004013 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher708d72a2013-04-10 21:30:40 +00004014
4015 // Handle the debug info splitting at object creation time if we're
4016 // creating an object.
4017 // TODO: Currently only works on linux with newer objcopy.
4018 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00004019 getToolChain().getTriple().isOSLinux())
Eric Christopher708d72a2013-04-10 21:30:40 +00004020 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4021 SplitDebugName(Args, Inputs));
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00004022}
4023
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004024void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004025 const InputInfo &Output,
4026 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00004027 const ArgList &Args,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004028 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004029 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004030 ArgStringList CmdArgs;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004031
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004032 for (ArgList::const_iterator
Daniel Dunbar1d460332009-03-18 10:01:51 +00004033 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004034 Arg *A = *it;
Michael J. Spencer91e06da2012-10-19 22:37:06 +00004035 if (forwardToGCC(A->getOption())) {
Daniel Dunbar2dffe2d2010-08-03 16:14:14 +00004036 // Don't forward any -g arguments to assembly steps.
4037 if (isa<AssembleJobAction>(JA) &&
4038 A->getOption().matches(options::OPT_g_Group))
4039 continue;
4040
NAKAMURA Takumi3c6c8222013-08-19 11:51:51 +00004041 // Don't forward any -W arguments to assembly and link steps.
4042 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4043 A->getOption().matches(options::OPT_W_Group))
4044 continue;
4045
Daniel Dunbar75877192009-03-19 07:55:12 +00004046 // It is unfortunate that we have to claim here, as this means
4047 // we will basically never report anything interesting for
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004048 // platforms using a generic gcc, even if we are just using gcc
4049 // to get to the assembler.
Daniel Dunbar75877192009-03-19 07:55:12 +00004050 A->claim();
Daniel Dunbar1d460332009-03-18 10:01:51 +00004051 A->render(Args, CmdArgs);
Daniel Dunbar75877192009-03-19 07:55:12 +00004052 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004053 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004054
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004055 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004056
4057 // If using a driver driver, force the arch.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004058 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson905c45f2011-10-14 05:03:44 +00004059 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004060 CmdArgs.push_back("-arch");
Daniel Dunbarbf54a062009-04-01 20:33:11 +00004061
4062 // FIXME: Remove these special cases.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004063 if (Arch == llvm::Triple::ppc)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004064 CmdArgs.push_back("ppc");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004065 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004066 CmdArgs.push_back("ppc64");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00004067 else if (Arch == llvm::Triple::ppc64le)
4068 CmdArgs.push_back("ppc64le");
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004069 else
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004070 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004071 }
4072
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004073 // Try to force gcc to match the tool chain we want, if we recognize
4074 // the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004075 //
4076 // FIXME: The triple class should directly provide the information we want
4077 // here.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004078 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004079 CmdArgs.push_back("-m32");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00004080 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4081 Arch == llvm::Triple::ppc64le)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004082 CmdArgs.push_back("-m64");
4083
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004084 if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004085 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00004086 CmdArgs.push_back(Output.getFilename());
4087 } else {
4088 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004089 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar115a7922009-03-19 07:29:38 +00004090 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004091
Tony Linthicum96319392011-12-12 21:14:55 +00004092 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4093 options::OPT_Xassembler);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004094
4095 // Only pass -x if gcc will understand it; otherwise hope gcc
4096 // understands the suffix correctly. The main use case this would go
4097 // wrong in is for linker inputs if they happened to have an odd
4098 // suffix; really the only way to get this to happen is a command
4099 // like '-x foobar a.c' which will treat a.c like a linker input.
4100 //
4101 // FIXME: For the linker case specifically, can we safely convert
4102 // inputs into '-Wl,' options?
4103 for (InputInfoList::const_iterator
4104 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4105 const InputInfo &II = *it;
Daniel Dunbara8304f62009-05-02 20:14:53 +00004106
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004107 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00004108 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4109 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004110 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004111 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004112 else if (II.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004113 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004114 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00004115 else if (II.getType() == types::TY_ModuleFile)
4116 D.Diag(diag::err_drv_no_module_support)
4117 << getToolChain().getTripleString();
Daniel Dunbara8304f62009-05-02 20:14:53 +00004118
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004119 if (types::canTypeBeUserSpecified(II.getType())) {
4120 CmdArgs.push_back("-x");
4121 CmdArgs.push_back(types::getTypeName(II.getType()));
4122 }
4123
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004124 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00004125 CmdArgs.push_back(II.getFilename());
Daniel Dunbar48f99942010-09-25 18:10:05 +00004126 else {
4127 const Arg &A = II.getInputArg();
4128
4129 // Reverse translate some rewritten options.
4130 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4131 CmdArgs.push_back("-lstdc++");
4132 continue;
4133 }
4134
Daniel Dunbar115a7922009-03-19 07:29:38 +00004135 // Don't render as input, we need gcc to do the translations.
Daniel Dunbar48f99942010-09-25 18:10:05 +00004136 A.render(Args, CmdArgs);
4137 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004138 }
4139
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00004140 const std::string customGCCName = D.getCCCGenericGCCName();
4141 const char *GCCName;
4142 if (!customGCCName.empty())
4143 GCCName = customGCCName.c_str();
Hans Wennborg76b86c22013-07-18 20:29:38 +00004144 else if (D.CCCIsCXX()) {
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00004145 GCCName = "g++";
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00004146 } else
4147 GCCName = "gcc";
4148
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004149 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004150 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004151 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004152}
4153
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004154void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4155 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004156 CmdArgs.push_back("-E");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004157}
4158
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004159void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
4160 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004161 // The type is good enough.
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004162}
4163
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004164void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4165 ArgStringList &CmdArgs) const {
Daniel Dunbar64952502010-02-11 03:16:21 +00004166 const Driver &D = getToolChain().getDriver();
4167
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004168 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00004169 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4170 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004171 CmdArgs.push_back("-c");
Daniel Dunbar64952502010-02-11 03:16:21 +00004172 else {
4173 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004174 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00004175 << getTypeName(JA.getType());
Michael J. Spencer20249a12010-10-21 03:16:25 +00004176
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004177 CmdArgs.push_back("-S");
Daniel Dunbar64952502010-02-11 03:16:21 +00004178 }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004179}
4180
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004181void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
4182 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004183 CmdArgs.push_back("-c");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004184}
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004185
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004186void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4187 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004188 // The types are (hopefully) good enough.
4189}
4190
Tony Linthicum96319392011-12-12 21:14:55 +00004191// Hexagon tools start.
4192void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4193 ArgStringList &CmdArgs) const {
4194
4195}
4196void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4197 const InputInfo &Output,
4198 const InputInfoList &Inputs,
4199 const ArgList &Args,
4200 const char *LinkingOutput) const {
4201
4202 const Driver &D = getToolChain().getDriver();
4203 ArgStringList CmdArgs;
4204
4205 std::string MarchString = "-march=";
Matthew Curtis67814152012-12-06 14:16:43 +00004206 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum96319392011-12-12 21:14:55 +00004207 CmdArgs.push_back(Args.MakeArgString(MarchString));
4208
4209 RenderExtraToolArgs(JA, CmdArgs);
4210
4211 if (Output.isFilename()) {
4212 CmdArgs.push_back("-o");
4213 CmdArgs.push_back(Output.getFilename());
4214 } else {
4215 assert(Output.isNothing() && "Unexpected output");
4216 CmdArgs.push_back("-fsyntax-only");
4217 }
4218
Matthew Curtis33c95f12012-12-06 17:49:03 +00004219 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4220 if (!SmallDataThreshold.empty())
4221 CmdArgs.push_back(
4222 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00004223
Matthew Curtis3d8d4222012-12-07 17:23:04 +00004224 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4225 options::OPT_Xassembler);
4226
Tony Linthicum96319392011-12-12 21:14:55 +00004227 // Only pass -x if gcc will understand it; otherwise hope gcc
4228 // understands the suffix correctly. The main use case this would go
4229 // wrong in is for linker inputs if they happened to have an odd
4230 // suffix; really the only way to get this to happen is a command
4231 // like '-x foobar a.c' which will treat a.c like a linker input.
4232 //
4233 // FIXME: For the linker case specifically, can we safely convert
4234 // inputs into '-Wl,' options?
4235 for (InputInfoList::const_iterator
4236 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4237 const InputInfo &II = *it;
4238
4239 // Don't try to pass LLVM or AST inputs to a generic gcc.
4240 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4241 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4242 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4243 << getToolChain().getTripleString();
4244 else if (II.getType() == types::TY_AST)
4245 D.Diag(clang::diag::err_drv_no_ast_support)
4246 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00004247 else if (II.getType() == types::TY_ModuleFile)
4248 D.Diag(diag::err_drv_no_module_support)
4249 << getToolChain().getTripleString();
Tony Linthicum96319392011-12-12 21:14:55 +00004250
4251 if (II.isFilename())
4252 CmdArgs.push_back(II.getFilename());
4253 else
4254 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4255 II.getInputArg().render(Args, CmdArgs);
4256 }
4257
4258 const char *GCCName = "hexagon-as";
4259 const char *Exec =
4260 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4261 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4262
4263}
4264void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4265 ArgStringList &CmdArgs) const {
4266 // The types are (hopefully) good enough.
4267}
4268
4269void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4270 const InputInfo &Output,
4271 const InputInfoList &Inputs,
4272 const ArgList &Args,
4273 const char *LinkingOutput) const {
4274
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004275 const toolchains::Hexagon_TC& ToolChain =
4276 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4277 const Driver &D = ToolChain.getDriver();
4278
Tony Linthicum96319392011-12-12 21:14:55 +00004279 ArgStringList CmdArgs;
4280
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004281 //----------------------------------------------------------------------------
4282 //
4283 //----------------------------------------------------------------------------
4284 bool hasStaticArg = Args.hasArg(options::OPT_static);
4285 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtis33c95f12012-12-06 17:49:03 +00004286 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004287 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4288 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4289 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4290 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum96319392011-12-12 21:14:55 +00004291
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004292 //----------------------------------------------------------------------------
4293 // Silence warnings for various options
4294 //----------------------------------------------------------------------------
Tony Linthicum96319392011-12-12 21:14:55 +00004295
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004296 Args.ClaimAllArgs(options::OPT_g_Group);
4297 Args.ClaimAllArgs(options::OPT_emit_llvm);
4298 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4299 // handled somewhere else.
4300 Args.ClaimAllArgs(options::OPT_static_libgcc);
4301
4302 //----------------------------------------------------------------------------
4303 //
4304 //----------------------------------------------------------------------------
4305 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4306 e = ToolChain.ExtraOpts.end();
4307 i != e; ++i)
4308 CmdArgs.push_back(i->c_str());
Tony Linthicum96319392011-12-12 21:14:55 +00004309
Matthew Curtis67814152012-12-06 14:16:43 +00004310 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4311 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop43115d42012-01-13 20:37:10 +00004312
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004313 if (buildingLib) {
4314 CmdArgs.push_back("-shared");
4315 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4316 // hexagon-gcc does
Tony Linthicum96319392011-12-12 21:14:55 +00004317 }
4318
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004319 if (hasStaticArg)
4320 CmdArgs.push_back("-static");
Tony Linthicum96319392011-12-12 21:14:55 +00004321
Matthew Curtis33c95f12012-12-06 17:49:03 +00004322 if (buildPIE && !buildingLib)
4323 CmdArgs.push_back("-pie");
4324
4325 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4326 if (!SmallDataThreshold.empty()) {
4327 CmdArgs.push_back(
4328 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4329 }
4330
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004331 //----------------------------------------------------------------------------
4332 //
4333 //----------------------------------------------------------------------------
4334 CmdArgs.push_back("-o");
4335 CmdArgs.push_back(Output.getFilename());
Tony Linthicum96319392011-12-12 21:14:55 +00004336
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004337 const std::string MarchSuffix = "/" + MarchString;
4338 const std::string G0Suffix = "/G0";
4339 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4340 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4341 + "/";
4342 const std::string StartFilesDir = RootDir
4343 + "hexagon/lib"
4344 + (buildingLib
4345 ? MarchG0Suffix : MarchSuffix);
4346
4347 //----------------------------------------------------------------------------
4348 // moslib
4349 //----------------------------------------------------------------------------
4350 std::vector<std::string> oslibs;
4351 bool hasStandalone= false;
4352
4353 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4354 ie = Args.filtered_end(); it != ie; ++it) {
4355 (*it)->claim();
4356 oslibs.push_back((*it)->getValue());
4357 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum96319392011-12-12 21:14:55 +00004358 }
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004359 if (oslibs.empty()) {
4360 oslibs.push_back("standalone");
4361 hasStandalone = true;
4362 }
Tony Linthicum96319392011-12-12 21:14:55 +00004363
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004364 //----------------------------------------------------------------------------
4365 // Start Files
4366 //----------------------------------------------------------------------------
4367 if (incStdLib && incStartFiles) {
4368
4369 if (!buildingLib) {
4370 if (hasStandalone) {
4371 CmdArgs.push_back(
4372 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4373 }
4374 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4375 }
4376 std::string initObj = useShared ? "/initS.o" : "/init.o";
4377 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4378 }
4379
4380 //----------------------------------------------------------------------------
4381 // Library Search Paths
4382 //----------------------------------------------------------------------------
4383 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4384 for (ToolChain::path_list::const_iterator
4385 i = LibPaths.begin(),
4386 e = LibPaths.end();
4387 i != e;
4388 ++i)
4389 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4390
4391 //----------------------------------------------------------------------------
4392 //
4393 //----------------------------------------------------------------------------
4394 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4395 Args.AddAllArgs(CmdArgs, options::OPT_e);
4396 Args.AddAllArgs(CmdArgs, options::OPT_s);
4397 Args.AddAllArgs(CmdArgs, options::OPT_t);
4398 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4399
4400 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4401
4402 //----------------------------------------------------------------------------
4403 // Libraries
4404 //----------------------------------------------------------------------------
4405 if (incStdLib && incDefLibs) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00004406 if (D.CCCIsCXX()) {
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004407 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4408 CmdArgs.push_back("-lm");
4409 }
4410
4411 CmdArgs.push_back("--start-group");
4412
4413 if (!buildingLib) {
4414 for(std::vector<std::string>::iterator i = oslibs.begin(),
4415 e = oslibs.end(); i != e; ++i)
4416 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4417 CmdArgs.push_back("-lc");
4418 }
4419 CmdArgs.push_back("-lgcc");
4420
4421 CmdArgs.push_back("--end-group");
4422 }
4423
4424 //----------------------------------------------------------------------------
4425 // End files
4426 //----------------------------------------------------------------------------
4427 if (incStdLib && incStartFiles) {
4428 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4429 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4430 }
4431
4432 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00004433 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum96319392011-12-12 21:14:55 +00004434}
4435// Hexagon tools end.
4436
Rafael Espindolacfed8282012-10-31 18:51:07 +00004437llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4438 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4439 // archs which Darwin doesn't use.
4440
4441 // The matching this routine does is fairly pointless, since it is neither the
4442 // complete architecture list, nor a reasonable subset. The problem is that
4443 // historically the driver driver accepts this and also ties its -march=
4444 // handling to the architecture name, so we need to be careful before removing
4445 // support for it.
4446
4447 // This code must be kept in sync with Clang's Darwin specific argument
4448 // translation.
4449
4450 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4451 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4452 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4453 .Case("ppc64", llvm::Triple::ppc64)
4454 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4455 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4456 llvm::Triple::x86)
4457 .Case("x86_64", llvm::Triple::x86_64)
4458 // This is derived from the driver driver.
Bob Wilson2503ebd2013-03-04 22:37:49 +00004459 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4460 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4461 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindolacfed8282012-10-31 18:51:07 +00004462 .Case("r600", llvm::Triple::r600)
4463 .Case("nvptx", llvm::Triple::nvptx)
4464 .Case("nvptx64", llvm::Triple::nvptx64)
4465 .Case("amdil", llvm::Triple::amdil)
4466 .Case("spir", llvm::Triple::spir)
4467 .Default(llvm::Triple::UnknownArch);
4468}
Tony Linthicum96319392011-12-12 21:14:55 +00004469
Bob Wilson66b8a662012-11-23 06:14:39 +00004470const char *Clang::getBaseInputName(const ArgList &Args,
4471 const InputInfoList &Inputs) {
Michael J. Spencer472ccff2010-12-18 00:19:12 +00004472 return Args.MakeArgString(
4473 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004474}
4475
Bob Wilson66b8a662012-11-23 06:14:39 +00004476const char *Clang::getBaseInputStem(const ArgList &Args,
4477 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004478 const char *Str = getBaseInputName(Args, Inputs);
4479
Chris Lattner657ca662011-01-16 08:14:11 +00004480 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar88137642009-09-09 22:32:48 +00004481 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004482
4483 return Str;
4484}
4485
Bob Wilson66b8a662012-11-23 06:14:39 +00004486const char *Clang::getDependencyFileName(const ArgList &Args,
4487 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004488 // FIXME: Think about this more.
4489 std::string Res;
4490
4491 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00004492 std::string Str(OutputOpt->getValue());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004493 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier30601782011-08-17 23:08:45 +00004494 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +00004495 Res = getBaseInputStem(Args, Inputs);
Chad Rosier30601782011-08-17 23:08:45 +00004496 }
Daniel Dunbar88137642009-09-09 22:32:48 +00004497 return Args.MakeArgString(Res + ".d");
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004498}
4499
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004500void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004501 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004502 const InputInfoList &Inputs,
4503 const ArgList &Args,
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004504 const char *LinkingOutput) const {
4505 ArgStringList CmdArgs;
4506
4507 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4508 const InputInfo &Input = Inputs[0];
4509
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004510 // Determine the original source input.
4511 const Action *SourceAction = &JA;
4512 while (SourceAction->getKind() != Action::InputClass) {
4513 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4514 SourceAction = SourceAction->getInputs()[0];
4515 }
4516
4517 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher88b7cf02011-08-19 00:30:14 +00004518 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004519 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004520 if (Args.hasArg(options::OPT_gstabs))
4521 CmdArgs.push_back("--gstabs");
4522 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson591ff152011-11-02 05:10:45 +00004523 CmdArgs.push_back("-g");
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004524 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004525
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004526 // Derived from asm spec.
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004527 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004528
Daniel Dunbarf5438e32010-07-22 01:47:22 +00004529 // Use -force_cpusubtype_ALL on x86 by default.
Eli Bendersky8f4269a2013-07-24 22:20:49 +00004530 if (getToolChain().getArch() == llvm::Triple::x86 ||
4531 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004532 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4533 CmdArgs.push_back("-force_cpusubtype_ALL");
4534
Eli Bendersky8f4269a2013-07-24 22:20:49 +00004535 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004536 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher59320e72013-02-21 22:35:01 +00004537 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004538 (!getDarwinToolChain().isTargetIPhoneOS() ||
4539 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4540 Args.hasArg(options::OPT_static)))
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004541 CmdArgs.push_back("-static");
4542
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004543 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4544 options::OPT_Xassembler);
4545
4546 assert(Output.isFilename() && "Unexpected lipo output.");
4547 CmdArgs.push_back("-o");
4548 CmdArgs.push_back(Output.getFilename());
4549
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004550 assert(Input.isFilename() && "Invalid input.");
4551 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004552
4553 // asm_final spec is empty.
4554
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004555 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004556 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004557 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004558}
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004559
David Blaikie99ba9e32011-12-20 02:48:34 +00004560void darwin::DarwinTool::anchor() {}
4561
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +00004562void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4563 ArgStringList &CmdArgs) const {
Chris Lattner5f9e2722011-07-23 10:55:15 +00004564 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbareeff4062010-01-22 02:04:58 +00004565
Daniel Dunbar02633b52009-03-26 16:23:12 +00004566 // Derived from darwin_arch spec.
4567 CmdArgs.push_back("-arch");
Daniel Dunbareeff4062010-01-22 02:04:58 +00004568 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004569
Daniel Dunbareeff4062010-01-22 02:04:58 +00004570 // FIXME: Is this needed anymore?
4571 if (ArchName == "arm")
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004572 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004573}
4574
Bill Wendling6acf8b42012-10-02 18:02:50 +00004575bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4576 // We only need to generate a temp path for LTO if we aren't compiling object
4577 // files. When compiling source files, we run 'dsymutil' after linking. We
4578 // don't run 'dsymutil' when compiling object files.
4579 for (InputInfoList::const_iterator
4580 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4581 if (it->getType() != types::TY_Object)
4582 return true;
4583
4584 return false;
4585}
4586
Daniel Dunbar748de8e2010-09-09 21:51:05 +00004587void darwin::Link::AddLinkArgs(Compilation &C,
4588 const ArgList &Args,
Bill Wendling6acf8b42012-10-02 18:02:50 +00004589 ArgStringList &CmdArgs,
4590 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004591 const Driver &D = getToolChain().getDriver();
Daniel Dunbarce911f52011-04-28 21:23:41 +00004592 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbar02633b52009-03-26 16:23:12 +00004593
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004594 unsigned Version[3] = { 0, 0, 0 };
4595 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4596 bool HadExtra;
Richard Smith1d489cf2012-11-01 04:30:05 +00004597 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004598 Version[1], Version[2], HadExtra) ||
4599 HadExtra)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004600 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004601 << A->getAsString(Args);
4602 }
4603
4604 // Newer linkers support -demangle, pass it if supported and not disabled by
4605 // the user.
Daniel Dunbard2d20882012-01-04 21:45:27 +00004606 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004607 // Don't pass -demangle to ld_classic.
4608 //
4609 // FIXME: This is a temporary workaround, ld should be handling this.
4610 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4611 Args.hasArg(options::OPT_static));
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004612 if (getToolChain().getArch() == llvm::Triple::x86) {
4613 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4614 options::OPT_Wl_COMMA),
4615 ie = Args.filtered_end(); it != ie; ++it) {
4616 const Arg *A = *it;
4617 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smith1d489cf2012-11-01 04:30:05 +00004618 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004619 UsesLdClassic = true;
4620 }
4621 }
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004622 if (!UsesLdClassic)
4623 CmdArgs.push_back("-demangle");
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004624 }
4625
Bob Wilsonbd77c592013-08-02 22:25:34 +00004626 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4627 CmdArgs.push_back("-export_dynamic");
4628
Bill Wendlingc35f9082012-11-16 23:03:00 +00004629 // If we are using LTO, then automatically create a temporary file path for
4630 // the linker to use, so that it's lifetime will extend past a possible
4631 // dsymutil step.
4632 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4633 const char *TmpPath = C.getArgs().MakeArgString(
4634 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4635 C.addTempFile(TmpPath);
4636 CmdArgs.push_back("-object_path_lto");
4637 CmdArgs.push_back(TmpPath);
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004638 }
4639
Daniel Dunbar02633b52009-03-26 16:23:12 +00004640 // Derived from the "link" spec.
4641 Args.AddAllArgs(CmdArgs, options::OPT_static);
4642 if (!Args.hasArg(options::OPT_static))
4643 CmdArgs.push_back("-dynamic");
4644 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4645 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4646 // here. How do we wish to handle such things?
4647 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004648
Daniel Dunbar02633b52009-03-26 16:23:12 +00004649 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara6d38492010-01-22 02:04:52 +00004650 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara6d38492010-01-22 02:04:52 +00004651 // FIXME: Why do this only on this path?
Daniel Dunbar8917dd42010-01-22 03:37:33 +00004652 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004653
4654 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4655 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4656 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4657
4658 Arg *A;
4659 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4660 (A = Args.getLastArg(options::OPT_current__version)) ||
4661 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004662 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004663 << A->getAsString(Args) << "-dynamiclib";
4664
4665 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4666 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4667 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4668 } else {
4669 CmdArgs.push_back("-dylib");
4670
4671 Arg *A;
4672 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4673 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4674 (A = Args.getLastArg(options::OPT_client__name)) ||
4675 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4676 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4677 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004678 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004679 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004680
Daniel Dunbar02633b52009-03-26 16:23:12 +00004681 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4682 "-dylib_compatibility_version");
4683 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4684 "-dylib_current_version");
4685
Daniel Dunbara6d38492010-01-22 02:04:52 +00004686 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004687
4688 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4689 "-dylib_install_name");
4690 }
4691
4692 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4693 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4694 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarce911f52011-04-28 21:23:41 +00004695 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004696 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004697 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4698 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4699 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4700 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4701 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4702 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar99ca47b2011-06-28 20:16:02 +00004703 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004704 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4705 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4706 Args.AddAllArgs(CmdArgs, options::OPT_init);
4707
Daniel Dunbarce911f52011-04-28 21:23:41 +00004708 // Add the deployment target.
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004709 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbarb7f5ef72011-04-30 04:22:58 +00004710
4711 // If we had an explicit -mios-simulator-version-min argument, honor that,
4712 // otherwise use the traditional deployment targets. We can't just check the
4713 // is-sim attribute because existing code follows this path, and the linker
4714 // may not handle the argument.
4715 //
4716 // FIXME: We may be able to remove this, once we can verify no one depends on
4717 // it.
4718 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4719 CmdArgs.push_back("-ios_simulator_version_min");
4720 else if (DarwinTC.isTargetIPhoneOS())
4721 CmdArgs.push_back("-iphoneos_version_min");
4722 else
4723 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004724 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarce911f52011-04-28 21:23:41 +00004725
Daniel Dunbar02633b52009-03-26 16:23:12 +00004726 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4727 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4728 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4729 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4730 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004731
Daniel Dunbar47e879d2010-07-13 23:31:40 +00004732 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4733 options::OPT_fno_pie,
4734 options::OPT_fno_PIE)) {
4735 if (A->getOption().matches(options::OPT_fpie) ||
4736 A->getOption().matches(options::OPT_fPIE))
4737 CmdArgs.push_back("-pie");
4738 else
4739 CmdArgs.push_back("-no_pie");
4740 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004741
4742 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4743 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4744 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4745 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4746 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4747 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4748 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4749 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4750 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4751 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4752 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4753 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4754 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4755 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4756 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4757 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004758
Daniel Dunbarcc957192011-05-02 21:03:47 +00004759 // Give --sysroot= preference, over the Apple specific behavior to also use
4760 // --isysroot as the syslibroot.
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004761 StringRef sysroot = C.getSysRoot();
4762 if (sysroot != "") {
Daniel Dunbarcc957192011-05-02 21:03:47 +00004763 CmdArgs.push_back("-syslibroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004764 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbarcc957192011-05-02 21:03:47 +00004765 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4766 CmdArgs.push_back("-syslibroot");
Richard Smith1d489cf2012-11-01 04:30:05 +00004767 CmdArgs.push_back(A->getValue());
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004768 }
4769
Daniel Dunbar02633b52009-03-26 16:23:12 +00004770 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4771 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4772 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4773 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4774 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004775 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004776 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4777 Args.AddAllArgs(CmdArgs, options::OPT_y);
4778 Args.AddLastArg(CmdArgs, options::OPT_w);
4779 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4780 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4781 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4782 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4783 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4784 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4785 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4786 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4787 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4788 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4789 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4790 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4791}
4792
4793void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004794 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004795 const InputInfoList &Inputs,
4796 const ArgList &Args,
Daniel Dunbar02633b52009-03-26 16:23:12 +00004797 const char *LinkingOutput) const {
4798 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbare0be8b12009-09-08 16:39:16 +00004799
Daniel Dunbar02633b52009-03-26 16:23:12 +00004800 // The logic here is derived from gcc's behavior; most of which
4801 // comes from specs (starting with link_command). Consult gcc for
4802 // more information.
Daniel Dunbar02633b52009-03-26 16:23:12 +00004803 ArgStringList CmdArgs;
4804
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00004805 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4806 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4807 options::OPT_ccc_arcmt_migrate)) {
4808 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4809 (*I)->claim();
4810 const char *Exec =
4811 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4812 CmdArgs.push_back(Output.getFilename());
4813 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4814 return;
4815 }
4816
Daniel Dunbar02633b52009-03-26 16:23:12 +00004817 // I'm not sure why this particular decomposition exists in gcc, but
4818 // we follow suite for ease of comparison.
Bill Wendling6acf8b42012-10-02 18:02:50 +00004819 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004820
Daniel Dunbar02633b52009-03-26 16:23:12 +00004821 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4822 Args.AddAllArgs(CmdArgs, options::OPT_s);
4823 Args.AddAllArgs(CmdArgs, options::OPT_t);
4824 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4825 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004826 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004827 Args.AddAllArgs(CmdArgs, options::OPT_r);
4828
Daniel Dunbar270073c2010-10-18 22:08:36 +00004829 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4830 // members of static archive libraries which implement Objective-C classes or
4831 // categories.
4832 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4833 CmdArgs.push_back("-ObjC");
Michael J. Spencer20249a12010-10-21 03:16:25 +00004834
Daniel Dunbar02633b52009-03-26 16:23:12 +00004835 CmdArgs.push_back("-o");
4836 CmdArgs.push_back(Output.getFilename());
4837
Chad Rosier18937312012-05-16 23:45:12 +00004838 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004839 !Args.hasArg(options::OPT_nostartfiles)) {
4840 // Derived from startfile spec.
4841 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004842 // Derived from darwin_dylib1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004843 if (getDarwinToolChain().isTargetIOSSimulator()) {
4844 // The simulator doesn't have a versioned crt1 file.
4845 CmdArgs.push_back("-ldylib1.o");
4846 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004847 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4848 CmdArgs.push_back("-ldylib1.o");
4849 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004850 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004851 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004852 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004853 CmdArgs.push_back("-ldylib1.10.5.o");
4854 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004855 } else {
4856 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004857 if (!Args.hasArg(options::OPT_static)) {
4858 // Derived from darwin_bundle1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004859 if (getDarwinToolChain().isTargetIOSSimulator()) {
4860 // The simulator doesn't have a versioned crt1 file.
4861 CmdArgs.push_back("-lbundle1.o");
4862 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004863 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4864 CmdArgs.push_back("-lbundle1.o");
4865 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004866 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004867 CmdArgs.push_back("-lbundle1.o");
4868 }
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004869 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004870 } else {
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00004871 if (Args.hasArg(options::OPT_pg) &&
4872 getToolChain().SupportsProfiling()) {
Daniel Dunbar02633b52009-03-26 16:23:12 +00004873 if (Args.hasArg(options::OPT_static) ||
4874 Args.hasArg(options::OPT_object) ||
4875 Args.hasArg(options::OPT_preload)) {
4876 CmdArgs.push_back("-lgcrt0.o");
4877 } else {
4878 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004879
Daniel Dunbar02633b52009-03-26 16:23:12 +00004880 // darwin_crt2 spec is empty.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004881 }
Bob Wilson4e6e7912012-07-04 00:18:41 +00004882 // By default on OS X 10.8 and later, we don't link with a crt1.o
4883 // file and the linker knows to use _main as the entry point. But,
4884 // when compiling with -pg, we need to link with the gcrt1.o file,
4885 // so pass the -no_new_main option to tell the linker to use the
4886 // "start" symbol as the entry point.
Bob Wilson1fc6e4f2012-07-03 20:42:10 +00004887 if (getDarwinToolChain().isTargetMacOS() &&
4888 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4889 CmdArgs.push_back("-no_new_main");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004890 } else {
4891 if (Args.hasArg(options::OPT_static) ||
4892 Args.hasArg(options::OPT_object) ||
4893 Args.hasArg(options::OPT_preload)) {
4894 CmdArgs.push_back("-lcrt0.o");
4895 } else {
4896 // Derived from darwin_crt1 spec.
Daniel Dunbar40355802011-03-31 17:12:33 +00004897 if (getDarwinToolChain().isTargetIOSSimulator()) {
4898 // The simulator doesn't have a versioned crt1 file.
4899 CmdArgs.push_back("-lcrt1.o");
4900 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004901 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4902 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004903 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004904 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004905 } else {
4906 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4907 CmdArgs.push_back("-lcrt1.o");
4908 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4909 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004910 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004911 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004912
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004913 // darwin_crt2 spec is empty.
4914 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004915 }
4916 }
4917 }
4918 }
4919
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004920 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4921 Args.hasArg(options::OPT_shared_libgcc) &&
4922 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar88137642009-09-09 22:32:48 +00004923 const char *Str =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004924 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar88137642009-09-09 22:32:48 +00004925 CmdArgs.push_back(Str);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004926 }
4927 }
4928
4929 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004930
Daniel Dunbar02633b52009-03-26 16:23:12 +00004931 if (Args.hasArg(options::OPT_fopenmp))
4932 // This is more complicated in gcc...
4933 CmdArgs.push_back("-lgomp");
4934
Douglas Gregor04e326b2012-05-15 21:00:27 +00004935 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4936
Bob Wilson63d9f3c2012-05-15 18:57:39 +00004937 if (isObjCRuntimeLinked(Args) &&
4938 !Args.hasArg(options::OPT_nostdlib) &&
4939 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004940 // Avoid linking compatibility stubs on i386 mac.
4941 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004942 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004943 // If we don't have ARC or subscripting runtime support, link in the
4944 // runtime stubs. We have to do this *before* adding any of the normal
4945 // linker inputs so that its initializer gets run first.
John McCall260611a2012-06-20 06:18:46 +00004946 ObjCRuntime runtime =
4947 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004948 // We use arclite library for both ARC and subscripting support.
John McCall0a7dd782012-08-21 02:47:43 +00004949 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall260611a2012-06-20 06:18:46 +00004950 !runtime.hasSubscripting())
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004951 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004952 }
Bob Wilson0b1c7152012-04-21 00:21:42 +00004953 CmdArgs.push_back("-framework");
4954 CmdArgs.push_back("Foundation");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004955 // Link libobj.
4956 CmdArgs.push_back("-lobjc");
John McCall9f084a32011-07-06 00:26:06 +00004957 }
John McCallf85e1932011-06-15 23:02:42 +00004958
Daniel Dunbar02633b52009-03-26 16:23:12 +00004959 if (LinkingOutput) {
4960 CmdArgs.push_back("-arch_multiple");
4961 CmdArgs.push_back("-final_output");
4962 CmdArgs.push_back(LinkingOutput);
4963 }
4964
Daniel Dunbar02633b52009-03-26 16:23:12 +00004965 if (Args.hasArg(options::OPT_fnested_functions))
4966 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004967
Daniel Dunbar02633b52009-03-26 16:23:12 +00004968 if (!Args.hasArg(options::OPT_nostdlib) &&
4969 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00004970 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar132e35d2010-09-17 01:20:05 +00004971 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbaredfa02b2009-04-08 06:06:21 +00004972
Daniel Dunbar02633b52009-03-26 16:23:12 +00004973 // link_ssp spec is empty.
4974
Daniel Dunbar6cd41542009-09-18 08:15:03 +00004975 // Let the tool chain choose which runtime library to link.
4976 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004977 }
4978
Chad Rosier18937312012-05-16 23:45:12 +00004979 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004980 !Args.hasArg(options::OPT_nostartfiles)) {
4981 // endfile_spec is empty.
4982 }
4983
4984 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4985 Args.AddAllArgs(CmdArgs, options::OPT_F);
4986
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004987 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004988 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004989 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar02633b52009-03-26 16:23:12 +00004990}
4991
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004992void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004993 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004994 const InputInfoList &Inputs,
4995 const ArgList &Args,
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004996 const char *LinkingOutput) const {
4997 ArgStringList CmdArgs;
4998
4999 CmdArgs.push_back("-create");
5000 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbara428df82009-03-24 00:24:37 +00005001
5002 CmdArgs.push_back("-output");
Daniel Dunbarff7488d2009-03-20 00:52:38 +00005003 CmdArgs.push_back(Output.getFilename());
Daniel Dunbara428df82009-03-24 00:24:37 +00005004
Daniel Dunbarff7488d2009-03-20 00:52:38 +00005005 for (InputInfoList::const_iterator
5006 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5007 const InputInfo &II = *it;
5008 assert(II.isFilename() && "Unexpected lipo input.");
5009 CmdArgs.push_back(II.getFilename());
5010 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005011 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005012 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005013 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarff7488d2009-03-20 00:52:38 +00005014}
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005015
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00005016void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005017 const InputInfo &Output,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00005018 const InputInfoList &Inputs,
5019 const ArgList &Args,
5020 const char *LinkingOutput) const {
5021 ArgStringList CmdArgs;
5022
Daniel Dunbar03e92302011-05-09 17:23:16 +00005023 CmdArgs.push_back("-o");
5024 CmdArgs.push_back(Output.getFilename());
5025
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00005026 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5027 const InputInfo &Input = Inputs[0];
5028 assert(Input.isFilename() && "Unexpected dsymutil input.");
5029 CmdArgs.push_back(Input.getFilename());
5030
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00005031 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005032 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005033 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00005034}
5035
Eric Christopherf8571862011-08-23 17:56:55 +00005036void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher27e2b982012-12-18 00:31:10 +00005037 const InputInfo &Output,
5038 const InputInfoList &Inputs,
5039 const ArgList &Args,
5040 const char *LinkingOutput) const {
Eric Christopherf8571862011-08-23 17:56:55 +00005041 ArgStringList CmdArgs;
5042 CmdArgs.push_back("--verify");
Eric Christopher1c79dc42012-02-06 19:13:09 +00005043 CmdArgs.push_back("--debug-info");
5044 CmdArgs.push_back("--eh-frame");
Eric Christopherb822f722012-02-06 19:43:51 +00005045 CmdArgs.push_back("--quiet");
Eric Christopherf8571862011-08-23 17:56:55 +00005046
5047 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5048 const InputInfo &Input = Inputs[0];
5049 assert(Input.isFilename() && "Unexpected verify input");
5050
5051 // Grabbing the output of the earlier dsymutil run.
5052 CmdArgs.push_back(Input.getFilename());
5053
5054 const char *Exec =
5055 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5056 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5057}
5058
David Chisnall31c46902012-02-15 13:39:01 +00005059void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5060 const InputInfo &Output,
5061 const InputInfoList &Inputs,
5062 const ArgList &Args,
5063 const char *LinkingOutput) const {
5064 ArgStringList CmdArgs;
5065
5066 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5067 options::OPT_Xassembler);
5068
5069 CmdArgs.push_back("-o");
5070 CmdArgs.push_back(Output.getFilename());
5071
5072 for (InputInfoList::const_iterator
5073 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5074 const InputInfo &II = *it;
5075 CmdArgs.push_back(II.getFilename());
5076 }
5077
5078 const char *Exec =
5079 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5080 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5081}
5082
5083
5084void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5085 const InputInfo &Output,
5086 const InputInfoList &Inputs,
5087 const ArgList &Args,
5088 const char *LinkingOutput) const {
5089 // FIXME: Find a real GCC, don't hard-code versions here
5090 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5091 const llvm::Triple &T = getToolChain().getTriple();
5092 std::string LibPath = "/usr/lib/";
5093 llvm::Triple::ArchType Arch = T.getArch();
5094 switch (Arch) {
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00005095 case llvm::Triple::x86:
5096 GCCLibPath +=
5097 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5098 break;
5099 case llvm::Triple::x86_64:
5100 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5101 GCCLibPath += "/4.5.2/amd64/";
5102 LibPath += "amd64/";
5103 break;
5104 default:
5105 llvm_unreachable("Unsupported architecture");
David Chisnall31c46902012-02-15 13:39:01 +00005106 }
5107
5108 ArgStringList CmdArgs;
5109
David Chisnall41d476d2012-02-29 15:06:12 +00005110 // Demangle C++ names in errors
5111 CmdArgs.push_back("-C");
5112
David Chisnall31c46902012-02-15 13:39:01 +00005113 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5114 (!Args.hasArg(options::OPT_shared))) {
5115 CmdArgs.push_back("-e");
5116 CmdArgs.push_back("_start");
5117 }
5118
5119 if (Args.hasArg(options::OPT_static)) {
5120 CmdArgs.push_back("-Bstatic");
5121 CmdArgs.push_back("-dn");
5122 } else {
5123 CmdArgs.push_back("-Bdynamic");
5124 if (Args.hasArg(options::OPT_shared)) {
5125 CmdArgs.push_back("-shared");
5126 } else {
5127 CmdArgs.push_back("--dynamic-linker");
5128 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5129 }
5130 }
5131
5132 if (Output.isFilename()) {
5133 CmdArgs.push_back("-o");
5134 CmdArgs.push_back(Output.getFilename());
5135 } else {
5136 assert(Output.isNothing() && "Invalid output.");
5137 }
5138
5139 if (!Args.hasArg(options::OPT_nostdlib) &&
5140 !Args.hasArg(options::OPT_nostartfiles)) {
5141 if (!Args.hasArg(options::OPT_shared)) {
5142 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5143 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00005144 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005145 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5146 } else {
5147 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00005148 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5149 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005150 }
Hans Wennborg76b86c22013-07-18 20:29:38 +00005151 if (getToolChain().getDriver().CCCIsCXX())
David Chisnalle6dd6832012-03-13 14:14:54 +00005152 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005153 }
5154
5155 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5156
5157 Args.AddAllArgs(CmdArgs, options::OPT_L);
5158 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5159 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall165329c2012-02-28 17:10:04 +00005160 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnall31c46902012-02-15 13:39:01 +00005161
5162 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5163
5164 if (!Args.hasArg(options::OPT_nostdlib) &&
5165 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005166 if (getToolChain().getDriver().CCCIsCXX())
David Chisnalle58e6f92012-04-10 11:49:50 +00005167 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnallb6229592012-02-15 18:24:31 +00005168 CmdArgs.push_back("-lgcc_s");
David Chisnall165329c2012-02-28 17:10:04 +00005169 if (!Args.hasArg(options::OPT_shared)) {
5170 CmdArgs.push_back("-lgcc");
David Chisnall31c46902012-02-15 13:39:01 +00005171 CmdArgs.push_back("-lc");
David Chisnall7dbefe12012-02-28 20:06:45 +00005172 CmdArgs.push_back("-lm");
David Chisnall165329c2012-02-28 17:10:04 +00005173 }
David Chisnall31c46902012-02-15 13:39:01 +00005174 }
5175
5176 if (!Args.hasArg(options::OPT_nostdlib) &&
5177 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall165329c2012-02-28 17:10:04 +00005178 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005179 }
David Chisnalld1ac03e2012-02-16 16:00:47 +00005180 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005181
5182 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5183
5184 const char *Exec =
5185 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5186 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5187}
5188
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005189void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005190 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00005191 const InputInfoList &Inputs,
5192 const ArgList &Args,
5193 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005194 ArgStringList CmdArgs;
5195
5196 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5197 options::OPT_Xassembler);
5198
5199 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005200 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005201
5202 for (InputInfoList::const_iterator
5203 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5204 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005205 CmdArgs.push_back(II.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005206 }
5207
5208 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005209 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005210 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005211}
5212
5213void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005214 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00005215 const InputInfoList &Inputs,
5216 const ArgList &Args,
5217 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005218 ArgStringList CmdArgs;
5219
5220 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00005221 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005222 CmdArgs.push_back("-e");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005223 CmdArgs.push_back("_start");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005224 }
5225
5226 if (Args.hasArg(options::OPT_static)) {
5227 CmdArgs.push_back("-Bstatic");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005228 CmdArgs.push_back("-dn");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005229 } else {
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005230// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005231 CmdArgs.push_back("-Bdynamic");
5232 if (Args.hasArg(options::OPT_shared)) {
5233 CmdArgs.push_back("-shared");
5234 } else {
Edward O'Callaghan3cecc192009-10-16 19:44:18 +00005235 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005236 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5237 }
5238 }
5239
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005240 if (Output.isFilename()) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005241 CmdArgs.push_back("-o");
5242 CmdArgs.push_back(Output.getFilename());
5243 } else {
5244 assert(Output.isNothing() && "Invalid output.");
5245 }
5246
5247 if (!Args.hasArg(options::OPT_nostdlib) &&
5248 !Args.hasArg(options::OPT_nostartfiles)) {
5249 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00005250 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005251 getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005252 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005253 getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005254 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005255 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005256 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005257 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005258 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005259 }
Chris Lattner38e317d2010-07-07 16:01:42 +00005260 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005261 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005262 }
5263
Daniel Dunbar294691e2009-11-04 06:24:38 +00005264 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5265 + getToolChain().getTripleString()
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00005266 + "/4.2.4"));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005267
5268 Args.AddAllArgs(CmdArgs, options::OPT_L);
5269 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5270 Args.AddAllArgs(CmdArgs, options::OPT_e);
5271
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005272 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005273
5274 if (!Args.hasArg(options::OPT_nostdlib) &&
5275 !Args.hasArg(options::OPT_nodefaultlibs)) {
5276 // FIXME: For some reason GCC passes -lgcc before adding
5277 // the default system libraries. Just mimic this for now.
5278 CmdArgs.push_back("-lgcc");
5279
5280 if (Args.hasArg(options::OPT_pthread))
5281 CmdArgs.push_back("-pthread");
5282 if (!Args.hasArg(options::OPT_shared))
5283 CmdArgs.push_back("-lc");
5284 CmdArgs.push_back("-lgcc");
5285 }
5286
5287 if (!Args.hasArg(options::OPT_nostdlib) &&
5288 !Args.hasArg(options::OPT_nostartfiles)) {
5289 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005290 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005291 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005292 }
5293
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005294 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005295
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005296 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005297 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005298 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005299}
5300
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005301void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005302 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005303 const InputInfoList &Inputs,
5304 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005305 const char *LinkingOutput) const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005306 ArgStringList CmdArgs;
5307
5308 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5309 options::OPT_Xassembler);
5310
5311 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005312 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005313
5314 for (InputInfoList::const_iterator
5315 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5316 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005317 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005318 }
5319
5320 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005321 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005322 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005323}
5324
5325void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005326 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005327 const InputInfoList &Inputs,
5328 const ArgList &Args,
5329 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00005330 const Driver &D = getToolChain().getDriver();
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005331 ArgStringList CmdArgs;
5332
Rafael Espindola6cc2a682012-12-31 22:41:36 +00005333 // Silence warning for "clang -g foo.o -o foo"
5334 Args.ClaimAllArgs(options::OPT_g_Group);
5335 // and "clang -emit-llvm foo.o -o foo"
5336 Args.ClaimAllArgs(options::OPT_emit_llvm);
5337 // and for "clang -w foo.o -o foo". Other warning options are already
5338 // handled somewhere else.
5339 Args.ClaimAllArgs(options::OPT_w);
5340
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005341 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00005342 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005343 CmdArgs.push_back("-e");
5344 CmdArgs.push_back("__start");
5345 }
5346
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005347 if (Args.hasArg(options::OPT_static)) {
5348 CmdArgs.push_back("-Bstatic");
5349 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005350 if (Args.hasArg(options::OPT_rdynamic))
5351 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005352 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005353 CmdArgs.push_back("-Bdynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005354 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005355 CmdArgs.push_back("-shared");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005356 } else {
5357 CmdArgs.push_back("-dynamic-linker");
5358 CmdArgs.push_back("/usr/libexec/ld.so");
5359 }
5360 }
5361
Rafael Espindola9adba392013-06-05 04:28:55 +00005362 if (Args.hasArg(options::OPT_nopie))
5363 CmdArgs.push_back("-nopie");
5364
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005365 if (Output.isFilename()) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005366 CmdArgs.push_back("-o");
5367 CmdArgs.push_back(Output.getFilename());
5368 } else {
5369 assert(Output.isNothing() && "Invalid output.");
5370 }
5371
5372 if (!Args.hasArg(options::OPT_nostdlib) &&
5373 !Args.hasArg(options::OPT_nostartfiles)) {
5374 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman62d829a2011-12-15 02:15:56 +00005375 if (Args.hasArg(options::OPT_pg))
5376 CmdArgs.push_back(Args.MakeArgString(
5377 getToolChain().GetFilePath("gcrt0.o")));
5378 else
5379 CmdArgs.push_back(Args.MakeArgString(
5380 getToolChain().GetFilePath("crt0.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005381 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005382 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005383 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005384 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005385 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005386 }
5387 }
5388
Edward O'Callaghane7e18202009-10-28 15:13:08 +00005389 std::string Triple = getToolChain().getTripleString();
5390 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar294691e2009-11-04 06:24:38 +00005391 Triple.replace(0, 6, "amd64");
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00005392 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbar95c04572010-08-01 23:13:54 +00005393 "/4.2.1"));
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005394
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005395 Args.AddAllArgs(CmdArgs, options::OPT_L);
5396 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5397 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindola6cc2a682012-12-31 22:41:36 +00005398 Args.AddAllArgs(CmdArgs, options::OPT_s);
5399 Args.AddAllArgs(CmdArgs, options::OPT_t);
5400 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5401 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005402
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005403 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005404
5405 if (!Args.hasArg(options::OPT_nostdlib) &&
5406 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005407 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00005408 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman62d829a2011-12-15 02:15:56 +00005409 if (Args.hasArg(options::OPT_pg))
5410 CmdArgs.push_back("-lm_p");
5411 else
5412 CmdArgs.push_back("-lm");
Daniel Dunbar95c04572010-08-01 23:13:54 +00005413 }
5414
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005415 // FIXME: For some reason GCC passes -lgcc before adding
5416 // the default system libraries. Just mimic this for now.
5417 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005418
Eric Christopherdc6cc872012-09-13 06:32:34 +00005419 if (Args.hasArg(options::OPT_pthread)) {
5420 if (!Args.hasArg(options::OPT_shared) &&
5421 Args.hasArg(options::OPT_pg))
5422 CmdArgs.push_back("-lpthread_p");
5423 else
5424 CmdArgs.push_back("-lpthread");
5425 }
5426
Chandler Carruth657849c2011-12-17 22:32:42 +00005427 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherdc6cc872012-09-13 06:32:34 +00005428 if (Args.hasArg(options::OPT_pg))
Eli Friedman62d829a2011-12-15 02:15:56 +00005429 CmdArgs.push_back("-lc_p");
5430 else
5431 CmdArgs.push_back("-lc");
Chandler Carruth657849c2011-12-17 22:32:42 +00005432 }
Eric Christopherdc6cc872012-09-13 06:32:34 +00005433
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005434 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005435 }
5436
5437 if (!Args.hasArg(options::OPT_nostdlib) &&
5438 !Args.hasArg(options::OPT_nostartfiles)) {
5439 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005440 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005441 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005442 else
Chris Lattner38e317d2010-07-07 16:01:42 +00005443 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005444 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005445 }
5446
5447 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005448 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005449 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005450}
Ed Schoutenc66a5a32009-04-02 19:13:12 +00005451
Eli Friedman42f74f22012-08-08 23:57:20 +00005452void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5453 const InputInfo &Output,
5454 const InputInfoList &Inputs,
5455 const ArgList &Args,
5456 const char *LinkingOutput) const {
5457 ArgStringList CmdArgs;
5458
5459 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5460 options::OPT_Xassembler);
5461
5462 CmdArgs.push_back("-o");
5463 CmdArgs.push_back(Output.getFilename());
5464
5465 for (InputInfoList::const_iterator
5466 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5467 const InputInfo &II = *it;
5468 CmdArgs.push_back(II.getFilename());
5469 }
5470
5471 const char *Exec =
5472 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5473 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5474}
5475
5476void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5477 const InputInfo &Output,
5478 const InputInfoList &Inputs,
5479 const ArgList &Args,
5480 const char *LinkingOutput) const {
5481 const Driver &D = getToolChain().getDriver();
5482 ArgStringList CmdArgs;
5483
5484 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5485 (!Args.hasArg(options::OPT_shared))) {
5486 CmdArgs.push_back("-e");
5487 CmdArgs.push_back("__start");
5488 }
5489
5490 if (Args.hasArg(options::OPT_static)) {
5491 CmdArgs.push_back("-Bstatic");
5492 } else {
5493 if (Args.hasArg(options::OPT_rdynamic))
5494 CmdArgs.push_back("-export-dynamic");
5495 CmdArgs.push_back("--eh-frame-hdr");
5496 CmdArgs.push_back("-Bdynamic");
5497 if (Args.hasArg(options::OPT_shared)) {
5498 CmdArgs.push_back("-shared");
5499 } else {
5500 CmdArgs.push_back("-dynamic-linker");
5501 CmdArgs.push_back("/usr/libexec/ld.so");
5502 }
5503 }
5504
5505 if (Output.isFilename()) {
5506 CmdArgs.push_back("-o");
5507 CmdArgs.push_back(Output.getFilename());
5508 } else {
5509 assert(Output.isNothing() && "Invalid output.");
5510 }
5511
5512 if (!Args.hasArg(options::OPT_nostdlib) &&
5513 !Args.hasArg(options::OPT_nostartfiles)) {
5514 if (!Args.hasArg(options::OPT_shared)) {
5515 if (Args.hasArg(options::OPT_pg))
5516 CmdArgs.push_back(Args.MakeArgString(
5517 getToolChain().GetFilePath("gcrt0.o")));
5518 else
5519 CmdArgs.push_back(Args.MakeArgString(
5520 getToolChain().GetFilePath("crt0.o")));
5521 CmdArgs.push_back(Args.MakeArgString(
5522 getToolChain().GetFilePath("crtbegin.o")));
5523 } else {
5524 CmdArgs.push_back(Args.MakeArgString(
5525 getToolChain().GetFilePath("crtbeginS.o")));
5526 }
5527 }
5528
5529 Args.AddAllArgs(CmdArgs, options::OPT_L);
5530 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5531 Args.AddAllArgs(CmdArgs, options::OPT_e);
5532
5533 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5534
5535 if (!Args.hasArg(options::OPT_nostdlib) &&
5536 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005537 if (D.CCCIsCXX()) {
Eli Friedman42f74f22012-08-08 23:57:20 +00005538 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5539 if (Args.hasArg(options::OPT_pg))
5540 CmdArgs.push_back("-lm_p");
5541 else
5542 CmdArgs.push_back("-lm");
5543 }
5544
Rafael Espindola3667bbe2012-10-23 17:07:31 +00005545 if (Args.hasArg(options::OPT_pthread)) {
5546 if (!Args.hasArg(options::OPT_shared) &&
5547 Args.hasArg(options::OPT_pg))
5548 CmdArgs.push_back("-lpthread_p");
5549 else
5550 CmdArgs.push_back("-lpthread");
5551 }
5552
Eli Friedman42f74f22012-08-08 23:57:20 +00005553 if (!Args.hasArg(options::OPT_shared)) {
5554 if (Args.hasArg(options::OPT_pg))
5555 CmdArgs.push_back("-lc_p");
5556 else
5557 CmdArgs.push_back("-lc");
5558 }
5559
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00005560 StringRef MyArch;
5561 switch (getToolChain().getTriple().getArch()) {
5562 case llvm::Triple::arm:
5563 MyArch = "arm";
5564 break;
5565 case llvm::Triple::x86:
5566 MyArch = "i386";
5567 break;
5568 case llvm::Triple::x86_64:
5569 MyArch = "amd64";
5570 break;
5571 default:
5572 llvm_unreachable("Unsupported architecture");
5573 }
5574 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman42f74f22012-08-08 23:57:20 +00005575 }
5576
5577 if (!Args.hasArg(options::OPT_nostdlib) &&
5578 !Args.hasArg(options::OPT_nostartfiles)) {
5579 if (!Args.hasArg(options::OPT_shared))
5580 CmdArgs.push_back(Args.MakeArgString(
5581 getToolChain().GetFilePath("crtend.o")));
5582 else
5583 CmdArgs.push_back(Args.MakeArgString(
5584 getToolChain().GetFilePath("crtendS.o")));
5585 }
Eli Friedmanc9c48db2012-08-09 22:42:04 +00005586
5587 const char *Exec =
5588 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5589 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman42f74f22012-08-08 23:57:20 +00005590}
5591
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005592void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005593 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005594 const InputInfoList &Inputs,
5595 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005596 const char *LinkingOutput) const {
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005597 ArgStringList CmdArgs;
5598
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005599 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5600 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc55da4b2012-09-05 21:32:44 +00005601 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005602 CmdArgs.push_back("--32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005603 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky3393cef2011-06-04 07:37:31 +00005604 CmdArgs.push_back("-a32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005605 else if (getToolChain().getArch() == llvm::Triple::mips ||
5606 getToolChain().getArch() == llvm::Triple::mipsel ||
5607 getToolChain().getArch() == llvm::Triple::mips64 ||
5608 getToolChain().getArch() == llvm::Triple::mips64el) {
5609 StringRef CPUName;
5610 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00005611 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer20249a12010-10-21 03:16:25 +00005612
Eric Christopherc55da4b2012-09-05 21:32:44 +00005613 CmdArgs.push_back("-march");
5614 CmdArgs.push_back(CPUName.data());
5615
Eric Christopherc55da4b2012-09-05 21:32:44 +00005616 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00005617 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc55da4b2012-09-05 21:32:44 +00005618
5619 if (getToolChain().getArch() == llvm::Triple::mips ||
5620 getToolChain().getArch() == llvm::Triple::mips64)
5621 CmdArgs.push_back("-EB");
5622 else
5623 CmdArgs.push_back("-EL");
5624
5625 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5626 options::OPT_fpic, options::OPT_fno_pic,
5627 options::OPT_fPIE, options::OPT_fno_PIE,
5628 options::OPT_fpie, options::OPT_fno_pie);
5629 if (LastPICArg &&
5630 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5631 LastPICArg->getOption().matches(options::OPT_fpic) ||
5632 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5633 LastPICArg->getOption().matches(options::OPT_fpie))) {
5634 CmdArgs.push_back("-KPIC");
5635 }
Rafael Espindola27fa2362012-12-13 04:17:14 +00005636 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5637 getToolChain().getArch() == llvm::Triple::thumb) {
5638 CmdArgs.push_back("-mfpu=softvfp");
5639 switch(getToolChain().getTriple().getEnvironment()) {
5640 case llvm::Triple::GNUEABI:
5641 case llvm::Triple::EABI:
Anton Korobeynikovb234e742013-03-18 07:59:20 +00005642 CmdArgs.push_back("-meabi=5");
Rafael Espindola27fa2362012-12-13 04:17:14 +00005643 break;
5644
5645 default:
5646 CmdArgs.push_back("-matpcs");
5647 }
Eric Christopherc55da4b2012-09-05 21:32:44 +00005648 }
Eric Christophered734732010-03-02 02:41:08 +00005649
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005650 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5651 options::OPT_Xassembler);
5652
5653 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005654 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005655
5656 for (InputInfoList::const_iterator
5657 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5658 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005659 CmdArgs.push_back(II.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005660 }
5661
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005662 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005663 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005664 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005665}
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005666
5667void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005668 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005669 const InputInfoList &Inputs,
5670 const ArgList &Args,
Daniel Dunbara8304f62009-05-02 20:14:53 +00005671 const char *LinkingOutput) const {
Roman Divacky94380162012-08-28 15:09:03 +00005672 const toolchains::FreeBSD& ToolChain =
5673 static_cast<const toolchains::FreeBSD&>(getToolChain());
5674 const Driver &D = ToolChain.getDriver();
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005675 ArgStringList CmdArgs;
David Chisnalldfa210b2012-07-29 15:24:44 +00005676
5677 // Silence warning for "clang -g foo.o -o foo"
5678 Args.ClaimAllArgs(options::OPT_g_Group);
5679 // and "clang -emit-llvm foo.o -o foo"
5680 Args.ClaimAllArgs(options::OPT_emit_llvm);
5681 // and for "clang -w foo.o -o foo". Other warning options are already
5682 // handled somewhere else.
5683 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005684
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005685 if (!D.SysRoot.empty())
5686 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5687
Roman Divacky94380162012-08-28 15:09:03 +00005688 if (Args.hasArg(options::OPT_pie))
5689 CmdArgs.push_back("-pie");
5690
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005691 if (Args.hasArg(options::OPT_static)) {
5692 CmdArgs.push_back("-Bstatic");
5693 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005694 if (Args.hasArg(options::OPT_rdynamic))
5695 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005696 CmdArgs.push_back("--eh-frame-hdr");
5697 if (Args.hasArg(options::OPT_shared)) {
5698 CmdArgs.push_back("-Bshareable");
5699 } else {
5700 CmdArgs.push_back("-dynamic-linker");
5701 CmdArgs.push_back("/libexec/ld-elf.so.1");
5702 }
Roman Divacky94380162012-08-28 15:09:03 +00005703 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5704 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnalldfa210b2012-07-29 15:24:44 +00005705 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5706 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5707 CmdArgs.push_back("--hash-style=both");
5708 }
5709 }
5710 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005711 }
5712
5713 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5714 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005715 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005716 CmdArgs.push_back("-m");
5717 CmdArgs.push_back("elf_i386_fbsd");
5718 }
5719
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005720 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky000a6552011-06-04 07:40:24 +00005721 CmdArgs.push_back("-m");
Roman Divacky1052c1d2011-11-21 16:50:32 +00005722 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky000a6552011-06-04 07:40:24 +00005723 }
5724
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005725 if (Output.isFilename()) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005726 CmdArgs.push_back("-o");
5727 CmdArgs.push_back(Output.getFilename());
5728 } else {
5729 assert(Output.isNothing() && "Invalid output.");
5730 }
5731
5732 if (!Args.hasArg(options::OPT_nostdlib) &&
5733 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divacky94380162012-08-28 15:09:03 +00005734 const char *crt1 = NULL;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005735 if (!Args.hasArg(options::OPT_shared)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005736 if (Args.hasArg(options::OPT_pg))
Roman Divacky94380162012-08-28 15:09:03 +00005737 crt1 = "gcrt1.o";
5738 else if (Args.hasArg(options::OPT_pie))
5739 crt1 = "Scrt1.o";
5740 else
5741 crt1 = "crt1.o";
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005742 }
Roman Divacky94380162012-08-28 15:09:03 +00005743 if (crt1)
5744 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5745
5746 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5747
5748 const char *crtbegin = NULL;
5749 if (Args.hasArg(options::OPT_static))
5750 crtbegin = "crtbeginT.o";
5751 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5752 crtbegin = "crtbeginS.o";
5753 else
5754 crtbegin = "crtbegin.o";
5755
5756 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005757 }
5758
5759 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divacky94380162012-08-28 15:09:03 +00005760 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divacky58e5ac92011-03-01 17:53:14 +00005761 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5762 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005763 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005764 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5765 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnallc7363772010-08-15 22:58:12 +00005766 Args.AddAllArgs(CmdArgs, options::OPT_s);
5767 Args.AddAllArgs(CmdArgs, options::OPT_t);
5768 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5769 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005770
Roman Divacky94380162012-08-28 15:09:03 +00005771 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005772
5773 if (!Args.hasArg(options::OPT_nostdlib) &&
5774 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005775 if (D.CCCIsCXX()) {
Roman Divacky94380162012-08-28 15:09:03 +00005776 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divackyc16bb762011-02-10 16:59:40 +00005777 if (Args.hasArg(options::OPT_pg))
5778 CmdArgs.push_back("-lm_p");
5779 else
5780 CmdArgs.push_back("-lm");
Daniel Dunbar20022632010-02-17 08:07:51 +00005781 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005782 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5783 // the default system libraries. Just mimic this for now.
Roman Divackyc16bb762011-02-10 16:59:40 +00005784 if (Args.hasArg(options::OPT_pg))
5785 CmdArgs.push_back("-lgcc_p");
5786 else
5787 CmdArgs.push_back("-lgcc");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005788 if (Args.hasArg(options::OPT_static)) {
5789 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005790 } else if (Args.hasArg(options::OPT_pg)) {
5791 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005792 } else {
5793 CmdArgs.push_back("--as-needed");
5794 CmdArgs.push_back("-lgcc_s");
5795 CmdArgs.push_back("--no-as-needed");
5796 }
5797
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005798 if (Args.hasArg(options::OPT_pthread)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005799 if (Args.hasArg(options::OPT_pg))
5800 CmdArgs.push_back("-lpthread_p");
5801 else
5802 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005803 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005804
Roman Divackyc16bb762011-02-10 16:59:40 +00005805 if (Args.hasArg(options::OPT_pg)) {
5806 if (Args.hasArg(options::OPT_shared))
5807 CmdArgs.push_back("-lc");
5808 else
5809 CmdArgs.push_back("-lc_p");
5810 CmdArgs.push_back("-lgcc_p");
5811 } else {
5812 CmdArgs.push_back("-lc");
5813 CmdArgs.push_back("-lgcc");
5814 }
5815
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005816 if (Args.hasArg(options::OPT_static)) {
5817 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005818 } else if (Args.hasArg(options::OPT_pg)) {
5819 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005820 } else {
5821 CmdArgs.push_back("--as-needed");
5822 CmdArgs.push_back("-lgcc_s");
5823 CmdArgs.push_back("--no-as-needed");
5824 }
5825 }
5826
5827 if (!Args.hasArg(options::OPT_nostdlib) &&
5828 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyf6513812012-09-07 13:36:21 +00005829 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divacky94380162012-08-28 15:09:03 +00005830 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackyf6513812012-09-07 13:36:21 +00005831 else
5832 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divacky94380162012-08-28 15:09:03 +00005833 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005834 }
5835
Roman Divacky94380162012-08-28 15:09:03 +00005836 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005837
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005838 const char *Exec =
Roman Divacky94380162012-08-28 15:09:03 +00005839 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005840 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005841}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005842
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005843void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5844 const InputInfo &Output,
5845 const InputInfoList &Inputs,
5846 const ArgList &Args,
5847 const char *LinkingOutput) const {
5848 ArgStringList CmdArgs;
5849
5850 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5851 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005852 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005853 CmdArgs.push_back("--32");
5854
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005855 // Set byte order explicitly
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005856 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005857 CmdArgs.push_back("-EB");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005858 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005859 CmdArgs.push_back("-EL");
5860
5861 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5862 options::OPT_Xassembler);
5863
5864 CmdArgs.push_back("-o");
5865 CmdArgs.push_back(Output.getFilename());
5866
5867 for (InputInfoList::const_iterator
5868 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5869 const InputInfo &II = *it;
5870 CmdArgs.push_back(II.getFilename());
5871 }
5872
David Chisnall5adcec12011-09-27 22:03:18 +00005873 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005874 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5875}
5876
5877void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5878 const InputInfo &Output,
5879 const InputInfoList &Inputs,
5880 const ArgList &Args,
5881 const char *LinkingOutput) const {
5882 const Driver &D = getToolChain().getDriver();
5883 ArgStringList CmdArgs;
5884
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005885 if (!D.SysRoot.empty())
5886 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5887
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005888 if (Args.hasArg(options::OPT_static)) {
5889 CmdArgs.push_back("-Bstatic");
5890 } else {
5891 if (Args.hasArg(options::OPT_rdynamic))
5892 CmdArgs.push_back("-export-dynamic");
5893 CmdArgs.push_back("--eh-frame-hdr");
5894 if (Args.hasArg(options::OPT_shared)) {
5895 CmdArgs.push_back("-Bshareable");
5896 } else {
5897 CmdArgs.push_back("-dynamic-linker");
5898 CmdArgs.push_back("/libexec/ld.elf_so");
5899 }
5900 }
5901
5902 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5903 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005904 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005905 CmdArgs.push_back("-m");
5906 CmdArgs.push_back("elf_i386");
5907 }
5908
5909 if (Output.isFilename()) {
5910 CmdArgs.push_back("-o");
5911 CmdArgs.push_back(Output.getFilename());
5912 } else {
5913 assert(Output.isNothing() && "Invalid output.");
5914 }
5915
5916 if (!Args.hasArg(options::OPT_nostdlib) &&
5917 !Args.hasArg(options::OPT_nostartfiles)) {
5918 if (!Args.hasArg(options::OPT_shared)) {
5919 CmdArgs.push_back(Args.MakeArgString(
5920 getToolChain().GetFilePath("crt0.o")));
5921 CmdArgs.push_back(Args.MakeArgString(
5922 getToolChain().GetFilePath("crti.o")));
5923 CmdArgs.push_back(Args.MakeArgString(
5924 getToolChain().GetFilePath("crtbegin.o")));
5925 } else {
5926 CmdArgs.push_back(Args.MakeArgString(
5927 getToolChain().GetFilePath("crti.o")));
5928 CmdArgs.push_back(Args.MakeArgString(
5929 getToolChain().GetFilePath("crtbeginS.o")));
5930 }
5931 }
5932
5933 Args.AddAllArgs(CmdArgs, options::OPT_L);
5934 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5935 Args.AddAllArgs(CmdArgs, options::OPT_e);
5936 Args.AddAllArgs(CmdArgs, options::OPT_s);
5937 Args.AddAllArgs(CmdArgs, options::OPT_t);
5938 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5939 Args.AddAllArgs(CmdArgs, options::OPT_r);
5940
5941 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5942
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00005943 unsigned Major, Minor, Micro;
5944 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
5945 bool useLibgcc = true;
5946 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
5947 if (getToolChain().getArch() == llvm::Triple::x86 ||
5948 getToolChain().getArch() == llvm::Triple::x86_64)
5949 useLibgcc = false;
5950 }
5951
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005952 if (!Args.hasArg(options::OPT_nostdlib) &&
5953 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005954 if (D.CCCIsCXX()) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005955 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5956 CmdArgs.push_back("-lm");
5957 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005958 if (Args.hasArg(options::OPT_pthread))
5959 CmdArgs.push_back("-lpthread");
5960 CmdArgs.push_back("-lc");
5961
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00005962 if (useLibgcc) {
5963 if (Args.hasArg(options::OPT_static)) {
5964 // libgcc_eh depends on libc, so resolve as much as possible,
5965 // pull in any new requirements from libc and then get the rest
5966 // of libgcc.
5967 CmdArgs.push_back("-lgcc_eh");
5968 CmdArgs.push_back("-lc");
5969 CmdArgs.push_back("-lgcc");
5970 } else {
5971 CmdArgs.push_back("-lgcc");
5972 CmdArgs.push_back("--as-needed");
5973 CmdArgs.push_back("-lgcc_s");
5974 CmdArgs.push_back("--no-as-needed");
5975 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005976 }
5977 }
5978
5979 if (!Args.hasArg(options::OPT_nostdlib) &&
5980 !Args.hasArg(options::OPT_nostartfiles)) {
5981 if (!Args.hasArg(options::OPT_shared))
5982 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5983 "crtend.o")));
5984 else
5985 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5986 "crtendS.o")));
5987 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5988 "crtn.o")));
5989 }
5990
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005991 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005992
David Chisnall5adcec12011-09-27 22:03:18 +00005993 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005994 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5995}
5996
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00005997void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5998 const InputInfo &Output,
5999 const InputInfoList &Inputs,
6000 const ArgList &Args,
6001 const char *LinkingOutput) const {
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006002 ArgStringList CmdArgs;
6003
6004 // Add --32/--64 to make sure we get the format we want.
6005 // This is incomplete
6006 if (getToolChain().getArch() == llvm::Triple::x86) {
6007 CmdArgs.push_back("--32");
6008 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
6009 CmdArgs.push_back("--64");
Eli Friedman7972c882011-11-28 23:46:52 +00006010 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6011 CmdArgs.push_back("-a32");
6012 CmdArgs.push_back("-mppc");
6013 CmdArgs.push_back("-many");
6014 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6015 CmdArgs.push_back("-a64");
6016 CmdArgs.push_back("-mppc64");
6017 CmdArgs.push_back("-many");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00006018 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6019 CmdArgs.push_back("-a64");
6020 CmdArgs.push_back("-mppc64le");
6021 CmdArgs.push_back("-many");
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006022 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00006023 StringRef MArch = getToolChain().getArchName();
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006024 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6025 CmdArgs.push_back("-mfpu=neon");
Bernard Ogden80e90c22013-10-24 18:32:41 +00006026 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a")
6027 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00006028
6029 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
6030 getToolChain().getTriple());
6031 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00006032
6033 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
6034 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
6035 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanakac85900f2011-11-30 19:31:38 +00006036 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6037 getToolChain().getArch() == llvm::Triple::mipsel ||
6038 getToolChain().getArch() == llvm::Triple::mips64 ||
6039 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan073a7802012-04-07 22:31:29 +00006040 StringRef CPUName;
6041 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00006042 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanakac85900f2011-11-30 19:31:38 +00006043
Simon Atanasyan073a7802012-04-07 22:31:29 +00006044 CmdArgs.push_back("-march");
6045 CmdArgs.push_back(CPUName.data());
6046
Simon Atanasyan073a7802012-04-07 22:31:29 +00006047 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00006048 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan5f0a1c12012-04-06 19:15:24 +00006049
6050 if (getToolChain().getArch() == llvm::Triple::mips ||
6051 getToolChain().getArch() == llvm::Triple::mips64)
6052 CmdArgs.push_back("-EB");
6053 else
6054 CmdArgs.push_back("-EL");
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00006055
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00006056 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6057 if (StringRef(A->getValue()) == "2008")
6058 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6059 }
6060
Simon Atanasyan9dbfc612013-04-30 07:47:13 +00006061 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6062 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6063 options::OPT_mno_micromips);
6064 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6065 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6066
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00006067 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6068 options::OPT_fpic, options::OPT_fno_pic,
6069 options::OPT_fPIE, options::OPT_fno_PIE,
6070 options::OPT_fpie, options::OPT_fno_pie);
6071 if (LastPICArg &&
6072 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6073 LastPICArg->getOption().matches(options::OPT_fpic) ||
6074 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6075 LastPICArg->getOption().matches(options::OPT_fpie))) {
6076 CmdArgs.push_back("-KPIC");
6077 }
Ulrich Weigandb8409212013-05-06 16:26:41 +00006078 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00006079 // Always pass an -march option, since our default of z10 is later
6080 // than the GNU assembler's default.
6081 StringRef CPUName = getSystemZTargetCPU(Args);
6082 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006083 }
6084
6085 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6086 options::OPT_Xassembler);
6087
6088 CmdArgs.push_back("-o");
6089 CmdArgs.push_back(Output.getFilename());
6090
6091 for (InputInfoList::const_iterator
6092 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6093 const InputInfo &II = *it;
6094 CmdArgs.push_back(II.getFilename());
6095 }
6096
6097 const char *Exec =
6098 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6099 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopherc47b6f32013-06-05 23:58:15 +00006100
6101 // Handle the debug info splitting at object creation time if we're
6102 // creating an object.
6103 // TODO: Currently only works on linux with newer objcopy.
6104 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00006105 getToolChain().getTriple().isOSLinux())
Eric Christopherc47b6f32013-06-05 23:58:15 +00006106 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6107 SplitDebugName(Args, Inputs));
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006108}
6109
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006110static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6111 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chien94a71422012-09-02 09:30:11 +00006112 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth68f94db2013-03-04 02:07:55 +00006113 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6114 Args.hasArg(options::OPT_static);
Hans Wennborg76b86c22013-07-18 20:29:38 +00006115 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006116 CmdArgs.push_back("-lgcc");
6117
Logan Chien529a73d2012-11-19 12:04:11 +00006118 if (StaticLibgcc || isAndroid) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006119 if (D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006120 CmdArgs.push_back("-lgcc");
6121 } else {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006122 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006123 CmdArgs.push_back("--as-needed");
6124 CmdArgs.push_back("-lgcc_s");
Hans Wennborg76b86c22013-07-18 20:29:38 +00006125 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006126 CmdArgs.push_back("--no-as-needed");
6127 }
6128
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006129 if (StaticLibgcc && !isAndroid)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006130 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg76b86c22013-07-18 20:29:38 +00006131 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006132 CmdArgs.push_back("-lgcc");
Logan Chien529a73d2012-11-19 12:04:11 +00006133
6134 // According to Android ABI, we have to link with libdl if we are
6135 // linking with non-static libgcc.
6136 //
6137 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6138 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6139 if (isAndroid && !StaticLibgcc)
6140 CmdArgs.push_back("-ldl");
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006141}
6142
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00006143static bool hasMipsN32ABIArg(const ArgList &Args) {
6144 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smith1d489cf2012-11-01 04:30:05 +00006145 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00006146}
6147
Peter Collingbournebdaa1342013-05-27 21:40:20 +00006148static StringRef getLinuxDynamicLinker(const ArgList &Args,
6149 const toolchains::Linux &ToolChain) {
6150 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6151 return "/system/bin/linker";
6152 else if (ToolChain.getArch() == llvm::Triple::x86)
6153 return "/lib/ld-linux.so.2";
6154 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6155 return "/lib/ld-linux-aarch64.so.1";
6156 else if (ToolChain.getArch() == llvm::Triple::arm ||
6157 ToolChain.getArch() == llvm::Triple::thumb) {
6158 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6159 return "/lib/ld-linux-armhf.so.3";
6160 else
6161 return "/lib/ld-linux.so.3";
6162 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6163 ToolChain.getArch() == llvm::Triple::mipsel)
6164 return "/lib/ld.so.1";
6165 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6166 ToolChain.getArch() == llvm::Triple::mips64el) {
6167 if (hasMipsN32ABIArg(Args))
6168 return "/lib32/ld.so.1";
6169 else
6170 return "/lib64/ld.so.1";
6171 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6172 return "/lib/ld.so.1";
6173 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00006174 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbournebdaa1342013-05-27 21:40:20 +00006175 ToolChain.getArch() == llvm::Triple::systemz)
6176 return "/lib64/ld64.so.1";
6177 else
6178 return "/lib64/ld-linux-x86-64.so.2";
6179}
6180
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00006181void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6182 const InputInfo &Output,
6183 const InputInfoList &Inputs,
6184 const ArgList &Args,
6185 const char *LinkingOutput) const {
Rafael Espindolac1da9812010-11-07 20:14:31 +00006186 const toolchains::Linux& ToolChain =
6187 static_cast<const toolchains::Linux&>(getToolChain());
6188 const Driver &D = ToolChain.getDriver();
Rafael Espindola715852c2012-11-02 20:41:30 +00006189 const bool isAndroid =
6190 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Alexey Samsonov1b8f12d2013-08-19 09:14:21 +00006191 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006192 const bool IsPIE =
6193 !Args.hasArg(options::OPT_shared) &&
Alexey Samsonov8bdc92c2013-08-09 07:42:13 +00006194 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow(ToolChain));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006195
Rafael Espindolac1da9812010-11-07 20:14:31 +00006196 ArgStringList CmdArgs;
6197
Rafael Espindola26f14c32010-11-15 18:28:16 +00006198 // Silence warning for "clang -g foo.o -o foo"
6199 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00006200 // and "clang -emit-llvm foo.o -o foo"
6201 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnalldfa210b2012-07-29 15:24:44 +00006202 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindola7f6458b2010-11-17 20:37:10 +00006203 // handled somewhere else.
6204 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola26f14c32010-11-15 18:28:16 +00006205
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006206 if (!D.SysRoot.empty())
6207 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006208
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006209 if (IsPIE)
Rafael Espindolafdda1712010-11-17 22:26:15 +00006210 CmdArgs.push_back("-pie");
6211
Rafael Espindoladc1b76d2010-11-07 22:57:16 +00006212 if (Args.hasArg(options::OPT_rdynamic))
6213 CmdArgs.push_back("-export-dynamic");
6214
Rafael Espindolae0e6d3b2010-11-11 19:34:42 +00006215 if (Args.hasArg(options::OPT_s))
6216 CmdArgs.push_back("-s");
6217
Rafael Espindolac1da9812010-11-07 20:14:31 +00006218 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6219 e = ToolChain.ExtraOpts.end();
6220 i != e; ++i)
6221 CmdArgs.push_back(i->c_str());
6222
6223 if (!Args.hasArg(options::OPT_static)) {
6224 CmdArgs.push_back("--eh-frame-hdr");
6225 }
6226
6227 CmdArgs.push_back("-m");
6228 if (ToolChain.getArch() == llvm::Triple::x86)
6229 CmdArgs.push_back("elf_i386");
Tim Northoverc264e162013-01-31 12:13:10 +00006230 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6231 CmdArgs.push_back("aarch64linux");
Eric Christopher88b7cf02011-08-19 00:30:14 +00006232 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregorf0594d82011-03-06 19:11:49 +00006233 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00006234 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43ac2972011-04-05 22:04:27 +00006235 else if (ToolChain.getArch() == llvm::Triple::ppc)
6236 CmdArgs.push_back("elf32ppclinux");
6237 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6238 CmdArgs.push_back("elf64ppc");
Eli Friedman5bea4f62011-11-08 19:43:37 +00006239 else if (ToolChain.getArch() == llvm::Triple::mips)
6240 CmdArgs.push_back("elf32btsmip");
6241 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6242 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00006243 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6244 if (hasMipsN32ABIArg(Args))
6245 CmdArgs.push_back("elf32btsmipn32");
6246 else
6247 CmdArgs.push_back("elf64btsmip");
6248 }
6249 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6250 if (hasMipsN32ABIArg(Args))
6251 CmdArgs.push_back("elf32ltsmipn32");
6252 else
6253 CmdArgs.push_back("elf64ltsmip");
6254 }
Ulrich Weigandb8409212013-05-06 16:26:41 +00006255 else if (ToolChain.getArch() == llvm::Triple::systemz)
6256 CmdArgs.push_back("elf64_s390");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006257 else
6258 CmdArgs.push_back("elf_x86_64");
6259
6260 if (Args.hasArg(options::OPT_static)) {
Douglas Gregorf0594d82011-03-06 19:11:49 +00006261 if (ToolChain.getArch() == llvm::Triple::arm
6262 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00006263 CmdArgs.push_back("-Bstatic");
6264 else
6265 CmdArgs.push_back("-static");
6266 } else if (Args.hasArg(options::OPT_shared)) {
6267 CmdArgs.push_back("-shared");
Rafael Espindola715852c2012-11-02 20:41:30 +00006268 if (isAndroid) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006269 CmdArgs.push_back("-Bsymbolic");
6270 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006271 }
6272
6273 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregorf0594d82011-03-06 19:11:49 +00006274 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac1da9812010-11-07 20:14:31 +00006275 (!Args.hasArg(options::OPT_static) &&
6276 !Args.hasArg(options::OPT_shared))) {
6277 CmdArgs.push_back("-dynamic-linker");
Peter Collingbournebdaa1342013-05-27 21:40:20 +00006278 CmdArgs.push_back(Args.MakeArgString(
6279 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006280 }
6281
6282 CmdArgs.push_back("-o");
6283 CmdArgs.push_back(Output.getFilename());
6284
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006285 if (!Args.hasArg(options::OPT_nostdlib) &&
6286 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006287 if (!isAndroid) {
6288 const char *crt1 = NULL;
6289 if (!Args.hasArg(options::OPT_shared)){
Eric Christopher61f08682013-06-07 23:25:01 +00006290 if (Args.hasArg(options::OPT_pg))
6291 crt1 = "gcrt1.o";
6292 else if (IsPIE)
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006293 crt1 = "Scrt1.o";
6294 else
6295 crt1 = "crt1.o";
6296 }
6297 if (crt1)
6298 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006299
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006300 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6301 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006302
Rafael Espindola89414b32010-11-12 03:00:39 +00006303 const char *crtbegin;
6304 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006305 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006306 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006307 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006308 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006309 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006310 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006311 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006312 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramere20e5082012-10-04 19:42:20 +00006313
6314 // Add crtfastmath.o if available and fast math is enabled.
6315 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola89414b32010-11-12 03:00:39 +00006316 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006317
6318 Args.AddAllArgs(CmdArgs, options::OPT_L);
6319
6320 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6321
Roman Divacky58e5ac92011-03-01 17:53:14 +00006322 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6323 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00006324 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006325
Rafael Espindolac5151542012-04-09 23:53:34 +00006326 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6327 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6328 // forward.
Rafael Espindola6155fbe2013-09-04 19:37:35 +00006329 if (D.IsUsingLTO(Args)) {
Rafael Espindolac5151542012-04-09 23:53:34 +00006330 CmdArgs.push_back("-plugin");
6331 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6332 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth700d4e42013-01-13 11:46:33 +00006333
6334 // Try to pass driver level flags relevant to LTO code generation down to
6335 // the plugin.
6336
Rafael Espindolab330e402013-08-20 22:12:08 +00006337 // Handle flags for selecting CPU variants.
6338 std::string CPU = getCPUName(Args, ToolChain.getTriple());
6339 if (!CPU.empty()) {
Chandler Carruth700d4e42013-01-13 11:46:33 +00006340 CmdArgs.push_back(
Rafael Espindolab330e402013-08-20 22:12:08 +00006341 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6342 CPU));
6343 }
Rafael Espindolac5151542012-04-09 23:53:34 +00006344 }
6345
Chandler Carruth700d4e42013-01-13 11:46:33 +00006346
Nick Lewyckye276cfc2012-08-17 03:39:16 +00006347 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6348 CmdArgs.push_back("--no-demangle");
6349
Rafael Espindolac1da9812010-11-07 20:14:31 +00006350 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6351
Eric Christopher6716d942012-11-29 18:51:05 +00006352 // Call these before we add the C++ ABI library.
Richard Smithc4dabad2012-11-05 22:04:41 +00006353 if (Sanitize.needsUbsanRt())
Hans Wennborg76b86c22013-07-18 20:29:38 +00006354 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
Richard Smith61a574f2013-03-20 23:49:07 +00006355 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev050309f2013-05-27 11:17:01 +00006356 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher6716d942012-11-29 18:51:05 +00006357 if (Sanitize.needsAsanRt())
6358 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6359 if (Sanitize.needsTsanRt())
6360 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00006361 if (Sanitize.needsMsanRt())
6362 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev050309f2013-05-27 11:17:01 +00006363 if (Sanitize.needsLsanRt())
6364 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Peter Collingbourne2eeed712013-08-07 22:47:34 +00006365 if (Sanitize.needsDfsanRt())
6366 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith8e1cee62012-10-25 02:14:12 +00006367
Chandler Carruth80a393e2013-06-24 09:38:45 +00006368 // The profile runtime also needs access to system libraries.
6369 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6370
Hans Wennborg76b86c22013-07-18 20:29:38 +00006371 if (D.CCCIsCXX() &&
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006372 !Args.hasArg(options::OPT_nostdlib) &&
6373 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola19706f82011-10-17 22:14:51 +00006374 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6375 !Args.hasArg(options::OPT_static);
6376 if (OnlyLibstdcxxStatic)
6377 CmdArgs.push_back("-Bstatic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006378 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola19706f82011-10-17 22:14:51 +00006379 if (OnlyLibstdcxxStatic)
6380 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006381 CmdArgs.push_back("-lm");
6382 }
6383
Rafael Espindola89414b32010-11-12 03:00:39 +00006384 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006385 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6386 if (Args.hasArg(options::OPT_static))
6387 CmdArgs.push_back("--start-group");
Nick Lewycky80df0252011-06-04 06:27:06 +00006388
Chandler Carruthdf96e022013-01-17 13:19:29 +00006389 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6390 if (OpenMP) {
6391 CmdArgs.push_back("-lgomp");
6392
6393 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6394 // librt. Most modern Linux platfroms require it, but some may not.
6395 CmdArgs.push_back("-lrt");
6396 }
6397
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006398 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola89414b32010-11-12 03:00:39 +00006399
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006400 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruthdf96e022013-01-17 13:19:29 +00006401 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006402 CmdArgs.push_back("-lpthread");
6403
6404 CmdArgs.push_back("-lc");
6405
6406 if (Args.hasArg(options::OPT_static))
6407 CmdArgs.push_back("--end-group");
6408 else
6409 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6410 }
Rafael Espindolafdda1712010-11-17 22:26:15 +00006411
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006412 if (!Args.hasArg(options::OPT_nostartfiles)) {
6413 const char *crtend;
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006414 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006415 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006416 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006417 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006418 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006419 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006420
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006421 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006422 if (!isAndroid)
6423 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006424 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006425 }
6426
Rafael Espindolac1da9812010-11-07 20:14:31 +00006427 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6428}
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006429
Chris Lattner38e317d2010-07-07 16:01:42 +00006430void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006431 const InputInfo &Output,
6432 const InputInfoList &Inputs,
6433 const ArgList &Args,
6434 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00006435 ArgStringList CmdArgs;
6436
6437 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6438 options::OPT_Xassembler);
6439
6440 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006441 CmdArgs.push_back(Output.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00006442
6443 for (InputInfoList::const_iterator
6444 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6445 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006446 CmdArgs.push_back(II.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00006447 }
6448
6449 const char *Exec =
Eli Friedman6d402dc2011-12-08 23:54:21 +00006450 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006451 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00006452}
6453
6454void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006455 const InputInfo &Output,
6456 const InputInfoList &Inputs,
6457 const ArgList &Args,
6458 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00006459 const Driver &D = getToolChain().getDriver();
6460 ArgStringList CmdArgs;
6461
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006462 if (Output.isFilename()) {
Chris Lattner38e317d2010-07-07 16:01:42 +00006463 CmdArgs.push_back("-o");
6464 CmdArgs.push_back(Output.getFilename());
6465 } else {
6466 assert(Output.isNothing() && "Invalid output.");
6467 }
6468
6469 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman6d402dc2011-12-08 23:54:21 +00006470 !Args.hasArg(options::OPT_nostartfiles)) {
6471 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6472 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6473 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6474 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6475 }
Chris Lattner38e317d2010-07-07 16:01:42 +00006476
6477 Args.AddAllArgs(CmdArgs, options::OPT_L);
6478 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6479 Args.AddAllArgs(CmdArgs, options::OPT_e);
6480
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006481 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00006482
Eli Friedman6d402dc2011-12-08 23:54:21 +00006483 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6484
Chris Lattner38e317d2010-07-07 16:01:42 +00006485 if (!Args.hasArg(options::OPT_nostdlib) &&
6486 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006487 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006488 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00006489 CmdArgs.push_back("-lm");
6490 }
Chris Lattner38e317d2010-07-07 16:01:42 +00006491 }
6492
6493 if (!Args.hasArg(options::OPT_nostdlib) &&
6494 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman6d402dc2011-12-08 23:54:21 +00006495 if (Args.hasArg(options::OPT_pthread))
6496 CmdArgs.push_back("-lpthread");
6497 CmdArgs.push_back("-lc");
6498 CmdArgs.push_back("-lCompilerRT-Generic");
6499 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6500 CmdArgs.push_back(
Eric Christopher27e2b982012-12-18 00:31:10 +00006501 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006502 }
6503
Eli Friedman6d402dc2011-12-08 23:54:21 +00006504 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006505 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00006506}
6507
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006508/// DragonFly Tools
6509
6510// For now, DragonFly Assemble does just about the same as for
6511// FreeBSD, but this may change soon.
6512void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006513 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00006514 const InputInfoList &Inputs,
6515 const ArgList &Args,
6516 const char *LinkingOutput) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006517 ArgStringList CmdArgs;
6518
6519 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6520 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006521 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006522 CmdArgs.push_back("--32");
6523
6524 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6525 options::OPT_Xassembler);
6526
6527 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006528 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006529
6530 for (InputInfoList::const_iterator
6531 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6532 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006533 CmdArgs.push_back(II.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006534 }
6535
6536 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006537 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006538 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006539}
6540
6541void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006542 const InputInfo &Output,
6543 const InputInfoList &Inputs,
6544 const ArgList &Args,
6545 const char *LinkingOutput) const {
John McCall8cfb7202013-04-11 22:55:55 +00006546 bool UseGCC47 = false;
Daniel Dunbaree788e72009-12-21 18:54:17 +00006547 const Driver &D = getToolChain().getDriver();
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006548 ArgStringList CmdArgs;
6549
John McCall8cfb7202013-04-11 22:55:55 +00006550 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6551 UseGCC47 = false;
6552
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006553 if (!D.SysRoot.empty())
6554 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6555
John McCall8cfb7202013-04-11 22:55:55 +00006556 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006557 if (Args.hasArg(options::OPT_static)) {
6558 CmdArgs.push_back("-Bstatic");
6559 } else {
John McCall8cfb7202013-04-11 22:55:55 +00006560 if (Args.hasArg(options::OPT_rdynamic))
6561 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006562 if (Args.hasArg(options::OPT_shared))
6563 CmdArgs.push_back("-Bshareable");
6564 else {
6565 CmdArgs.push_back("-dynamic-linker");
6566 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6567 }
John McCall8cfb7202013-04-11 22:55:55 +00006568 CmdArgs.push_back("--hash-style=both");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006569 }
6570
6571 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6572 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006573 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006574 CmdArgs.push_back("-m");
6575 CmdArgs.push_back("elf_i386");
6576 }
6577
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006578 if (Output.isFilename()) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006579 CmdArgs.push_back("-o");
6580 CmdArgs.push_back(Output.getFilename());
6581 } else {
6582 assert(Output.isNothing() && "Invalid output.");
6583 }
6584
6585 if (!Args.hasArg(options::OPT_nostdlib) &&
6586 !Args.hasArg(options::OPT_nostartfiles)) {
6587 if (!Args.hasArg(options::OPT_shared)) {
John McCall8cfb7202013-04-11 22:55:55 +00006588 if (Args.hasArg(options::OPT_pg))
6589 CmdArgs.push_back(Args.MakeArgString(
6590 getToolChain().GetFilePath("gcrt1.o")));
6591 else {
6592 if (Args.hasArg(options::OPT_pie))
6593 CmdArgs.push_back(Args.MakeArgString(
6594 getToolChain().GetFilePath("Scrt1.o")));
6595 else
6596 CmdArgs.push_back(Args.MakeArgString(
6597 getToolChain().GetFilePath("crt1.o")));
6598 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006599 }
John McCall8cfb7202013-04-11 22:55:55 +00006600 CmdArgs.push_back(Args.MakeArgString(
6601 getToolChain().GetFilePath("crti.o")));
6602 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6603 CmdArgs.push_back(Args.MakeArgString(
6604 getToolChain().GetFilePath("crtbeginS.o")));
6605 else
6606 CmdArgs.push_back(Args.MakeArgString(
6607 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006608 }
6609
6610 Args.AddAllArgs(CmdArgs, options::OPT_L);
6611 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6612 Args.AddAllArgs(CmdArgs, options::OPT_e);
6613
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006614 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006615
6616 if (!Args.hasArg(options::OPT_nostdlib) &&
6617 !Args.hasArg(options::OPT_nodefaultlibs)) {
6618 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6619 // rpaths
John McCall8cfb7202013-04-11 22:55:55 +00006620 if (UseGCC47)
6621 CmdArgs.push_back("-L/usr/lib/gcc47");
6622 else
6623 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006624
6625 if (!Args.hasArg(options::OPT_static)) {
John McCall8cfb7202013-04-11 22:55:55 +00006626 if (UseGCC47) {
6627 CmdArgs.push_back("-rpath");
6628 CmdArgs.push_back("/usr/lib/gcc47");
6629 } else {
6630 CmdArgs.push_back("-rpath");
6631 CmdArgs.push_back("/usr/lib/gcc44");
6632 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006633 }
6634
Hans Wennborg76b86c22013-07-18 20:29:38 +00006635 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006636 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola405861d2010-07-20 12:59:03 +00006637 CmdArgs.push_back("-lm");
6638 }
6639
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006640 if (Args.hasArg(options::OPT_pthread))
Mike Stump4d63f8b2009-10-31 20:11:46 +00006641 CmdArgs.push_back("-lpthread");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006642
6643 if (!Args.hasArg(options::OPT_nolibc)) {
6644 CmdArgs.push_back("-lc");
6645 }
6646
John McCall8cfb7202013-04-11 22:55:55 +00006647 if (UseGCC47) {
6648 if (Args.hasArg(options::OPT_static) ||
6649 Args.hasArg(options::OPT_static_libgcc)) {
6650 CmdArgs.push_back("-lgcc");
6651 CmdArgs.push_back("-lgcc_eh");
6652 } else {
6653 if (Args.hasArg(options::OPT_shared_libgcc)) {
6654 CmdArgs.push_back("-lgcc_pic");
6655 if (!Args.hasArg(options::OPT_shared))
6656 CmdArgs.push_back("-lgcc");
6657 } else {
6658 CmdArgs.push_back("-lgcc");
6659 CmdArgs.push_back("--as-needed");
6660 CmdArgs.push_back("-lgcc_pic");
6661 CmdArgs.push_back("--no-as-needed");
6662 }
6663 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006664 } else {
John McCall8cfb7202013-04-11 22:55:55 +00006665 if (Args.hasArg(options::OPT_shared)) {
6666 CmdArgs.push_back("-lgcc_pic");
6667 } else {
6668 CmdArgs.push_back("-lgcc");
6669 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006670 }
6671 }
6672
6673 if (!Args.hasArg(options::OPT_nostdlib) &&
6674 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall8cfb7202013-04-11 22:55:55 +00006675 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner38e317d2010-07-07 16:01:42 +00006676 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006677 getToolChain().GetFilePath("crtendS.o")));
John McCall8cfb7202013-04-11 22:55:55 +00006678 else
6679 CmdArgs.push_back(Args.MakeArgString(
6680 getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006681 CmdArgs.push_back(Args.MakeArgString(
John McCall8cfb7202013-04-11 22:55:55 +00006682 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006683 }
6684
Bill Wendling3f4be6f2011-06-27 19:15:03 +00006685 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00006686
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006687 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006688 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006689 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006690}
Michael J. Spencerff58e362010-08-21 21:55:07 +00006691
6692void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6693 const InputInfo &Output,
6694 const InputInfoList &Inputs,
6695 const ArgList &Args,
6696 const char *LinkingOutput) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006697 ArgStringList CmdArgs;
6698
6699 if (Output.isFilename()) {
Daniel Dunbare5a37f42010-09-17 00:45:02 +00006700 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6701 Output.getFilename()));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006702 } else {
6703 assert(Output.isNothing() && "Invalid output.");
6704 }
6705
6706 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg746974d2013-08-09 17:38:42 +00006707 !Args.hasArg(options::OPT_nostartfiles) &&
6708 !C.getDriver().IsCLMode()) {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006709 CmdArgs.push_back("-defaultlib:libcmt");
6710 }
6711
6712 CmdArgs.push_back("-nologo");
6713
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00006714 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
6715
6716 if (DLL) {
6717 CmdArgs.push_back(Args.MakeArgString("-dll"));
6718
6719 SmallString<128> ImplibName(Output.getFilename());
6720 llvm::sys::path::replace_extension(ImplibName, "lib");
6721 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
6722 ImplibName.str()));
6723 }
6724
Hans Wennborg3c4da0c2013-08-27 18:10:21 +00006725 if (getToolChain().getDriver().getOrParseSanitizerArgs(Args).needsAsanRt()) {
Hans Wennborg324cc032013-08-28 17:36:07 +00006726 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborg2ddffa12013-08-30 10:50:52 +00006727 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg3c4da0c2013-08-27 18:10:21 +00006728 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00006729 llvm::sys::path::append(LibSanitizer, "lib", "windows");
6730 if (DLL) {
Timur Iskhodzhanove4814132013-09-11 11:45:31 +00006731 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00006732 } else {
6733 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
6734 }
6735 // FIXME: Handle 64-bit.
Hans Wennborg3c4da0c2013-08-27 18:10:21 +00006736 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
6737 }
6738
Michael J. Spencera2284f52012-06-18 16:56:04 +00006739 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg5db95272013-08-13 23:38:57 +00006740 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencera2284f52012-06-18 16:56:04 +00006741
6742 // Add filenames immediately.
6743 for (InputInfoList::const_iterator
6744 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6745 if (it->isFilename())
6746 CmdArgs.push_back(it->getFilename());
Hans Wennborg2388b772013-08-14 01:24:35 +00006747 else
6748 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencera2284f52012-06-18 16:56:04 +00006749 }
Michael J. Spencerff58e362010-08-21 21:55:07 +00006750
6751 const char *Exec =
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006752 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006753 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6754}
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006755
6756void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
6757 const InputInfo &Output,
6758 const InputInfoList &Inputs,
6759 const ArgList &Args,
6760 const char *LinkingOutput) const {
6761 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
6762}
6763
Hans Wennborgdc40bf92013-09-20 18:16:35 +00006764// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
6765// If one cannot be found, return FallbackName.
6766// We do this special search to prevent clang-cl from falling back onto itself
6767// if it's available as cl.exe on the path.
6768static std::string FindFallback(const char *FallbackName,
6769 const char *ClangProgramPath) {
6770 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
6771 if (!OptPath.hasValue())
6772 return FallbackName;
6773
6774#ifdef LLVM_ON_WIN32
6775 const StringRef PathSeparators = ";";
6776#else
6777 const StringRef PathSeparators = ":";
6778#endif
6779
6780 SmallVector<StringRef, 8> PathSegments;
6781 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
6782
6783 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
6784 const StringRef &PathSegment = PathSegments[i];
6785 if (PathSegment.empty())
6786 continue;
6787
6788 SmallString<128> FilePath(PathSegment);
6789 llvm::sys::path::append(FilePath, FallbackName);
6790 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
6791 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
6792 return FilePath.str();
6793 }
6794
6795 return FallbackName;
6796}
6797
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006798Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
6799 const InputInfo &Output,
6800 const InputInfoList &Inputs,
6801 const ArgList &Args,
6802 const char *LinkingOutput) const {
6803 ArgStringList CmdArgs;
Hans Wennborg1413d622013-09-24 17:36:21 +00006804 CmdArgs.push_back("/nologo");
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006805 CmdArgs.push_back("/c"); // Compile only.
6806 CmdArgs.push_back("/W0"); // No warnings.
6807
6808 // The goal is to be able to invoke this tool correctly based on
6809 // any flag accepted by clang-cl.
6810
6811 // These are spelled the same way in clang and cl.exe,.
6812 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
6813 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborga8ffc162013-09-24 18:17:21 +00006814
6815 // Optimization level.
6816 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
6817 if (A->getOption().getID() == options::OPT_O0) {
6818 CmdArgs.push_back("/Od");
6819 } else {
6820 StringRef OptLevel = A->getValue();
6821 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
6822 A->render(Args, CmdArgs);
6823 else if (OptLevel == "3")
6824 CmdArgs.push_back("/Ox");
6825 }
6826 }
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006827
6828 // Flags for which clang-cl have an alias.
6829 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
6830
6831 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
6832 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
6833 : "/GR-");
6834 if (Args.hasArg(options::OPT_fsyntax_only))
6835 CmdArgs.push_back("/Zs");
6836
Hans Wennborg4fe475a2013-09-27 17:54:18 +00006837 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
6838 for (size_t I = 0, E = Includes.size(); I != E; ++I)
6839 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
6840
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006841 // Flags that can simply be passed through.
6842 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
6843 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
6844
6845 // The order of these flags is relevant, so pick the last one.
6846 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
6847 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
6848 A->render(Args, CmdArgs);
6849
6850
6851 // Input filename.
6852 assert(Inputs.size() == 1);
6853 const InputInfo &II = Inputs[0];
6854 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
6855 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
6856 if (II.isFilename())
6857 CmdArgs.push_back(II.getFilename());
6858 else
6859 II.getInputArg().renderAsInput(Args, CmdArgs);
6860
6861 // Output filename.
6862 assert(Output.getType() == types::TY_Object);
6863 const char *Fo = Args.MakeArgString(std::string("/Fo") +
6864 Output.getFilename());
6865 CmdArgs.push_back(Fo);
6866
Hans Wennborgdc40bf92013-09-20 18:16:35 +00006867 const Driver &D = getToolChain().getDriver();
6868 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006869
Hans Wennborgdc40bf92013-09-20 18:16:35 +00006870 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006871}
Robert Lytton4e490e22013-10-11 10:29:40 +00006872
6873
6874/// XCore Tools
6875// We pass assemble and link construction to the xcc tool.
6876
6877void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6878 const InputInfo &Output,
6879 const InputInfoList &Inputs,
6880 const ArgList &Args,
6881 const char *LinkingOutput) const {
6882 ArgStringList CmdArgs;
6883
6884 CmdArgs.push_back("-o");
6885 CmdArgs.push_back(Output.getFilename());
6886
6887 CmdArgs.push_back("-c");
6888
6889 if (Args.hasArg(options::OPT_g_Group)) {
6890 CmdArgs.push_back("-g");
6891 }
6892
6893 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6894 options::OPT_Xassembler);
6895
6896 for (InputInfoList::const_iterator
6897 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6898 const InputInfo &II = *it;
6899 CmdArgs.push_back(II.getFilename());
6900 }
6901
6902 const char *Exec =
6903 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6904 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6905}
6906
6907void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
6908 const InputInfo &Output,
6909 const InputInfoList &Inputs,
6910 const ArgList &Args,
6911 const char *LinkingOutput) const {
6912 ArgStringList CmdArgs;
6913
6914 if (Output.isFilename()) {
6915 CmdArgs.push_back("-o");
6916 CmdArgs.push_back(Output.getFilename());
6917 } else {
6918 assert(Output.isNothing() && "Invalid output.");
6919 }
6920
6921 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6922
6923 const char *Exec =
6924 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6925 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6926}