blob: ffaac21b4ed53c4f60d0769dcd7c283dccb6be44 [file] [log] [blame]
Nick Lewyckye3365aa2010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000012#include "ToolChains.h"
13#include "clang/Basic/ObjCRuntime.h"
Kevin Enderby02341792013-01-17 21:38:06 +000014#include "clang/Basic/Version.h"
Daniel Dunbar1d460332009-03-18 10:01:51 +000015#include "clang/Driver/Action.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000016#include "clang/Driver/Compilation.h"
Daniel Dunbaree848a72009-10-29 02:39:57 +000017#include "clang/Driver/Driver.h"
18#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000019#include "clang/Driver/Job.h"
Daniel Dunbar265e9ef2009-11-19 04:25:22 +000020#include "clang/Driver/Options.h"
Alexey Samsonov1b8f12d2013-08-19 09:14:21 +000021#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000022#include "clang/Driver/ToolChain.h"
Daniel Dunbar871adcf2009-03-18 07:06:02 +000023#include "clang/Driver/Util.h"
Daniel Dunbar88137642009-09-09 22:32:48 +000024#include "llvm/ADT/SmallString.h"
Hans Wennborgdc40bf92013-09-20 18:16:35 +000025#include "llvm/ADT/StringExtras.h"
Douglas Gregor55d3f7a2009-10-29 00:41:01 +000026#include "llvm/ADT/StringSwitch.h"
Daniel Dunbar5b750fe2009-09-09 22:32:34 +000027#include "llvm/ADT/Twine.h"
Reid Klecknerb1e25a12013-06-14 17:17:23 +000028#include "llvm/Option/Arg.h"
29#include "llvm/Option/ArgList.h"
30#include "llvm/Option/Option.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000031#include "llvm/Support/ErrorHandling.h"
Michael J. Spencer32bef4e2011-01-10 02:34:13 +000032#include "llvm/Support/FileSystem.h"
Daniel Dunbar02633b52009-03-26 16:23:12 +000033#include "llvm/Support/Format.h"
Michael J. Spencer03013fa2010-11-29 18:12:39 +000034#include "llvm/Support/Host.h"
Hans Wennborgdc40bf92013-09-20 18:16:35 +000035#include "llvm/Support/Path.h"
Rafael Espindola8db7ec02013-06-25 14:29:51 +000036#include "llvm/Support/Program.h"
Michael J. Spencer03013fa2010-11-29 18:12:39 +000037#include "llvm/Support/Process.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000038#include "llvm/Support/raw_ostream.h"
Reid Klecknerb1e25a12013-06-14 17:17:23 +000039#include <sys/stat.h>
Daniel Dunbar871adcf2009-03-18 07:06:02 +000040
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000041using namespace clang::driver;
42using namespace clang::driver::tools;
Chris Lattner5f9e2722011-07-23 10:55:15 +000043using namespace clang;
Reid Klecknerb1e25a12013-06-14 17:17:23 +000044using namespace llvm::opt;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000045
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +000046/// CheckPreprocessingOptions - Perform some validation of preprocessing
47/// arguments that is shared with gcc.
48static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
49 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Hans Wennborg76b86c22013-07-18 20:29:38 +000050 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP())
Chris Lattner5f9e2722011-07-23 10:55:15 +000051 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +000052 << A->getAsString(Args) << "-E";
53}
54
Daniel Dunbare2fd6642009-09-10 01:21:12 +000055/// CheckCodeGenerationOptions - Perform some validation of code generation
56/// arguments that is shared with gcc.
57static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
58 // In gcc, only ARM checks this, but it seems reasonable to check universally.
59 if (Args.hasArg(options::OPT_static))
60 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
61 options::OPT_mdynamic_no_pic))
Chris Lattner5f9e2722011-07-23 10:55:15 +000062 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbare2fd6642009-09-10 01:21:12 +000063 << A->getAsString(Args) << "-static";
64}
65
Chris Lattner3edbeb72010-03-29 17:55:58 +000066// Quote target names for inclusion in GNU Make dependency files.
67// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner5f9e2722011-07-23 10:55:15 +000068static void QuoteTarget(StringRef Target,
69 SmallVectorImpl<char> &Res) {
Chris Lattner3edbeb72010-03-29 17:55:58 +000070 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
71 switch (Target[i]) {
72 case ' ':
73 case '\t':
74 // Escape the preceding backslashes
75 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
76 Res.push_back('\\');
77
78 // Escape the space/tab
79 Res.push_back('\\');
80 break;
81 case '$':
82 Res.push_back('$');
83 break;
84 case '#':
85 Res.push_back('\\');
86 break;
87 default:
88 break;
89 }
90
91 Res.push_back(Target[i]);
92 }
93}
94
Bill Wendling3d717152012-03-12 22:10:06 +000095static void addDirectoryList(const ArgList &Args,
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +000096 ArgStringList &CmdArgs,
97 const char *ArgName,
Bill Wendling3d717152012-03-12 22:10:06 +000098 const char *EnvVar) {
99 const char *DirList = ::getenv(EnvVar);
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000100 bool CombinedArg = false;
101
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000102 if (!DirList)
103 return; // Nothing to do.
104
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000105 StringRef Name(ArgName);
106 if (Name.equals("-I") || Name.equals("-L"))
107 CombinedArg = true;
108
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000109 StringRef Dirs(DirList);
110 if (Dirs.empty()) // Empty string should not add '.'.
111 return;
112
113 StringRef::size_type Delim;
Rafael Espindola8db7ec02013-06-25 14:29:51 +0000114 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000115 if (Delim == 0) { // Leading colon.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000116 if (CombinedArg) {
117 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
118 } else {
119 CmdArgs.push_back(ArgName);
120 CmdArgs.push_back(".");
121 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000122 } else {
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000123 if (CombinedArg) {
124 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
125 } else {
126 CmdArgs.push_back(ArgName);
127 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
128 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000129 }
Nico Weber09c5c392012-03-19 15:00:03 +0000130 Dirs = Dirs.substr(Delim + 1);
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000131 }
132
133 if (Dirs.empty()) { // Trailing colon.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000134 if (CombinedArg) {
135 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
136 } else {
137 CmdArgs.push_back(ArgName);
138 CmdArgs.push_back(".");
139 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000140 } else { // Add the last path.
Chad Rosier89aa2ce2012-10-30 21:42:09 +0000141 if (CombinedArg) {
142 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
143 } else {
144 CmdArgs.push_back(ArgName);
145 CmdArgs.push_back(Args.MakeArgString(Dirs));
146 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000147 }
148}
149
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000150static void AddLinkerInputs(const ToolChain &TC,
151 const InputInfoList &Inputs, const ArgList &Args,
152 ArgStringList &CmdArgs) {
153 const Driver &D = TC.getDriver();
154
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000155 // Add extra linker input arguments which are not treated as inputs
156 // (constructed via -Xarch_).
157 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
158
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000159 for (InputInfoList::const_iterator
160 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
161 const InputInfo &II = *it;
162
163 if (!TC.HasNativeLLVMSupport()) {
164 // Don't try to pass LLVM inputs unless we have native support.
165 if (II.getType() == types::TY_LLVM_IR ||
166 II.getType() == types::TY_LTO_IR ||
167 II.getType() == types::TY_LLVM_BC ||
168 II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000169 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000170 << TC.getTripleString();
171 }
172
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000173 // Add filenames immediately.
174 if (II.isFilename()) {
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000175 CmdArgs.push_back(II.getFilename());
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000176 continue;
177 }
178
179 // Otherwise, this is a linker input argument.
180 const Arg &A = II.getInputArg();
181
182 // Handle reserved library options.
183 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +0000184 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Sen7433fed2010-09-17 18:39:08 +0000185 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
186 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbare5a37f42010-09-17 00:45:02 +0000187 } else
188 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000189 }
Bill Wendlingbdb8f3c2012-03-12 21:22:35 +0000190
191 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendling3d717152012-03-12 22:10:06 +0000192 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar2008fee2010-09-17 00:24:54 +0000193}
194
John McCallf85e1932011-06-15 23:02:42 +0000195/// \brief Determine whether Objective-C automated reference counting is
196/// enabled.
197static bool isObjCAutoRefCount(const ArgList &Args) {
198 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
199}
200
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000201/// \brief Determine whether we are linking the ObjC runtime.
202static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilsona7635f12012-08-07 19:58:00 +0000203 if (isObjCAutoRefCount(Args)) {
204 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000205 return true;
Bob Wilsona7635f12012-08-07 19:58:00 +0000206 }
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000207 return Args.hasArg(options::OPT_fobjc_link_runtime);
208}
209
Rafael Espindoladb3f24a2011-06-02 18:58:46 +0000210static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling3f4be6f2011-06-27 19:15:03 +0000211 ArgStringList &CmdArgs,
212 llvm::Triple Triple) {
213 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
214 Args.hasArg(options::OPT_fprofile_generate) ||
215 Args.hasArg(options::OPT_fcreate_profile) ||
216 Args.hasArg(options::OPT_coverage)))
217 return;
218
219 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
220 // the link line. We cannot do the same thing because unlike gcov there is a
221 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
222 // not supported by old linkers.
Benjamin Kramerf2db04c2011-11-07 16:02:25 +0000223 std::string ProfileRT =
224 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling3f4be6f2011-06-27 19:15:03 +0000225
Bill Wendling3f4be6f2011-06-27 19:15:03 +0000226 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindoladb3f24a2011-06-02 18:58:46 +0000227}
228
Michael J. Spencer91e06da2012-10-19 22:37:06 +0000229static bool forwardToGCC(const Option &O) {
Reid Kleckner4cd90df2013-06-19 15:09:06 +0000230 // Don't forward inputs from the original command line. They are added from
231 // InputInfoList.
Richard Smithe40bc4b2013-06-20 01:33:59 +0000232 return O.getKind() != Option::InputClass &&
Michael J. Spencer91e06da2012-10-19 22:37:06 +0000233 !O.hasFlag(options::DriverOption) &&
234 !O.hasFlag(options::LinkerInput);
235}
236
Peter Collingbourne54db68b2011-11-06 00:40:05 +0000237void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier9d718632013-01-24 19:14:47 +0000238 const JobAction &JA,
Peter Collingbourne54db68b2011-11-06 00:40:05 +0000239 const Driver &D,
Douglas Gregordf91ef32009-04-18 00:34:01 +0000240 const ArgList &Args,
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000241 ArgStringList &CmdArgs,
242 const InputInfo &Output,
243 const InputInfoList &Inputs) const {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000244 Arg *A;
Daniel Dunbar3a183d32009-06-08 21:48:20 +0000245
Daniel Dunbar88a3d6c2009-09-10 01:21:05 +0000246 CheckPreprocessingOptions(D, Args);
247
248 Args.AddLastArg(CmdArgs, options::OPT_C);
249 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar3a183d32009-06-08 21:48:20 +0000250
251 // Handle dependency file generation.
Daniel Dunbar9eb93b02010-12-08 21:33:40 +0000252 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000253 (A = Args.getLastArg(options::OPT_MD)) ||
254 (A = Args.getLastArg(options::OPT_MMD))) {
255 // Determine the output location.
256 const char *DepFile;
Benjamin Kramer99c72082012-09-26 19:01:49 +0000257 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000258 DepFile = MF->getValue();
Chad Rosier9d718632013-01-24 19:14:47 +0000259 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer99c72082012-09-26 19:01:49 +0000260 } else if (Output.getType() == types::TY_Dependencies) {
261 DepFile = Output.getFilename();
Daniel Dunbarb827a052009-11-19 03:26:40 +0000262 } else if (A->getOption().matches(options::OPT_M) ||
263 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000264 DepFile = "-";
265 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +0000266 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier9d718632013-01-24 19:14:47 +0000267 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000268 }
269 CmdArgs.push_back("-dependency-file");
270 CmdArgs.push_back(DepFile);
271
Chris Lattner3edbeb72010-03-29 17:55:58 +0000272 // Add a default target if one wasn't specified.
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000273 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
274 const char *DepTarget;
275
276 // If user provided -o, that is the dependency target, except
277 // when we are only generating a dependency file.
278 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
279 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000280 DepTarget = OutputOpt->getValue();
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000281 } else {
282 // Otherwise derive from the base input.
283 //
284 // FIXME: This should use the computed output file location.
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000285 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencer472ccff2010-12-18 00:19:12 +0000286 llvm::sys::path::replace_extension(P, "o");
287 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000288 }
289
290 CmdArgs.push_back("-MT");
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000291 SmallString<128> Quoted;
Chris Lattner3edbeb72010-03-29 17:55:58 +0000292 QuoteTarget(DepTarget, Quoted);
293 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000294 }
295
Daniel Dunbarb827a052009-11-19 03:26:40 +0000296 if (A->getOption().matches(options::OPT_M) ||
297 A->getOption().matches(options::OPT_MD))
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000298 CmdArgs.push_back("-sys-header-deps");
299 }
300
Peter Collingbournebb527862011-07-12 19:35:15 +0000301 if (Args.hasArg(options::OPT_MG)) {
302 if (!A || A->getOption().matches(options::OPT_MD) ||
303 A->getOption().matches(options::OPT_MMD))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000304 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbournebb527862011-07-12 19:35:15 +0000305 CmdArgs.push_back("-MG");
306 }
307
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000308 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000309
310 // Convert all -MQ <target> args to -MT <quoted target>
311 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
312 options::OPT_MQ),
313 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000314 const Arg *A = *it;
315 A->claim();
Chris Lattner3edbeb72010-03-29 17:55:58 +0000316
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000317 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattner3edbeb72010-03-29 17:55:58 +0000318 CmdArgs.push_back("-MT");
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000319 SmallString<128> Quoted;
Richard Smith1d489cf2012-11-01 04:30:05 +0000320 QuoteTarget(A->getValue(), Quoted);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000321 CmdArgs.push_back(Args.MakeArgString(Quoted));
322
323 // -MT flag - no change
324 } else {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +0000325 A->render(Args, CmdArgs);
Chris Lattner3edbeb72010-03-29 17:55:58 +0000326 }
327 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000328
Douglas Gregordf91ef32009-04-18 00:34:01 +0000329 // Add -i* options, and automatically translate to
330 // -include-pch/-include-pth for transparent PCH support. It's
331 // wonky, but we include looking for .gch so we can support seamless
332 // replacement into a build system already set up to be generating
333 // .gch files.
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000334 bool RenderedImplicitInclude = false;
Daniel Dunbarcdd96862009-11-25 11:53:23 +0000335 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
336 ie = Args.filtered_end(); it != ie; ++it) {
337 const Arg *A = it;
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000338
339 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000340 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
341 RenderedImplicitInclude = true;
342
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +0000343 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000344 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000345
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000346 bool FoundPTH = false;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000347 bool FoundPCH = false;
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000348 SmallString<128> P(A->getValue());
349 // We want the files to have a name like foo.h.pch. Add a dummy extension
350 // so that replace_extension does the right thing.
351 P += ".dummy";
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000352 if (UsePCH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000353 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola829e88d2013-06-25 14:48:00 +0000354 if (llvm::sys::fs::exists(P.str()))
Douglas Gregordf91ef32009-04-18 00:34:01 +0000355 FoundPCH = true;
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000356 }
357
Douglas Gregordf91ef32009-04-18 00:34:01 +0000358 if (!FoundPCH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000359 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola829e88d2013-06-25 14:48:00 +0000360 if (llvm::sys::fs::exists(P.str()))
Douglas Gregordf91ef32009-04-18 00:34:01 +0000361 FoundPTH = true;
Mike Stump1eb44332009-09-09 15:08:12 +0000362 }
363
Douglas Gregordf91ef32009-04-18 00:34:01 +0000364 if (!FoundPCH && !FoundPTH) {
Rafael Espindolaf8edb992013-06-25 15:03:59 +0000365 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola829e88d2013-06-25 14:48:00 +0000366 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbar0ebd9322009-10-15 20:02:44 +0000367 FoundPCH = UsePCH;
368 FoundPTH = !UsePCH;
Douglas Gregordf91ef32009-04-18 00:34:01 +0000369 }
Douglas Gregordf91ef32009-04-18 00:34:01 +0000370 }
371
372 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000373 if (IsFirstImplicitInclude) {
374 A->claim();
375 if (UsePCH)
376 CmdArgs.push_back("-include-pch");
377 else
378 CmdArgs.push_back("-include-pth");
379 CmdArgs.push_back(Args.MakeArgString(P.str()));
380 continue;
381 } else {
382 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000383 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis990142a2010-09-30 16:53:47 +0000384 << P.str() << A->getAsString(Args);
385 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000386 }
387 }
388
389 // Not translated, render as usual.
390 A->claim();
391 A->render(Args, CmdArgs);
392 }
393
394 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor65e02fa2011-07-28 04:45:53 +0000395 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
396 options::OPT_index_header_map);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000397
398 // Add -Wp, and -Xassembler if using the preprocessor.
399
400 // FIXME: There is a very unfortunate problem here, some troubled
401 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
402 // really support that we would have to parse and then translate
403 // those options. :(
404 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
405 options::OPT_Xpreprocessor);
Daniel Dunbar607d7f62009-10-29 01:53:44 +0000406
407 // -I- is a deprecated GCC feature, reject it.
408 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner5f9e2722011-07-23 10:55:15 +0000409 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000410
411 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
412 // -isysroot to the CC1 invocation.
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000413 StringRef sysroot = C.getSysRoot();
414 if (sysroot != "") {
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000415 if (!Args.hasArg(options::OPT_isysroot)) {
416 CmdArgs.push_back("-isysroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +0000417 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruthfeee58c2010-10-20 07:00:47 +0000418 }
419 }
Douglas Gregor2a060852013-02-07 00:21:12 +0000420
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000421 // Parse additional include paths from environment variables.
Chandler Carruthb5870e72011-11-04 07:12:58 +0000422 // FIXME: We should probably sink the logic for handling these from the
423 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000424 // CPATH - included following the user specified includes (but prior to
425 // builtin and standard includes).
Bill Wendling3d717152012-03-12 22:10:06 +0000426 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000427 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendling3d717152012-03-12 22:10:06 +0000428 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000429 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendling3d717152012-03-12 22:10:06 +0000430 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000431 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendling3d717152012-03-12 22:10:06 +0000432 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer47adebe2011-09-22 21:41:16 +0000433 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendling3d717152012-03-12 22:10:06 +0000434 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth88491fc2011-11-04 07:12:53 +0000435
Chandler Carruth88491fc2011-11-04 07:12:53 +0000436 // Add C++ include arguments, if needed.
Chandler Carrutha4614422011-11-04 07:43:33 +0000437 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth7ffa0322011-11-04 07:34:47 +0000438 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carruth7d7e9f92011-11-05 20:17:13 +0000439
440 // Add system include arguments.
441 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbarc21c4852009-04-08 23:54:23 +0000442}
443
Daniel Dunbar1d65e4b2009-09-10 22:59:51 +0000444/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbar728a5122009-09-10 06:49:20 +0000445/// CPU.
446//
447// FIXME: This is redundant with -mcpu, why does LLVM use this.
448// FIXME: tblgen this, or kill it!
Chris Lattner5f9e2722011-07-23 10:55:15 +0000449static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosierae1aee62011-10-07 17:48:56 +0000450 return llvm::StringSwitch<const char *>(CPU)
Tim Northover4889a1f2013-06-13 15:02:46 +0000451 .Case("strongarm", "v4")
Chad Rosierae1aee62011-10-07 17:48:56 +0000452 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
453 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
454 .Cases("arm920", "arm920t", "arm922t", "v4t")
455 .Cases("arm940t", "ep9312","v4t")
456 .Cases("arm10tdmi", "arm1020t", "v5")
457 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
458 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
459 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
460 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
461 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
462 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonfc553452013-03-04 22:37:46 +0000463 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin5df40452013-09-13 17:02:54 +0000464 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "v7")
465 .Cases("cortex-r4", "cortex-r5", "v7r")
Bob Wilson57f6d192012-03-21 17:19:12 +0000466 .Case("cortex-m0", "v6m")
Bob Wilson2503ebd2013-03-04 22:37:49 +0000467 .Case("cortex-m3", "v7m")
468 .Case("cortex-m4", "v7em")
Bob Wilson336bfa32012-09-29 23:52:50 +0000469 .Case("cortex-a9-mp", "v7f")
470 .Case("swift", "v7s")
Bernard Ogdenc4272492013-10-24 18:32:36 +0000471 .Cases("cortex-a53", "cortex-a57", "v8")
Chad Rosierae1aee62011-10-07 17:48:56 +0000472 .Default("");
Daniel Dunbar728a5122009-09-10 06:49:20 +0000473}
474
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000475/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
476//
477// FIXME: tblgen this.
478static std::string getARMTargetCPU(const ArgList &Args,
479 const llvm::Triple &Triple) {
480 // FIXME: Warn on inconsistent use of -mcpu and -march.
481
482 // If we have -mcpu=, use that.
483 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000484 StringRef MCPU = A->getValue();
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000485 // Handle -mcpu=native.
486 if (MCPU == "native")
487 return llvm::sys::getHostCPUName();
488 else
489 return MCPU;
490 }
491
492 StringRef MArch;
493 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
494 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smith1d489cf2012-11-01 04:30:05 +0000495 MArch = A->getValue();
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000496 } else {
497 // Otherwise, use the Arch from the triple.
498 MArch = Triple.getArchName();
499 }
500
501 // Handle -march=native.
502 std::string NativeMArch;
503 if (MArch == "native") {
504 std::string CPU = llvm::sys::getHostCPUName();
505 if (CPU != "generic") {
506 // Translate the native cpu into the architecture. The switch below will
507 // then chose the minimum cpu for that arch.
508 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
509 MArch = NativeMArch;
510 }
511 }
512
513 return llvm::StringSwitch<const char *>(MArch)
514 .Cases("armv2", "armv2a","arm2")
515 .Case("armv3", "arm6")
516 .Case("armv3m", "arm7m")
Tim Northover4889a1f2013-06-13 15:02:46 +0000517 .Case("armv4", "strongarm")
518 .Case("armv4t", "arm7tdmi")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000519 .Cases("armv5", "armv5t", "arm10tdmi")
520 .Cases("armv5e", "armv5te", "arm1022e")
521 .Case("armv5tej", "arm926ej-s")
522 .Cases("armv6", "armv6k", "arm1136jf-s")
523 .Case("armv6j", "arm1136j-s")
524 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
525 .Case("armv6t2", "arm1156t2-s")
Bob Wilson2503ebd2013-03-04 22:37:49 +0000526 .Cases("armv6m", "armv6-m", "cortex-m0")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000527 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilson2503ebd2013-03-04 22:37:49 +0000528 .Cases("armv7em", "armv7e-m", "cortex-m4")
Bob Wilson336bfa32012-09-29 23:52:50 +0000529 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
530 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000531 .Cases("armv7r", "armv7-r", "cortex-r4")
532 .Cases("armv7m", "armv7-m", "cortex-m3")
Joey Gouly4ec8d5b2013-06-26 17:19:48 +0000533 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000534 .Case("ep9312", "ep9312")
535 .Case("iwmmxt", "iwmmxt")
536 .Case("xscale", "xscale")
Tim Northover4889a1f2013-06-13 15:02:46 +0000537 // If all else failed, return the most base CPU with thumb interworking
538 // supported by LLVM.
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000539 .Default("arm7tdmi");
540}
541
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000542// FIXME: Move to target hook.
543static bool isSignedCharDefault(const llvm::Triple &Triple) {
544 switch (Triple.getArch()) {
545 default:
546 return true;
547
Tim Northoverc264e162013-01-31 12:13:10 +0000548 case llvm::Triple::aarch64:
Jim Grosbach5b4e7b12011-05-24 15:40:46 +0000549 case llvm::Triple::arm:
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000550 case llvm::Triple::ppc:
551 case llvm::Triple::ppc64:
Bob Wilson905c45f2011-10-14 05:03:44 +0000552 if (Triple.isOSDarwin())
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000553 return true;
554 return false;
Ulrich Weigandb8409212013-05-06 16:26:41 +0000555
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000556 case llvm::Triple::ppc64le:
Ulrich Weigandb8409212013-05-06 16:26:41 +0000557 case llvm::Triple::systemz:
Robert Lytton5f15f4d2013-08-13 09:43:10 +0000558 case llvm::Triple::xcore:
Ulrich Weigandb8409212013-05-06 16:26:41 +0000559 return false;
Daniel Dunbar1f95e652009-11-17 06:37:03 +0000560 }
561}
562
Robert Lytton5f15f4d2013-08-13 09:43:10 +0000563static bool isNoCommonDefault(const llvm::Triple &Triple) {
564 switch (Triple.getArch()) {
565 default:
566 return false;
567
568 case llvm::Triple::xcore:
569 return true;
570 }
571}
572
Chad Rosier99317272012-04-04 20:51:35 +0000573// Handle -mfpu=.
574//
575// FIXME: Centralize feature selection, defaulting shouldn't be also in the
576// frontend target.
Amara Emersonfe7ed042013-10-01 10:20:54 +0000577static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
578 const ArgList &Args,
579 std::vector<const char *> &Features) {
580 StringRef FPU = A->getValue();
581 if (FPU == "fp-armv8") {
582 Features.push_back("+fp-armv8");
583 } else if (FPU == "neon-fp-armv8") {
584 Features.push_back("+fp-armv8");
585 Features.push_back("+neon");
586 } else if (FPU == "crypto-neon-fp-armv8") {
587 Features.push_back("+fp-armv8");
588 Features.push_back("+neon");
589 Features.push_back("+crypto");
590 } else if (FPU == "neon") {
591 Features.push_back("+neon");
592 } else if (FPU == "none") {
593 Features.push_back("-fp-armv8");
594 Features.push_back("-crypto");
595 Features.push_back("-neon");
596 } else
597 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
598}
599
Silviu Baranga1db2e272013-10-21 10:54:53 +0000600// Handle -mhwdiv=.
601static void getARMHWDivFeatures(const Driver &D, const Arg *A,
602 const ArgList &Args,
603 std::vector<const char *> &Features) {
604 StringRef HWDiv = A->getValue();
605 if (HWDiv == "arm") {
606 Features.push_back("+hwdiv-arm");
607 Features.push_back("-hwdiv");
608 } else if (HWDiv == "thumb") {
609 Features.push_back("-hwdiv-arm");
610 Features.push_back("+hwdiv");
611 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
612 Features.push_back("+hwdiv-arm");
613 Features.push_back("+hwdiv");
614 } else if (HWDiv == "none") {
615 Features.push_back("-hwdiv-arm");
616 Features.push_back("-hwdiv");
617 } else
618 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
619}
620
Amara Emersonfe7ed042013-10-01 10:20:54 +0000621// Handle -mfpu=.
622//
623// FIXME: Centralize feature selection, defaulting shouldn't be also in the
624// frontend target.
625static void getARMFPUFeatures(const Driver &D, const Arg *A,
626 const ArgList &Args,
627 std::vector<const char *> &Features) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000628 StringRef FPU = A->getValue();
Chad Rosier99317272012-04-04 20:51:35 +0000629
630 // Set the target features based on the FPU.
631 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
632 // Disable any default FPU support.
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000633 Features.push_back("-vfp2");
634 Features.push_back("-vfp3");
635 Features.push_back("-neon");
Chad Rosier99317272012-04-04 20:51:35 +0000636 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000637 Features.push_back("+vfp3");
638 Features.push_back("+d16");
639 Features.push_back("-neon");
Chad Rosier99317272012-04-04 20:51:35 +0000640 } else if (FPU == "vfp") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000641 Features.push_back("+vfp2");
642 Features.push_back("-neon");
Chad Rosier99317272012-04-04 20:51:35 +0000643 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000644 Features.push_back("+vfp3");
645 Features.push_back("-neon");
Joey Goulycbed3bf2013-06-27 13:19:54 +0000646 } else if (FPU == "fp-armv8") {
Joey Gouly2b33b7e2013-09-13 13:48:33 +0000647 Features.push_back("+fp-armv8");
Bernard Ogdenf779e652013-10-24 18:32:51 +0000648 Features.push_back("-neon");
649 Features.push_back("-crypto");
Joey Goulycbed3bf2013-06-27 13:19:54 +0000650 } else if (FPU == "neon-fp-armv8") {
Joey Gouly2b33b7e2013-09-13 13:48:33 +0000651 Features.push_back("+fp-armv8");
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000652 Features.push_back("+neon");
Bernard Ogdenf779e652013-10-24 18:32:51 +0000653 Features.push_back("-crypto");
Amara Emersoncdc532c2013-09-19 13:54:03 +0000654 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersoncdc532c2013-09-19 13:54:03 +0000655 Features.push_back("+fp-armv8");
Bernard Ogdenf779e652013-10-24 18:32:51 +0000656 Features.push_back("+neon");
657 Features.push_back("+crypto");
Chad Rosier99317272012-04-04 20:51:35 +0000658 } else if (FPU == "neon") {
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000659 Features.push_back("+neon");
Amara Emersonfe7ed042013-10-01 10:20:54 +0000660 } else if (FPU == "none") {
661 Features.push_back("-vfp2");
662 Features.push_back("-vfp3");
663 Features.push_back("-vfp4");
664 Features.push_back("-fp-armv8");
665 Features.push_back("-crypto");
666 Features.push_back("-neon");
Chad Rosier99317272012-04-04 20:51:35 +0000667 } else
668 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
669}
670
Anton Korobeynikove2571792012-04-09 13:38:30 +0000671// Select the float ABI as determined by -msoft-float, -mhard-float, and
672// -mfloat-abi=.
673static StringRef getARMFloatABI(const Driver &D,
674 const ArgList &Args,
675 const llvm::Triple &Triple) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000676 StringRef FloatABI;
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000677 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
678 options::OPT_mhard_float,
679 options::OPT_mfloat_abi_EQ)) {
680 if (A->getOption().matches(options::OPT_msoft_float))
681 FloatABI = "soft";
682 else if (A->getOption().matches(options::OPT_mhard_float))
683 FloatABI = "hard";
684 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000685 FloatABI = A->getValue();
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000686 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000687 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000688 << A->getAsString(Args);
689 FloatABI = "soft";
690 }
691 }
692 }
693
694 // If unspecified, choose the default based on the platform.
695 if (FloatABI.empty()) {
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000696 switch (Triple.getOS()) {
Bob Wilson905c45f2011-10-14 05:03:44 +0000697 case llvm::Triple::Darwin:
698 case llvm::Triple::MacOSX:
699 case llvm::Triple::IOS: {
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000700 // Darwin defaults to "softfp" for v6 and v7.
701 //
702 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000703 std::string ArchName =
Rafael Espindolabcd6df62010-06-28 17:18:09 +0000704 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000705 if (StringRef(ArchName).startswith("v6") ||
706 StringRef(ArchName).startswith("v7"))
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000707 FloatABI = "softfp";
708 else
709 FloatABI = "soft";
710 break;
711 }
712
Rafael Espindola27fa2362012-12-13 04:17:14 +0000713 case llvm::Triple::FreeBSD:
714 // FreeBSD defaults to soft float
715 FloatABI = "soft";
716 break;
717
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000718 default:
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000719 switch(Triple.getEnvironment()) {
Jiangning Liuff104a12012-07-31 08:06:29 +0000720 case llvm::Triple::GNUEABIHF:
721 FloatABI = "hard";
722 break;
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000723 case llvm::Triple::GNUEABI:
724 FloatABI = "softfp";
725 break;
726 case llvm::Triple::EABI:
727 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
728 FloatABI = "softfp";
729 break;
Logan Chien94a71422012-09-02 09:30:11 +0000730 case llvm::Triple::Android: {
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000731 std::string ArchName =
Chandler Carruthb43550b2012-01-10 19:47:42 +0000732 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer92c4fd52012-06-26 22:20:06 +0000733 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthb43550b2012-01-10 19:47:42 +0000734 FloatABI = "softfp";
735 else
736 FloatABI = "soft";
737 break;
738 }
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000739 default:
740 // Assume "soft", but warn the user we are guessing.
741 FloatABI = "soft";
Chris Lattner5f9e2722011-07-23 10:55:15 +0000742 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsonfc2bd7c2011-02-04 17:59:28 +0000743 break;
744 }
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000745 }
746 }
747
Anton Korobeynikove2571792012-04-09 13:38:30 +0000748 return FloatABI;
749}
750
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000751static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
752 const ArgList &Args,
753 std::vector<const char *> &Features) {
754 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
755 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
756 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
757 // stripped out by the ARM target.
758 // Use software floating point operations?
759 if (FloatABI == "soft")
760 Features.push_back("+soft-float");
761
762 // Use software floating point argument passing?
763 if (FloatABI != "hard")
764 Features.push_back("+soft-float-abi");
765
766 // Honor -mfpu=.
767 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emersonfe7ed042013-10-01 10:20:54 +0000768 getARMFPUFeatures(D, A, Args, Features);
Silviu Baranga1db2e272013-10-21 10:54:53 +0000769 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
770 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000771
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000772 // Setting -msoft-float effectively disables NEON because of the GCC
773 // implementation, although the same isn't true of VFP or VFP3.
774 if (FloatABI == "soft")
775 Features.push_back("-neon");
Bernard Ogden909f35a2013-10-29 09:47:51 +0000776
777 // En/disable crc
778 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
779 options::OPT_mnocrc)) {
780 if (A->getOption().matches(options::OPT_mcrc))
781 Features.push_back("+crc");
782 else
783 Features.push_back("-crc");
784 }
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000785}
Anton Korobeynikove2571792012-04-09 13:38:30 +0000786
787void Clang::AddARMTargetArgs(const ArgList &Args,
788 ArgStringList &CmdArgs,
789 bool KernelOrKext) const {
790 const Driver &D = getToolChain().getDriver();
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000791 // Get the effective triple, which takes into account the deployment target.
792 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
793 llvm::Triple Triple(TripleStr);
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000794 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikove2571792012-04-09 13:38:30 +0000795
796 // Select the ABI to use.
797 //
798 // FIXME: Support -meabi.
799 const char *ABIName = 0;
800 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000801 ABIName = A->getValue();
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000802 } else if (Triple.isOSDarwin()) {
803 // The backend is hardwired to assume AAPCS for M-class processors, ensure
804 // the frontend matches that.
Tim Northoverfc1a75b2013-10-03 14:23:28 +0000805 if (Triple.getEnvironment() == llvm::Triple::EABI ||
806 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar2e4e1102012-10-22 18:30:51 +0000807 ABIName = "aapcs";
808 } else {
809 ABIName = "apcs-gnu";
810 }
Anton Korobeynikove2571792012-04-09 13:38:30 +0000811 } else {
812 // Select the default based on the platform.
813 switch(Triple.getEnvironment()) {
Logan Chien94a71422012-09-02 09:30:11 +0000814 case llvm::Triple::Android:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000815 case llvm::Triple::GNUEABI:
Jiangning Liuff104a12012-07-31 08:06:29 +0000816 case llvm::Triple::GNUEABIHF:
Anton Korobeynikove2571792012-04-09 13:38:30 +0000817 ABIName = "aapcs-linux";
818 break;
819 case llvm::Triple::EABI:
820 ABIName = "aapcs";
821 break;
822 default:
823 ABIName = "apcs-gnu";
824 }
825 }
826 CmdArgs.push_back("-target-abi");
827 CmdArgs.push_back(ABIName);
828
Anton Korobeynikove2571792012-04-09 13:38:30 +0000829 // Determine floating point ABI from the options & target defaults.
830 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000831 if (FloatABI == "soft") {
832 // Floating point operations and argument passing are soft.
833 //
834 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbar3b315262009-11-30 08:42:00 +0000835 CmdArgs.push_back("-msoft-float");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000836 CmdArgs.push_back("-mfloat-abi");
837 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000838 } else if (FloatABI == "softfp") {
839 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000840 CmdArgs.push_back("-mfloat-abi");
841 CmdArgs.push_back("soft");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000842 } else {
843 // Floating point operations and argument passing are hard.
844 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar87667aa2009-12-08 19:49:51 +0000845 CmdArgs.push_back("-mfloat-abi");
846 CmdArgs.push_back("hard");
Daniel Dunbarcbd19332009-09-10 23:00:09 +0000847 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +0000848
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000849 // Kernel code has more strict alignment requirements.
850 if (KernelOrKext) {
Cameron Esfahani57b1da12013-09-14 01:09:11 +0000851 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbar7a0c0642012-10-15 22:23:53 +0000852 CmdArgs.push_back("-backend-option");
853 CmdArgs.push_back("-arm-long-calls");
854 }
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000855
Daniel Dunbar3c66d302011-03-22 16:48:17 +0000856 CmdArgs.push_back("-backend-option");
Daniel Dunbarfa41d692011-03-17 17:10:06 +0000857 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000858
859 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbarb5fbb892011-04-18 21:26:42 +0000860 CmdArgs.push_back("-backend-option");
Renato Golinebc313d2013-08-15 20:54:45 +0000861 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbar7187fac2011-03-17 00:07:34 +0000862 }
Chad Rosier1b906052011-08-26 00:26:29 +0000863
864 // Setting -mno-global-merge disables the codegen global merge pass. Setting
865 // -mglobal-merge has no effect as the pass is enabled by default.
866 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
867 options::OPT_mno_global_merge)) {
868 if (A->getOption().matches(options::OPT_mno_global_merge))
869 CmdArgs.push_back("-mno-global-merge");
870 }
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000871
Bob Wilsonf6f77bd2013-04-11 18:53:25 +0000872 if (!Args.hasFlag(options::OPT_mimplicit_float,
873 options::OPT_mno_implicit_float,
874 true))
Chad Rosieree9ad5c2012-05-16 20:40:09 +0000875 CmdArgs.push_back("-no-implicit-float");
Renato Golin45bd2942013-08-24 14:44:35 +0000876
877 // llvm does not support reserving registers in general. There is support
878 // for reserving r9 on ARM though (defined as a platform-specific register
879 // in ARM EABI).
880 if (Args.hasArg(options::OPT_ffixed_r9)) {
881 CmdArgs.push_back("-backend-option");
882 CmdArgs.push_back("-arm-reserve-r9");
883 }
Daniel Dunbarb163ef72009-09-10 04:57:17 +0000884}
885
Simon Atanasyana2768be2012-04-07 22:09:23 +0000886// Get CPU and ABI names. They are not independent
887// so we have to calculate them together.
888static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindolab330e402013-08-20 22:12:08 +0000889 const llvm::Triple &Triple,
Simon Atanasyana2768be2012-04-07 22:09:23 +0000890 StringRef &CPUName,
891 StringRef &ABIName) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000892 const char *DefMips32CPU = "mips32";
893 const char *DefMips64CPU = "mips64";
Akira Hatanaka9f360622011-09-26 21:07:52 +0000894
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000895 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan66751bc2013-10-09 12:12:24 +0000896 options::OPT_mcpu_EQ))
897 CPUName = A->getValue();
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000898
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +0000899 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +0000900 ABIName = A->getValue();
Simon Atanasyanc7e2a4e2013-04-21 13:30:10 +0000901 // Convert a GNU style Mips ABI name to the name
902 // accepted by LLVM Mips backend.
903 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
904 .Case("32", "o32")
905 .Case("64", "n64")
906 .Default(ABIName);
907 }
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000908
909 // Setup default CPU and ABI names.
910 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindolab330e402013-08-20 22:12:08 +0000911 switch (Triple.getArch()) {
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000912 default:
913 llvm_unreachable("Unexpected triple arch name");
914 case llvm::Triple::mips:
915 case llvm::Triple::mipsel:
916 CPUName = DefMips32CPU;
917 break;
918 case llvm::Triple::mips64:
919 case llvm::Triple::mips64el:
920 CPUName = DefMips64CPU;
921 break;
922 }
923 }
924
925 if (!ABIName.empty()) {
926 // Deduce CPU name from ABI name.
927 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyane9616a42013-02-27 14:55:49 +0000928 .Cases("32", "o32", "eabi", DefMips32CPU)
929 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan89d83ff2012-09-10 08:32:41 +0000930 .Default("");
931 }
932 else if (!CPUName.empty()) {
933 // Deduce ABI name from CPU name.
934 ABIName = llvm::StringSwitch<const char *>(CPUName)
935 .Cases("mips32", "mips32r2", "o32")
936 .Cases("mips64", "mips64r2", "n64")
937 .Default("");
938 }
939
940 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyana2768be2012-04-07 22:09:23 +0000941}
942
Simon Atanasyane9616a42013-02-27 14:55:49 +0000943// Convert ABI name to the GNU tools acceptable variant.
944static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
945 return llvm::StringSwitch<llvm::StringRef>(ABI)
946 .Case("o32", "32")
947 .Case("n64", "64")
948 .Default(ABI);
949}
950
Simon Atanasyan5e627792012-06-02 15:06:29 +0000951// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
952// and -mfloat-abi=.
953static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000954 StringRef FloatABI;
Eric Christophered734732010-03-02 02:41:08 +0000955 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000956 options::OPT_mhard_float,
957 options::OPT_mfloat_abi_EQ)) {
Eric Christophered734732010-03-02 02:41:08 +0000958 if (A->getOption().matches(options::OPT_msoft_float))
959 FloatABI = "soft";
960 else if (A->getOption().matches(options::OPT_mhard_float))
961 FloatABI = "hard";
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000962 else {
Richard Smith1d489cf2012-11-01 04:30:05 +0000963 FloatABI = A->getValue();
Simon Atanasyan2ed42b82013-04-14 08:37:15 +0000964 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan5e627792012-06-02 15:06:29 +0000965 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000966 FloatABI = "hard";
967 }
968 }
Eric Christophered734732010-03-02 02:41:08 +0000969 }
970
971 // If unspecified, choose the default based on the platform.
972 if (FloatABI.empty()) {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +0000973 // Assume "hard", because it's a default value used by gcc.
974 // When we start to recognize specific target MIPS processors,
975 // we will be able to select the default more correctly.
976 FloatABI = "hard";
Eric Christophered734732010-03-02 02:41:08 +0000977 }
978
Simon Atanasyan5e627792012-06-02 15:06:29 +0000979 return FloatABI;
980}
981
Simon Atanasyandc536f52012-07-05 18:51:43 +0000982static void AddTargetFeature(const ArgList &Args,
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000983 std::vector<const char *> &Features,
984 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyandc536f52012-07-05 18:51:43 +0000985 StringRef FeatureName) {
986 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyandc536f52012-07-05 18:51:43 +0000987 if (A->getOption().matches(OnOpt))
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000988 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyandc536f52012-07-05 18:51:43 +0000989 else
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000990 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyandc536f52012-07-05 18:51:43 +0000991 }
992}
993
Rafael Espindola146dbbf2013-08-21 16:39:20 +0000994static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
995 std::vector<const char *> &Features) {
996 StringRef FloatABI = getMipsFloatABI(D, Args);
997 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
998 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
999 // FIXME: Note, this is a hack. We need to pass the selected float
1000 // mode to the MipsTargetInfoBase to define appropriate macros there.
1001 // Now it is the only method.
1002 Features.push_back("+soft-float");
1003 }
1004
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00001005 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
1006 if (StringRef(A->getValue()) == "2008")
1007 Features.push_back("+nan2008");
1008 }
1009
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001010 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1011 options::OPT_mdouble_float, "single-float");
1012 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1013 "mips16");
1014 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1015 options::OPT_mno_micromips, "micromips");
1016 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1017 "dsp");
1018 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1019 "dspr2");
1020 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1021 "msa");
Daniel Sandersaf7ed9e2013-10-17 14:55:58 +00001022 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
1023 "fp64");
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001024}
1025
Simon Atanasyan5e627792012-06-02 15:06:29 +00001026void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyana8141612013-04-14 14:07:41 +00001027 ArgStringList &CmdArgs) const {
Simon Atanasyan5e627792012-06-02 15:06:29 +00001028 const Driver &D = getToolChain().getDriver();
1029 StringRef CPUName;
1030 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00001031 const llvm::Triple &Triple = getToolChain().getTriple();
1032 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan5e627792012-06-02 15:06:29 +00001033
1034 CmdArgs.push_back("-target-abi");
1035 CmdArgs.push_back(ABIName.data());
1036
1037 StringRef FloatABI = getMipsFloatABI(D, Args);
1038
Simon Atanasyane1d792f2013-01-10 12:36:19 +00001039 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
1040
1041 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christophered734732010-03-02 02:41:08 +00001042 // Floating point operations and argument passing are soft.
Eric Christophered734732010-03-02 02:41:08 +00001043 CmdArgs.push_back("-msoft-float");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001044 CmdArgs.push_back("-mfloat-abi");
1045 CmdArgs.push_back("soft");
1046
Simon Atanasyane1d792f2013-01-10 12:36:19 +00001047 if (FloatABI == "hard" && IsMips16) {
1048 CmdArgs.push_back("-mllvm");
1049 CmdArgs.push_back("-mips16-hard-float");
1050 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001051 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001052 else {
1053 // Floating point operations and argument passing are hard.
Eric Christophered734732010-03-02 02:41:08 +00001054 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00001055 CmdArgs.push_back("-mfloat-abi");
1056 CmdArgs.push_back("hard");
Eric Christophered734732010-03-02 02:41:08 +00001057 }
Simon Atanasyan0b273ef2012-07-05 14:19:39 +00001058
Simon Atanasyanbda07ac2012-12-01 18:27:21 +00001059 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1060 if (A->getOption().matches(options::OPT_mxgot)) {
1061 CmdArgs.push_back("-mllvm");
1062 CmdArgs.push_back("-mxgot");
1063 }
1064 }
1065
Simon Atanasyan6bdc4c62013-05-11 06:33:44 +00001066 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1067 options::OPT_mno_ldc1_sdc1)) {
1068 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1069 CmdArgs.push_back("-mllvm");
1070 CmdArgs.push_back("-mno-ldc1-sdc1");
1071 }
1072 }
1073
Akira Hatanakacdbc3b32013-07-19 18:58:48 +00001074 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1075 options::OPT_mno_check_zero_division)) {
1076 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1077 CmdArgs.push_back("-mllvm");
1078 CmdArgs.push_back("-mno-check-zero-division");
1079 }
1080 }
1081
Simon Atanasyan9804b762012-08-27 20:55:56 +00001082 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001083 StringRef v = A->getValue();
Simon Atanasyan9804b762012-08-27 20:55:56 +00001084 CmdArgs.push_back("-mllvm");
1085 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1086 A->claim();
1087 }
Eric Christophered734732010-03-02 02:41:08 +00001088}
1089
Hal Finkel02a84272012-06-11 22:35:19 +00001090/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1091static std::string getPPCTargetCPU(const ArgList &Args) {
1092 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00001093 StringRef CPUName = A->getValue();
Hal Finkel02a84272012-06-11 22:35:19 +00001094
1095 if (CPUName == "native") {
1096 std::string CPU = llvm::sys::getHostCPUName();
1097 if (!CPU.empty() && CPU != "generic")
1098 return CPU;
1099 else
1100 return "";
1101 }
1102
1103 return llvm::StringSwitch<const char *>(CPUName)
1104 .Case("common", "generic")
1105 .Case("440", "440")
1106 .Case("440fp", "440")
1107 .Case("450", "450")
1108 .Case("601", "601")
1109 .Case("602", "602")
1110 .Case("603", "603")
1111 .Case("603e", "603e")
1112 .Case("603ev", "603ev")
1113 .Case("604", "604")
1114 .Case("604e", "604e")
1115 .Case("620", "620")
Bill Schmidt2821e182013-02-01 20:23:10 +00001116 .Case("630", "pwr3")
Hal Finkel02a84272012-06-11 22:35:19 +00001117 .Case("G3", "g3")
1118 .Case("7400", "7400")
1119 .Case("G4", "g4")
1120 .Case("7450", "7450")
1121 .Case("G4+", "g4+")
1122 .Case("750", "750")
1123 .Case("970", "970")
1124 .Case("G5", "g5")
1125 .Case("a2", "a2")
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001126 .Case("a2q", "a2q")
Hal Finkel7de32962012-09-18 22:25:03 +00001127 .Case("e500mc", "e500mc")
1128 .Case("e5500", "e5500")
Bill Schmidt2821e182013-02-01 20:23:10 +00001129 .Case("power3", "pwr3")
1130 .Case("power4", "pwr4")
1131 .Case("power5", "pwr5")
1132 .Case("power5x", "pwr5x")
Hal Finkel02a84272012-06-11 22:35:19 +00001133 .Case("power6", "pwr6")
Bill Schmidt2821e182013-02-01 20:23:10 +00001134 .Case("power6x", "pwr6x")
Hal Finkel02a84272012-06-11 22:35:19 +00001135 .Case("power7", "pwr7")
Bill Schmidt2821e182013-02-01 20:23:10 +00001136 .Case("pwr3", "pwr3")
1137 .Case("pwr4", "pwr4")
1138 .Case("pwr5", "pwr5")
1139 .Case("pwr5x", "pwr5x")
1140 .Case("pwr6", "pwr6")
1141 .Case("pwr6x", "pwr6x")
1142 .Case("pwr7", "pwr7")
Hal Finkel02a84272012-06-11 22:35:19 +00001143 .Case("powerpc", "ppc")
1144 .Case("powerpc64", "ppc64")
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001145 .Case("powerpc64le", "ppc64le")
Hal Finkel02a84272012-06-11 22:35:19 +00001146 .Default("");
1147 }
1148
1149 return "";
1150}
1151
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001152static void getPPCTargetFeatures(const ArgList &Args,
1153 std::vector<const char *> &Features) {
Eric Christopherd5e59fc2013-10-16 20:40:08 +00001154 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1155 ie = Args.filtered_end();
1156 it != ie; ++it) {
1157 StringRef Name = (*it)->getOption().getName();
1158 (*it)->claim();
1159
1160 // Skip over "-m".
1161 assert(Name.startswith("m") && "Invalid feature name.");
1162 Name = Name.substr(1);
1163
1164 bool IsNegative = Name.startswith("no-");
1165 if (IsNegative)
1166 Name = Name.substr(3);
1167
1168 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1169 // pass the correct option to the backend while calling the frontend
1170 // option the same.
1171 // TODO: Change the LLVM backend option maybe?
1172 if (Name == "mfcrf")
1173 Name = "mfocrf";
1174
1175 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1176 }
1177
1178 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001179 AddTargetFeature(Args, Features, options::OPT_faltivec,
1180 options::OPT_fno_altivec, "altivec");
Hal Finkel02a84272012-06-11 22:35:19 +00001181}
1182
Tom Stellarde25d2f62013-04-01 20:56:53 +00001183/// Get the (LLVM) name of the R600 gpu we are targeting.
1184static std::string getR600TargetGPU(const ArgList &Args) {
1185 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001186 const char *GPUName = A->getValue();
Tom Stellarde25d2f62013-04-01 20:56:53 +00001187 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardfd4aa4b2013-05-06 16:12:05 +00001188 .Cases("rv630", "rv635", "r600")
1189 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellarde25d2f62013-04-01 20:56:53 +00001190 .Case("rv740", "rv770")
1191 .Case("palm", "cedar")
Tom Stellardfd4aa4b2013-05-06 16:12:05 +00001192 .Cases("sumo", "sumo2", "sumo")
Tom Stellarde25d2f62013-04-01 20:56:53 +00001193 .Case("hemlock", "cypress")
1194 .Case("aruba", "cayman")
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001195 .Default(GPUName);
Tom Stellarde25d2f62013-04-01 20:56:53 +00001196 }
1197 return "";
1198}
1199
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001200static void getSparcTargetFeatures(const ArgList &Args,
1201 std::vector<const char *> Features) {
1202 bool SoftFloatABI = true;
1203 if (Arg *A =
1204 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1205 if (A->getOption().matches(options::OPT_mhard_float))
1206 SoftFloatABI = false;
1207 }
1208 if (SoftFloatABI)
1209 Features.push_back("+soft-float");
1210}
1211
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001212void Clang::AddSparcTargetArgs(const ArgList &Args,
1213 ArgStringList &CmdArgs) const {
1214 const Driver &D = getToolChain().getDriver();
1215
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001216 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner5f9e2722011-07-23 10:55:15 +00001217 StringRef FloatABI;
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001218 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1219 options::OPT_mhard_float)) {
1220 if (A->getOption().matches(options::OPT_msoft_float))
1221 FloatABI = "soft";
1222 else if (A->getOption().matches(options::OPT_mhard_float))
1223 FloatABI = "hard";
1224 }
1225
1226 // If unspecified, choose the default based on the platform.
1227 if (FloatABI.empty()) {
Aaron Ballmand58915e2013-07-15 13:41:33 +00001228 // Assume "soft", but warn the user we are guessing.
1229 FloatABI = "soft";
1230 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001231 }
1232
1233 if (FloatABI == "soft") {
1234 // Floating point operations and argument passing are soft.
1235 //
1236 // FIXME: This changes CPP defines, we need -target-soft-float.
1237 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00001238 } else {
1239 assert(FloatABI == "hard" && "Invalid float abi!");
1240 CmdArgs.push_back("-mhard-float");
1241 }
1242}
1243
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00001244static const char *getSystemZTargetCPU(const ArgList &Args) {
1245 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1246 return A->getValue();
1247 return "z10";
1248}
1249
Chandler Carruth700d4e42013-01-13 11:46:33 +00001250static const char *getX86TargetCPU(const ArgList &Args,
1251 const llvm::Triple &Triple) {
1252 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1253 if (StringRef(A->getValue()) != "native")
1254 return A->getValue();
1255
1256 // FIXME: Reject attempts to use -march=native unless the target matches
1257 // the host.
1258 //
1259 // FIXME: We should also incorporate the detected target features for use
1260 // with -native.
1261 std::string CPU = llvm::sys::getHostCPUName();
1262 if (!CPU.empty() && CPU != "generic")
1263 return Args.MakeArgString(CPU);
1264 }
1265
1266 // Select the default CPU if none was given (or detection failed).
1267
1268 if (Triple.getArch() != llvm::Triple::x86_64 &&
1269 Triple.getArch() != llvm::Triple::x86)
1270 return 0; // This routine is only handling x86 targets.
1271
1272 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1273
1274 // FIXME: Need target hooks.
1275 if (Triple.isOSDarwin())
1276 return Is64Bit ? "core2" : "yonah";
1277
Chandler Carruth700d4e42013-01-13 11:46:33 +00001278 // All x86 devices running Android have core2 as their common
1279 // denominator. This makes a better choice than pentium4.
1280 if (Triple.getEnvironment() == llvm::Triple::Android)
1281 return "core2";
1282
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00001283 // Everything else goes to x86-64 in 64-bit mode.
1284 if (Is64Bit)
1285 return "x86-64";
1286
1287 switch (Triple.getOS()) {
1288 case llvm::Triple::FreeBSD:
1289 case llvm::Triple::NetBSD:
1290 case llvm::Triple::OpenBSD:
1291 return "i486";
1292 case llvm::Triple::Haiku:
1293 return "i586";
1294 case llvm::Triple::Bitrig:
1295 return "i686";
1296 default:
1297 // Fallback to p4.
1298 return "pentium4";
1299 }
Chandler Carruth700d4e42013-01-13 11:46:33 +00001300}
1301
Rafael Espindolab330e402013-08-20 22:12:08 +00001302static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1303 switch(T.getArch()) {
1304 default:
1305 return "";
1306
1307 case llvm::Triple::arm:
1308 case llvm::Triple::thumb:
1309 return getARMTargetCPU(Args, T);
1310
1311 case llvm::Triple::mips:
1312 case llvm::Triple::mipsel:
1313 case llvm::Triple::mips64:
1314 case llvm::Triple::mips64el: {
1315 StringRef CPUName;
1316 StringRef ABIName;
1317 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1318 return CPUName;
1319 }
1320
1321 case llvm::Triple::ppc:
1322 case llvm::Triple::ppc64:
1323 case llvm::Triple::ppc64le: {
1324 std::string TargetCPUName = getPPCTargetCPU(Args);
1325 // LLVM may default to generating code for the native CPU,
1326 // but, like gcc, we default to a more generic option for
1327 // each architecture. (except on Darwin)
1328 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1329 if (T.getArch() == llvm::Triple::ppc64)
1330 TargetCPUName = "ppc64";
1331 else if (T.getArch() == llvm::Triple::ppc64le)
1332 TargetCPUName = "ppc64le";
1333 else
1334 TargetCPUName = "ppc";
1335 }
1336 return TargetCPUName;
1337 }
1338
1339 case llvm::Triple::sparc:
1340 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1341 return A->getValue();
1342 return "";
1343
1344 case llvm::Triple::x86:
1345 case llvm::Triple::x86_64:
1346 return getX86TargetCPU(Args, T);
1347
1348 case llvm::Triple::hexagon:
1349 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1350
1351 case llvm::Triple::systemz:
1352 return getSystemZTargetCPU(Args);
1353
1354 case llvm::Triple::r600:
1355 return getR600TargetGPU(Args);
1356 }
1357}
1358
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001359static void getX86TargetFeatures(const ArgList &Args,
1360 std::vector<const char *> &Features) {
1361 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1362 ie = Args.filtered_end();
1363 it != ie; ++it) {
1364 StringRef Name = (*it)->getOption().getName();
1365 (*it)->claim();
1366
1367 // Skip over "-m".
1368 assert(Name.startswith("m") && "Invalid feature name.");
1369 Name = Name.substr(1);
1370
1371 bool IsNegative = Name.startswith("no-");
1372 if (IsNegative)
1373 Name = Name.substr(3);
1374
1375 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1376 }
1377}
1378
Daniel Dunbar6acda162009-09-09 22:33:08 +00001379void Clang::AddX86TargetArgs(const ArgList &Args,
1380 ArgStringList &CmdArgs) const {
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001381 if (!Args.hasFlag(options::OPT_mred_zone,
1382 options::OPT_mno_red_zone,
1383 true) ||
1384 Args.hasArg(options::OPT_mkernel) ||
1385 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar66861e02009-11-20 22:21:36 +00001386 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare6ad3f92009-09-10 22:59:57 +00001387
Bob Wilsonf0c54562013-02-10 16:01:41 +00001388 // Default to avoid implicit floating-point for kernel/kext code, but allow
1389 // that to be overridden with -mno-soft-float.
1390 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1391 Args.hasArg(options::OPT_fapple_kext));
1392 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1393 options::OPT_mno_soft_float,
Bob Wilsonf6f77bd2013-04-11 18:53:25 +00001394 options::OPT_mimplicit_float,
Bob Wilsonf0c54562013-02-10 16:01:41 +00001395 options::OPT_mno_implicit_float)) {
1396 const Option &O = A->getOption();
1397 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1398 O.matches(options::OPT_msoft_float));
1399 }
1400 if (NoImplicitFloat)
Daniel Dunbar66861e02009-11-20 22:21:36 +00001401 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar6acda162009-09-09 22:33:08 +00001402}
1403
Matthew Curtis33c95f12012-12-06 17:49:03 +00001404static inline bool HasPICArg(const ArgList &Args) {
1405 return Args.hasArg(options::OPT_fPIC)
1406 || Args.hasArg(options::OPT_fpic);
1407}
1408
1409static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1410 return Args.getLastArg(options::OPT_G,
1411 options::OPT_G_EQ,
1412 options::OPT_msmall_data_threshold_EQ);
1413}
1414
1415static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1416 std::string value;
1417 if (HasPICArg(Args))
1418 value = "0";
1419 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1420 value = A->getValue();
1421 A->claim();
1422 }
1423 return value;
1424}
1425
Tony Linthicum96319392011-12-12 21:14:55 +00001426void Clang::AddHexagonTargetArgs(const ArgList &Args,
1427 ArgStringList &CmdArgs) const {
Tony Linthicum96319392011-12-12 21:14:55 +00001428 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis1dbaef52012-12-07 13:52:44 +00001429 CmdArgs.push_back("-mqdsp6-compat");
1430 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum96319392011-12-12 21:14:55 +00001431
Matthew Curtis33c95f12012-12-06 17:49:03 +00001432 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1433 if (!SmallDataThreshold.empty()) {
Tony Linthicum96319392011-12-12 21:14:55 +00001434 CmdArgs.push_back ("-mllvm");
Matthew Curtis33c95f12012-12-06 17:49:03 +00001435 CmdArgs.push_back(Args.MakeArgString(
1436 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00001437 }
1438
Sirish Pande5f9688b2012-05-10 20:19:54 +00001439 if (!Args.hasArg(options::OPT_fno_short_enums))
1440 CmdArgs.push_back("-fshort-enums");
1441 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1442 CmdArgs.push_back ("-mllvm");
1443 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1444 }
Tony Linthicum96319392011-12-12 21:14:55 +00001445 CmdArgs.push_back ("-mllvm");
1446 CmdArgs.push_back ("-machine-sink-split=0");
1447}
1448
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001449static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1450 std::vector<const char *> &Features) {
Tim Northoverb793f0d2013-08-01 09:23:19 +00001451 // Honor -mfpu=.
1452 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emersonfe7ed042013-10-01 10:20:54 +00001453 getAArch64FPUFeatures(D, A, Args, Features);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001454}
1455
1456static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1457 const ArgList &Args, ArgStringList &CmdArgs) {
1458 std::vector<const char *> Features;
1459 switch (Triple.getArch()) {
1460 default:
1461 break;
1462 case llvm::Triple::mips:
1463 case llvm::Triple::mipsel:
1464 case llvm::Triple::mips64:
1465 case llvm::Triple::mips64el:
1466 getMIPSTargetFeatures(D, Args, Features);
1467 break;
1468
1469 case llvm::Triple::arm:
1470 case llvm::Triple::thumb:
1471 getARMTargetFeatures(D, Triple, Args, Features);
1472 break;
1473
1474 case llvm::Triple::ppc:
1475 case llvm::Triple::ppc64:
1476 case llvm::Triple::ppc64le:
1477 getPPCTargetFeatures(Args, Features);
1478 break;
1479 case llvm::Triple::sparc:
1480 getSparcTargetFeatures(Args, Features);
1481 break;
1482 case llvm::Triple::aarch64:
1483 getAArch64TargetFeatures(D, Args, Features);
1484 break;
1485 case llvm::Triple::x86:
1486 case llvm::Triple::x86_64:
1487 getX86TargetFeatures(Args, Features);
1488 break;
1489 }
Rafael Espindolabc1e5452013-08-21 17:34:32 +00001490
1491 // Find the last of each feature.
1492 llvm::StringMap<unsigned> LastOpt;
1493 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1494 const char *Name = Features[I];
1495 assert(Name[0] == '-' || Name[0] == '+');
1496 LastOpt[Name + 1] = I;
1497 }
1498
1499 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1500 // If this feature was overridden, ignore it.
1501 const char *Name = Features[I];
1502 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1503 assert(LastI != LastOpt.end());
1504 unsigned Last = LastI->second;
1505 if (Last != I)
1506 continue;
1507
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001508 CmdArgs.push_back("-target-feature");
Rafael Espindolabc1e5452013-08-21 17:34:32 +00001509 CmdArgs.push_back(Name);
Rafael Espindola146dbbf2013-08-21 16:39:20 +00001510 }
Tim Northoverb793f0d2013-08-01 09:23:19 +00001511}
1512
Eric Christopher88b7cf02011-08-19 00:30:14 +00001513static bool
John McCall260611a2012-06-20 06:18:46 +00001514shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson525544d2011-02-28 00:44:51 +00001515 const llvm::Triple &Triple) {
1516 // We use the zero-cost exception tables for Objective-C if the non-fragile
1517 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1518 // later.
John McCall260611a2012-06-20 06:18:46 +00001519 if (runtime.isNonFragile())
Anders Carlsson525544d2011-02-28 00:44:51 +00001520 return true;
1521
Bob Wilson905c45f2011-10-14 05:03:44 +00001522 if (!Triple.isOSDarwin())
Anders Carlsson525544d2011-02-28 00:44:51 +00001523 return false;
1524
Eric Christopheraa7333c2011-07-02 00:20:22 +00001525 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson525544d2011-02-28 00:44:51 +00001526 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher88b7cf02011-08-19 00:30:14 +00001527 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson525544d2011-02-28 00:44:51 +00001528}
1529
Anders Carlsson15348ae2011-02-28 02:27:16 +00001530/// addExceptionArgs - Adds exception related arguments to the driver command
1531/// arguments. There's a master flag, -fexceptions and also language specific
1532/// flags to enable/disable C++ and Objective-C exceptions.
1533/// This makes it possible to for example disable C++ exceptions but enable
1534/// Objective-C exceptions.
1535static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1536 const llvm::Triple &Triple,
Fariborz Jahanian15b77312012-04-04 18:28:00 +00001537 bool KernelOrKext,
John McCall260611a2012-06-20 06:18:46 +00001538 const ObjCRuntime &objcRuntime,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001539 ArgStringList &CmdArgs) {
Chad Rosierafc4baa2012-03-26 22:04:46 +00001540 if (KernelOrKext) {
1541 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1542 // arguments now to avoid warnings about unused arguments.
1543 Args.ClaimAllArgs(options::OPT_fexceptions);
1544 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1545 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1546 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1547 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1548 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001549 return;
Chad Rosierafc4baa2012-03-26 22:04:46 +00001550 }
Anders Carlsson15348ae2011-02-28 02:27:16 +00001551
1552 // Exceptions are enabled by default.
1553 bool ExceptionsEnabled = true;
1554
1555 // This keeps track of whether exceptions were explicitly turned on or off.
1556 bool DidHaveExplicitExceptionFlag = false;
1557
Rafael Espindolaf759df02009-10-01 13:33:33 +00001558 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1559 options::OPT_fno_exceptions)) {
1560 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001561 ExceptionsEnabled = true;
Eric Christopher88b7cf02011-08-19 00:30:14 +00001562 else
Anders Carlsson15348ae2011-02-28 02:27:16 +00001563 ExceptionsEnabled = false;
1564
1565 DidHaveExplicitExceptionFlag = true;
Rafael Espindolaf759df02009-10-01 13:33:33 +00001566 }
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001567
Anders Carlsson15348ae2011-02-28 02:27:16 +00001568 bool ShouldUseExceptionTables = false;
Fariborz Jahanian85caf032009-10-01 20:30:46 +00001569
Anders Carlsson15348ae2011-02-28 02:27:16 +00001570 // Exception tables and cleanups can be enabled with -fexceptions even if the
1571 // language itself doesn't support exceptions.
1572 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1573 ShouldUseExceptionTables = true;
Daniel Dunbar1a2cd4f2010-09-14 23:12:31 +00001574
Daniel Dunbard47ea692011-03-17 23:28:31 +00001575 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1576 // is not necessarily sensible, but follows GCC.
1577 if (types::isObjC(InputType) &&
Eric Christopher88b7cf02011-08-19 00:30:14 +00001578 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbard47ea692011-03-17 23:28:31 +00001579 options::OPT_fno_objc_exceptions,
1580 true)) {
1581 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlsson15348ae2011-02-28 02:27:16 +00001582
Eric Christopher88b7cf02011-08-19 00:30:14 +00001583 ShouldUseExceptionTables |=
John McCall260611a2012-06-20 06:18:46 +00001584 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlsson15348ae2011-02-28 02:27:16 +00001585 }
1586
1587 if (types::isCXX(InputType)) {
1588 bool CXXExceptionsEnabled = ExceptionsEnabled;
1589
Eric Christopher88b7cf02011-08-19 00:30:14 +00001590 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1591 options::OPT_fno_cxx_exceptions,
Anders Carlsson15348ae2011-02-28 02:27:16 +00001592 options::OPT_fexceptions,
1593 options::OPT_fno_exceptions)) {
1594 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1595 CXXExceptionsEnabled = true;
Chandler Carruth43f220f2011-02-28 07:25:18 +00001596 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlsson15348ae2011-02-28 02:27:16 +00001597 CXXExceptionsEnabled = false;
1598 }
1599
1600 if (CXXExceptionsEnabled) {
1601 CmdArgs.push_back("-fcxx-exceptions");
1602
1603 ShouldUseExceptionTables = true;
1604 }
1605 }
1606
1607 if (ShouldUseExceptionTables)
1608 CmdArgs.push_back("-fexceptions");
Rafael Espindolaf759df02009-10-01 13:33:33 +00001609}
1610
Daniel Dunbarf4910132013-04-16 18:21:19 +00001611static bool ShouldDisableAutolink(const ArgList &Args,
1612 const ToolChain &TC) {
1613 bool Default = true;
1614 if (TC.getTriple().isOSDarwin()) {
1615 // The native darwin assembler doesn't support the linker_option directives,
1616 // so we disable them if we think the .s file will be passed to it.
1617 Default = TC.useIntegratedAs();
1618 }
1619 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1620 Default);
1621}
1622
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001623static bool ShouldDisableCFI(const ArgList &Args,
1624 const ToolChain &TC) {
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001625 bool Default = true;
Bob Wilson905c45f2011-10-14 05:03:44 +00001626 if (TC.getTriple().isOSDarwin()) {
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001627 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindolacb773922011-05-17 19:06:58 +00001628 // we disable them if we think the .s file will be passed to it.
Rafael Espindolaaf370e62013-03-18 18:10:27 +00001629 Default = TC.useIntegratedAs();
Rafael Espindola97f6abb2011-05-17 16:26:17 +00001630 }
Rafael Espindola701ec8d2012-03-08 14:39:55 +00001631 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher27e2b982012-12-18 00:31:10 +00001632 options::OPT_fno_dwarf2_cfi_asm,
1633 Default);
Rafael Espindola61b1efe2011-05-02 17:43:32 +00001634}
1635
Ted Kremenekc06fcdf2013-03-12 17:02:12 +00001636static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1637 const ToolChain &TC) {
Nick Lewyckyea523d72011-10-17 23:05:52 +00001638 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1639 options::OPT_fno_dwarf_directory_asm,
Rafael Espindolaaf370e62013-03-18 18:10:27 +00001640 TC.useIntegratedAs());
Nick Lewyckyea523d72011-10-17 23:05:52 +00001641 return !UseDwarfDirectory;
1642}
1643
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001644/// \brief Check whether the given input tree contains any compilation actions.
1645static bool ContainsCompileAction(const Action *A) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001646 if (isa<CompileJobAction>(A))
Joerg Sonnenberger359cf922011-05-06 14:35:16 +00001647 return true;
1648
1649 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1650 if (ContainsCompileAction(*it))
1651 return true;
1652
1653 return false;
1654}
1655
1656/// \brief Check if -relax-all should be passed to the internal assembler.
1657/// This is done by default when compiling non-assembler source with -O0.
1658static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1659 bool RelaxDefault = true;
1660
1661 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1662 RelaxDefault = A->getOption().matches(options::OPT_O0);
1663
1664 if (RelaxDefault) {
1665 RelaxDefault = false;
1666 for (ActionList::const_iterator it = C.getActions().begin(),
1667 ie = C.getActions().end(); it != ie; ++it) {
1668 if (ContainsCompileAction(*it)) {
1669 RelaxDefault = true;
1670 break;
1671 }
1672 }
1673 }
1674
1675 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1676 RelaxDefault);
1677}
1678
David Blaikie73168db2013-07-25 21:19:01 +00001679static void CollectArgsForIntegratedAssembler(Compilation &C,
1680 const ArgList &Args,
1681 ArgStringList &CmdArgs,
1682 const Driver &D) {
1683 if (UseRelaxAll(C, Args))
1684 CmdArgs.push_back("-mrelax-all");
1685
1686 // When using an integrated assembler, translate -Wa, and -Xassembler
1687 // options.
1688 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1689 options::OPT_Xassembler),
1690 ie = Args.filtered_end(); it != ie; ++it) {
1691 const Arg *A = *it;
1692 A->claim();
1693
1694 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1695 StringRef Value = A->getValue(i);
1696
1697 if (Value == "-force_cpusubtype_ALL") {
1698 // Do nothing, this is the default and we don't support anything else.
1699 } else if (Value == "-L") {
1700 CmdArgs.push_back("-msave-temp-labels");
1701 } else if (Value == "--fatal-warnings") {
1702 CmdArgs.push_back("-mllvm");
1703 CmdArgs.push_back("-fatal-assembler-warnings");
1704 } else if (Value == "--noexecstack") {
1705 CmdArgs.push_back("-mnoexecstack");
1706 } else {
1707 D.Diag(diag::err_drv_unsupported_option_argument)
1708 << A->getOption().getName() << Value;
1709 }
1710 }
1711 }
1712}
1713
Chandler Carruth9db37cd2013-06-23 11:28:48 +00001714static void addProfileRTLinux(
1715 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1716 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1717 Args.hasArg(options::OPT_fprofile_generate) ||
1718 Args.hasArg(options::OPT_fcreate_profile) ||
1719 Args.hasArg(options::OPT_coverage)))
1720 return;
1721
1722 // The profile runtime is located in the Linux library directory and has name
1723 // "libclang_rt.profile-<ArchName>.a".
1724 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1725 llvm::sys::path::append(
1726 LibProfile, "lib", "linux",
1727 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1728
1729 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1730}
1731
Alexey Samsonov86143042013-02-27 11:14:55 +00001732static void addSanitizerRTLinkFlagsLinux(
1733 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smith76e6e132013-03-23 00:30:08 +00001734 const StringRef Sanitizer, bool BeforeLibStdCXX,
1735 bool ExportSymbols = true) {
Alexey Samsonov86143042013-02-27 11:14:55 +00001736 // Sanitizer runtime is located in the Linux library directory and
1737 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1738 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1739 llvm::sys::path::append(
1740 LibSanitizer, "lib", "linux",
1741 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smith61a574f2013-03-20 23:49:07 +00001742
Alexey Samsonov86143042013-02-27 11:14:55 +00001743 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1744 // etc.) so that the linker picks custom versions of the global 'operator
1745 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournebf548552013-10-20 21:29:13 +00001746 // strategy of inserting it at the front of the link command. It also
1747 // needs to be forced to end up in the executable, so wrap it in
1748 // whole-archive.
Richard Smith61a574f2013-03-20 23:49:07 +00001749 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournebf548552013-10-20 21:29:13 +00001750 LibSanitizerArgs.push_back("-whole-archive");
Richard Smith61a574f2013-03-20 23:49:07 +00001751 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournebf548552013-10-20 21:29:13 +00001752 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smith61a574f2013-03-20 23:49:07 +00001753
1754 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1755 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1756
Alexey Samsonov86143042013-02-27 11:14:55 +00001757 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov3a8aff92013-05-24 14:28:03 +00001758 CmdArgs.push_back("-lrt");
Alexey Samsonov86143042013-02-27 11:14:55 +00001759 CmdArgs.push_back("-ldl");
Richard Smith76e6e132013-03-23 00:30:08 +00001760
1761 // If possible, use a dynamic symbols file to export the symbols from the
1762 // runtime library. If we can't do so, use -export-dynamic instead to export
1763 // all symbols from the binary.
1764 if (ExportSymbols) {
1765 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1766 CmdArgs.push_back(
1767 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1768 else
1769 CmdArgs.push_back("-export-dynamic");
1770 }
Alexey Samsonov86143042013-02-27 11:14:55 +00001771}
1772
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001773/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1774/// This needs to be called before we add the C run-time (malloc, etc).
1775static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00001776 ArgStringList &CmdArgs) {
Nick Lewyckyd4705682013-10-11 03:33:53 +00001777 if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov8ba75412012-09-12 09:09:08 +00001778 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1779 llvm::sys::path::append(LibAsan, "lib", "linux",
1780 (Twine("libclang_rt.asan-") +
1781 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay45b27382012-12-04 21:18:26 +00001782 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001783 } else {
Sergey Matveev050309f2013-05-27 11:17:01 +00001784 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001785 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001786 }
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001787}
1788
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001789/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1790/// This needs to be called before we add the C run-time (malloc, etc).
1791static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1792 ArgStringList &CmdArgs) {
Sergey Matveev050309f2013-05-27 11:17:01 +00001793 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001794 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001795}
1796
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00001797/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1798/// This needs to be called before we add the C run-time (malloc, etc).
1799static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1800 ArgStringList &CmdArgs) {
Sergey Matveev050309f2013-05-27 11:17:01 +00001801 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001802 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev050309f2013-05-27 11:17:01 +00001803}
1804
1805/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1806/// This needs to be called before we add the C run-time (malloc, etc).
1807static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1808 ArgStringList &CmdArgs) {
1809 if (!Args.hasArg(options::OPT_shared))
1810 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00001811}
1812
Richard Smith4def70d2012-10-09 19:52:38 +00001813/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1814/// (Linux).
1815static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smith61a574f2013-03-20 23:49:07 +00001816 ArgStringList &CmdArgs, bool IsCXX,
1817 bool HasOtherSanitizerRt) {
Nick Lewycky63d29e22013-10-19 00:27:23 +00001818 // Need a copy of sanitizer_common. This could come from another sanitizer
1819 // runtime; if we're not including one, include our own copy.
1820 if (!HasOtherSanitizerRt)
Peter Collingbournebf548552013-10-20 21:29:13 +00001821 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
1822
1823 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
1824
1825 // Only include the bits of the runtime which need a C++ ABI library if
1826 // we're linking in C++ mode.
1827 if (IsCXX)
1828 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smith4def70d2012-10-09 19:52:38 +00001829}
1830
Peter Collingbourne2eeed712013-08-07 22:47:34 +00001831static void addDfsanRTLinux(const ToolChain &TC, const ArgList &Args,
1832 ArgStringList &CmdArgs) {
1833 if (!Args.hasArg(options::OPT_shared))
1834 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "dfsan", true);
1835}
1836
Benjamin Kramer5322a552013-10-16 17:42:39 +00001837static bool shouldUseFramePointerForTarget(const ArgList &Args,
1838 const llvm::Triple &Triple) {
1839 switch (Triple.getArch()) {
1840 // Don't use a frame pointer on linux if optimizing for certain targets.
1841 case llvm::Triple::mips64:
1842 case llvm::Triple::mips64el:
1843 case llvm::Triple::mips:
1844 case llvm::Triple::mipsel:
1845 case llvm::Triple::systemz:
1846 case llvm::Triple::x86:
1847 case llvm::Triple::x86_64:
1848 if (Triple.isOSLinux())
1849 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1850 if (!A->getOption().matches(options::OPT_O0))
1851 return false;
1852 return true;
1853 case llvm::Triple::xcore:
1854 return false;
1855 default:
1856 return true;
1857 }
1858}
1859
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001860static bool shouldUseFramePointer(const ArgList &Args,
1861 const llvm::Triple &Triple) {
1862 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1863 options::OPT_fomit_frame_pointer))
1864 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1865
Benjamin Kramer5322a552013-10-16 17:42:39 +00001866 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001867}
1868
Eric Christopherd3e22df2013-04-03 01:58:53 +00001869static bool shouldUseLeafFramePointer(const ArgList &Args,
1870 const llvm::Triple &Triple) {
1871 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1872 options::OPT_momit_leaf_frame_pointer))
1873 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1874
Benjamin Kramer5322a552013-10-16 17:42:39 +00001875 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherd3e22df2013-04-03 01:58:53 +00001876}
1877
Rafael Espindolaa2148242013-08-10 01:40:10 +00001878/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruthd566df62012-12-17 21:40:04 +00001879static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer6089adc2013-04-27 08:12:29 +00001880 SmallString<128> cwd;
1881 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosierb1c81222013-04-26 20:49:50 +00001882 CmdArgs.push_back("-fdebug-compilation-dir");
1883 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruthd566df62012-12-17 21:40:04 +00001884 }
1885}
1886
Eric Christopher80190392013-02-22 20:12:52 +00001887static const char *SplitDebugName(const ArgList &Args,
1888 const InputInfoList &Inputs) {
1889 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1890 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1891 SmallString<128> T(FinalOutput->getValue());
1892 llvm::sys::path::replace_extension(T, "dwo");
1893 return Args.MakeArgString(T);
1894 } else {
1895 // Use the compilation dir.
1896 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1897 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1898 llvm::sys::path::replace_extension(F, "dwo");
1899 T += F;
1900 return Args.MakeArgString(F);
1901 }
1902}
1903
1904static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1905 const Tool &T, const JobAction &JA,
1906 const ArgList &Args, const InputInfo &Output,
1907 const char *OutFile) {
Eric Christopher59320e72013-02-21 22:35:01 +00001908 ArgStringList ExtractArgs;
1909 ExtractArgs.push_back("--extract-dwo");
1910
1911 ArgStringList StripArgs;
1912 StripArgs.push_back("--strip-dwo");
1913
1914 // Grabbing the output of the earlier compile step.
1915 StripArgs.push_back(Output.getFilename());
1916 ExtractArgs.push_back(Output.getFilename());
Eric Christopher59320e72013-02-21 22:35:01 +00001917 ExtractArgs.push_back(OutFile);
1918
1919 const char *Exec =
Eric Christopher80190392013-02-22 20:12:52 +00001920 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher59320e72013-02-21 22:35:01 +00001921
1922 // First extract the dwo sections.
Eric Christopher80190392013-02-22 20:12:52 +00001923 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00001924
1925 // Then remove them from the original .o file.
Eric Christopher80190392013-02-22 20:12:52 +00001926 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00001927}
1928
Chad Rosierb82e1172013-04-24 18:09:54 +00001929static bool isOptimizationLevelFast(const ArgList &Args) {
1930 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1931 if (A->getOption().matches(options::OPT_Ofast))
1932 return true;
1933 return false;
1934}
1935
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001936/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
1937static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
1938 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindola55ee1eb2013-08-27 16:58:15 +00001939 if (A->getOption().matches(options::OPT_O4) ||
1940 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001941 return true;
1942
1943 if (A->getOption().matches(options::OPT_O0))
1944 return false;
1945
1946 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
1947
Rafael Espindola168de192013-08-26 14:05:41 +00001948 // Vectorize -Os.
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001949 StringRef S(A->getValue());
Rafael Espindola168de192013-08-26 14:05:41 +00001950 if (S == "s")
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001951 return true;
1952
1953 // Don't vectorize -Oz.
1954 if (S == "z")
1955 return false;
1956
1957 unsigned OptLevel = 0;
1958 if (S.getAsInteger(10, OptLevel))
1959 return false;
1960
1961 return OptLevel > 1;
1962 }
1963
1964 return false;
1965}
1966
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001967void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar871adcf2009-03-18 07:06:02 +00001968 const InputInfo &Output,
Daniel Dunbar62cf6012009-03-18 06:07:59 +00001969 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00001970 const ArgList &Args,
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001971 const char *LinkingOutput) const {
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00001972 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1973 options::OPT_fapple_kext);
Daniel Dunbaree788e72009-12-21 18:54:17 +00001974 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001975 ArgStringList CmdArgs;
1976
Daniel Dunbar077ba6a2009-03-31 20:53:55 +00001977 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1978
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00001979 // Invoke ourselves in -cc1 mode.
1980 //
1981 // FIXME: Implement custom jobs for internal actions.
1982 CmdArgs.push_back("-cc1");
1983
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001984 // Add the "effective" target triple.
Daniel Dunbaraf07f932009-03-31 17:35:15 +00001985 CmdArgs.push_back("-triple");
Daniel Dunbar00577ad2010-08-23 22:35:37 +00001986 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001987 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbar728a5122009-09-10 06:49:20 +00001988
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001989 // Select the appropriate action.
John McCall260611a2012-06-20 06:18:46 +00001990 RewriteKind rewriteKind = RK_None;
Fariborz Jahaniane982cc02012-04-04 18:50:28 +00001991
Daniel Dunbar1d460332009-03-18 10:01:51 +00001992 if (isa<AnalyzeJobAction>(JA)) {
1993 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1994 CmdArgs.push_back("-analyze");
Ted Kremenek30660a82012-03-06 20:06:33 +00001995 } else if (isa<MigrateJobAction>(JA)) {
1996 CmdArgs.push_back("-migrate");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001997 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00001998 if (Output.getType() == types::TY_Dependencies)
1999 CmdArgs.push_back("-Eonly");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00002000 else {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00002001 CmdArgs.push_back("-E");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00002002 if (Args.hasArg(options::OPT_rewrite_objc) &&
2003 !Args.hasArg(options::OPT_g_Group))
2004 CmdArgs.push_back("-P");
2005 }
Daniel Dunbar8767cbc2010-02-03 03:07:56 +00002006 } else if (isa<AssembleJobAction>(JA)) {
2007 CmdArgs.push_back("-emit-obj");
Daniel Dunbar99298002010-05-27 06:18:05 +00002008
David Blaikie73168db2013-07-25 21:19:01 +00002009 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbard02bba82010-11-19 16:23:35 +00002010
2011 // Also ignore explicit -force_cpusubtype_ALL option.
2012 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002013 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +00002014 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00002015 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00002016
Aaron Ballman761322b2012-07-31 01:21:00 +00002017 if (JA.getType() == types::TY_Nothing)
2018 CmdArgs.push_back("-fsyntax-only");
2019 else if (UsePCH)
Douglas Gregordf91ef32009-04-18 00:34:01 +00002020 CmdArgs.push_back("-emit-pch");
2021 else
2022 CmdArgs.push_back("-emit-pth");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002023 } else {
2024 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002025
Daniel Dunbar1d460332009-03-18 10:01:51 +00002026 if (JA.getType() == types::TY_Nothing) {
2027 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00002028 } else if (JA.getType() == types::TY_LLVM_IR ||
2029 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002030 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00002031 } else if (JA.getType() == types::TY_LLVM_BC ||
2032 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002033 CmdArgs.push_back("-emit-llvm-bc");
2034 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbare3b8d072009-09-17 00:47:53 +00002035 CmdArgs.push_back("-S");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00002036 } else if (JA.getType() == types::TY_AST) {
2037 CmdArgs.push_back("-emit-pch");
Douglas Gregorc544ba02013-03-27 16:47:18 +00002038 } else if (JA.getType() == types::TY_ModuleFile) {
2039 CmdArgs.push_back("-module-file-info");
Daniel Dunbar64952502010-02-11 03:16:21 +00002040 } else if (JA.getType() == types::TY_RewrittenObjC) {
2041 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00002042 rewriteKind = RK_NonFragile;
Fariborz Jahanian582b3952012-04-02 15:59:19 +00002043 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2044 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00002045 rewriteKind = RK_Fragile;
Daniel Dunbar64952502010-02-11 03:16:21 +00002046 } else {
2047 assert(JA.getType() == types::TY_PP_Asm &&
2048 "Unexpected output type!");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002049 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002050 }
2051
Daniel Dunbar1d460332009-03-18 10:01:51 +00002052 // The make clang go fast button.
2053 CmdArgs.push_back("-disable-free");
2054
John McCallb689afb2010-02-13 03:50:24 +00002055 // Disable the verification pass in -asserts builds.
2056#ifdef NDEBUG
2057 CmdArgs.push_back("-disable-llvm-verifier");
2058#endif
2059
Daniel Dunbarc9abc042009-04-08 05:11:16 +00002060 // Set the main file name, so that debug info works even with
2061 // -save-temps.
2062 CmdArgs.push_back("-main-file-name");
Bob Wilson66b8a662012-11-23 06:14:39 +00002063 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbarc9abc042009-04-08 05:11:16 +00002064
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00002065 // Some flags which affect the language (via preprocessor
Bob Wilson66b8a662012-11-23 06:14:39 +00002066 // defines).
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00002067 if (Args.hasArg(options::OPT_static))
2068 CmdArgs.push_back("-static-define");
2069
Daniel Dunbar1d460332009-03-18 10:01:51 +00002070 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenekb8bb3e72009-09-25 05:55:59 +00002071 // Enable region store model by default.
2072 CmdArgs.push_back("-analyzer-store=region");
2073
Ted Kremenekb40d06d2009-12-07 22:26:14 +00002074 // Treat blocks as analysis entry points.
2075 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2076
Ted Kremenek51885072011-03-24 00:28:47 +00002077 CmdArgs.push_back("-analyzer-eagerly-assume");
2078
Daniel Dunbar1d460332009-03-18 10:01:51 +00002079 // Add default argument set.
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002080 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002081 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek51885072011-03-24 00:28:47 +00002082
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002083 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2084 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek51885072011-03-24 00:28:47 +00002085
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002086 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek51885072011-03-24 00:28:47 +00002087 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremeneka8180e52012-01-20 06:00:17 +00002088
2089 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek8dc05062012-01-26 02:27:38 +00002090
Jordan Rosee449edc2013-04-05 17:55:07 +00002091 if (types::isCXX(Inputs[0].getType()))
2092 CmdArgs.push_back("-analyzer-checker=cplusplus");
2093
Ted Kremenek8dc05062012-01-26 02:27:38 +00002094 // Enable the following experimental checkers for testing.
Ted Kremenek8dc05062012-01-26 02:27:38 +00002095 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2096 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2097 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2098 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2099 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2100 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002101 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002102
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002103 // Set the output format. The default is plist, for (lame) historical
2104 // reasons.
2105 CmdArgs.push_back("-analyzer-output");
2106 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smith1d489cf2012-11-01 04:30:05 +00002107 CmdArgs.push_back(A->getValue());
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002108 else
2109 CmdArgs.push_back("plist");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002110
Ted Kremenek0647a7b2010-03-22 22:32:05 +00002111 // Disable the presentation of standard compiler warnings when
2112 // using --analyze. We only want to show static analyzer diagnostics
2113 // or frontend errors.
2114 CmdArgs.push_back("-w");
2115
Daniel Dunbar1d460332009-03-18 10:01:51 +00002116 // Add -Xanalyzer arguments when running as analyzer.
2117 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump1eb44332009-09-09 15:08:12 +00002118 }
2119
Daniel Dunbare2fd6642009-09-10 01:21:12 +00002120 CheckCodeGenerationOptions(D, Args);
2121
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002122 bool PIE = getToolChain().isPIEDefault();
2123 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002124 bool IsPICLevelTwo = PIC;
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002125
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002126 // For the PIC and PIE flag options, this logic is different from the
2127 // legacy logic in very old versions of GCC, as that logic was just
2128 // a bug no one had ever fixed. This logic is both more rational and
2129 // consistent with GCC's new logic now that the bugs are fixed. The last
2130 // argument relating to either PIC or PIE wins, and no other argument is
2131 // used. If the last argument is any flavor of the '-fno-...' arguments,
2132 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2133 // at the same level.
2134 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2135 options::OPT_fpic, options::OPT_fno_pic,
2136 options::OPT_fPIE, options::OPT_fno_PIE,
2137 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002138 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2139 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002140 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002141 if (LastPICArg) {
2142 Option O = LastPICArg->getOption();
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002143 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2144 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2145 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2146 PIC = PIE || O.matches(options::OPT_fPIC) ||
2147 O.matches(options::OPT_fpic);
2148 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2149 O.matches(options::OPT_fPIC);
2150 } else {
2151 PIE = PIC = false;
2152 }
2153 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002154 }
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002155
Nick Lewyckyd4705682013-10-11 03:33:53 +00002156 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002157 // specified while enabling PIC enabled level 1 PIC, just force it back to
2158 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2159 // informal testing).
2160 if (PIC && getToolChain().getTriple().isOSDarwin())
2161 IsPICLevelTwo |= getToolChain().isPICDefault();
2162
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002163 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2164 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00002165 llvm::Triple Triple(TripleStr);
Eric Christopher6c7db892013-02-18 01:16:37 +00002166 if (KernelOrKext &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00002167 (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002168 PIC = PIE = false;
Simon Atanasyanc0e83642013-10-04 11:46:54 +00002169 if (Args.hasArg(options::OPT_static))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002170 PIC = PIE = false;
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002171
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002172 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2173 // This is a very special mode. It trumps the other modes, almost no one
2174 // uses it, and it isn't even valid on any OS but Darwin.
2175 if (!getToolChain().getTriple().isOSDarwin())
2176 D.Diag(diag::err_drv_unsupported_opt_for_target)
2177 << A->getSpelling() << getToolChain().getTriple().str();
2178
2179 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2180
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002181 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002182 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002183
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002184 // Only a forced PIC mode can cause the actual compile to have PIC defines
2185 // etc., no flags are sufficient. This behavior was selected to closely
2186 // match that of llvm-gcc and Apple GCC before that.
2187 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2188 CmdArgs.push_back("-pic-level");
2189 CmdArgs.push_back("2");
2190 }
2191 } else {
2192 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2193 // handled in Clang's IRGen by the -pie-level flag.
2194 CmdArgs.push_back("-mrelocation-model");
2195 CmdArgs.push_back(PIC ? "pic" : "static");
2196
2197 if (PIC) {
2198 CmdArgs.push_back("-pic-level");
2199 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2200 if (PIE) {
2201 CmdArgs.push_back("-pie-level");
2202 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2203 }
2204 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002205 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002206
Tanya Lattner59876c22009-11-04 01:18:09 +00002207 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2208 options::OPT_fno_merge_all_constants))
Chris Lattnerf44a1a02011-04-08 18:06:54 +00002209 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002210
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002211 // LLVM Code Generator Options.
2212
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002213 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2214 CmdArgs.push_back("-mregparm");
Richard Smith1d489cf2012-11-01 04:30:05 +00002215 CmdArgs.push_back(A->getValue());
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002216 }
2217
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00002218 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2219 options::OPT_freg_struct_return)) {
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002220 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCallb8b52972013-06-18 02:46:29 +00002221 D.Diag(diag::err_drv_unsupported_opt_for_target)
2222 << A->getSpelling() << getToolChain().getTriple().str();
2223 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2224 CmdArgs.push_back("-fpcc-struct-return");
2225 } else {
2226 assert(A->getOption().matches(options::OPT_freg_struct_return));
2227 CmdArgs.push_back("-freg-struct-return");
2228 }
2229 }
2230
Roman Divackycfe9af22011-03-01 17:40:53 +00002231 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2232 CmdArgs.push_back("-mrtd");
2233
Rafael Espindola6af27ec2011-12-14 21:02:23 +00002234 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002235 CmdArgs.push_back("-mdisable-fp-elim");
2236 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2237 options::OPT_fno_zero_initialized_in_bss))
2238 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb82e1172013-04-24 18:09:54 +00002239
2240 bool OFastEnabled = isOptimizationLevelFast(Args);
2241 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2242 // enabled. This alias option is being used to simplify the hasFlag logic.
2243 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2244 options::OPT_fstrict_aliasing;
2245 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Daniel Dunbar398c6102011-02-04 02:20:39 +00002246 options::OPT_fno_strict_aliasing,
2247 getToolChain().IsStrictAliasingDefault()))
Dan Gohman4d5625e2010-10-14 22:36:56 +00002248 CmdArgs.push_back("-relaxed-aliasing");
Manman Ren96d6c452013-10-11 20:48:38 +00002249 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2250 options::OPT_fno_struct_path_tbaa))
2251 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth82fe6ae2012-03-27 23:58:37 +00002252 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2253 false))
2254 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1db772b2012-01-23 08:29:12 +00002255 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2256 options::OPT_fno_optimize_sibling_calls))
2257 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002258
Eric Christopher31056272013-04-04 06:29:47 +00002259 // Handle segmented stacks.
2260 if (Args.hasArg(options::OPT_fsplit_stack))
2261 CmdArgs.push_back("-split-stacks");
Chad Rosierb82e1172013-04-24 18:09:54 +00002262
2263 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2264 // This alias option is being used to simplify the getLastArg logic.
2265 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2266 options::OPT_ffast_math;
Eric Christopher31056272013-04-04 06:29:47 +00002267
Chandler Carruthabf07a72012-01-02 14:19:45 +00002268 // Handle various floating point optimization flags, mapping them to the
2269 // appropriate LLVM code generation flags. The pattern for all of these is to
2270 // default off the codegen optimizations, and if any flag enables them and no
2271 // flag disables them after the flag enabling them, enable the codegen
2272 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb82e1172013-04-24 18:09:54 +00002273 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002274 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002275 options::OPT_ffinite_math_only,
2276 options::OPT_fno_finite_math_only,
2277 options::OPT_fhonor_infinities,
2278 options::OPT_fno_honor_infinities))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002279 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2280 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002281 A->getOption().getID() != options::OPT_fhonor_infinities)
2282 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb82e1172013-04-24 18:09:54 +00002283 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002284 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002285 options::OPT_ffinite_math_only,
2286 options::OPT_fno_finite_math_only,
2287 options::OPT_fhonor_nans,
2288 options::OPT_fno_honor_nans))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002289 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2290 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002291 A->getOption().getID() != options::OPT_fhonor_nans)
2292 CmdArgs.push_back("-menable-no-nans");
2293
Benjamin Kramer769aa2d2012-05-02 14:55:48 +00002294 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2295 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb82e1172013-04-24 18:09:54 +00002296 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002297 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002298 options::OPT_fmath_errno,
Chandler Carruthb69557e2013-05-18 20:47:36 +00002299 options::OPT_fno_math_errno)) {
2300 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2301 // However, turning *off* -ffast_math merely restores the toolchain default
2302 // (which may be false).
2303 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2304 A->getOption().getID() == options::OPT_ffast_math ||
2305 A->getOption().getID() == options::OPT_Ofast)
2306 MathErrno = false;
2307 else if (A->getOption().getID() == options::OPT_fmath_errno)
2308 MathErrno = true;
2309 }
Chandler Carruth4f50c502012-04-26 02:10:51 +00002310 if (MathErrno)
2311 CmdArgs.push_back("-fmath-errno");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002312
2313 // There are several flags which require disabling very specific
2314 // optimizations. Any of these being disabled forces us to turn off the
2315 // entire set of LLVM optimizations, so collect them through all the flag
2316 // madness.
2317 bool AssociativeMath = false;
Chad Rosierb82e1172013-04-24 18:09:54 +00002318 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002319 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002320 options::OPT_funsafe_math_optimizations,
2321 options::OPT_fno_unsafe_math_optimizations,
2322 options::OPT_fassociative_math,
2323 options::OPT_fno_associative_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002324 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2325 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002326 A->getOption().getID() != options::OPT_fno_associative_math)
2327 AssociativeMath = true;
2328 bool ReciprocalMath = false;
Chad Rosierb82e1172013-04-24 18:09:54 +00002329 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002330 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002331 options::OPT_funsafe_math_optimizations,
2332 options::OPT_fno_unsafe_math_optimizations,
2333 options::OPT_freciprocal_math,
2334 options::OPT_fno_reciprocal_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002335 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2336 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002337 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2338 ReciprocalMath = true;
2339 bool SignedZeros = true;
Chad Rosierb82e1172013-04-24 18:09:54 +00002340 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002341 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002342 options::OPT_funsafe_math_optimizations,
2343 options::OPT_fno_unsafe_math_optimizations,
2344 options::OPT_fsigned_zeros,
2345 options::OPT_fno_signed_zeros))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002346 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2347 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002348 A->getOption().getID() != options::OPT_fsigned_zeros)
2349 SignedZeros = false;
2350 bool TrappingMath = true;
Chad Rosierb82e1172013-04-24 18:09:54 +00002351 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002352 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002353 options::OPT_funsafe_math_optimizations,
2354 options::OPT_fno_unsafe_math_optimizations,
2355 options::OPT_ftrapping_math,
2356 options::OPT_fno_trapping_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002357 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2358 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002359 A->getOption().getID() != options::OPT_ftrapping_math)
2360 TrappingMath = false;
2361 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2362 !TrappingMath)
2363 CmdArgs.push_back("-menable-unsafe-fp-math");
2364
Lang Hamesc9686712012-07-06 00:59:19 +00002365
2366 // Validate and pass through -fp-contract option.
Chad Rosierb82e1172013-04-24 18:09:54 +00002367 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002368 options::OPT_fno_fast_math,
Lang Hamesc9686712012-07-06 00:59:19 +00002369 options::OPT_ffp_contract)) {
2370 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002371 StringRef Val = A->getValue();
Lang Hamesc9686712012-07-06 00:59:19 +00002372 if (Val == "fast" || Val == "on" || Val == "off") {
2373 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2374 } else {
2375 D.Diag(diag::err_drv_unsupported_option_argument)
2376 << A->getOption().getName() << Val;
2377 }
Chad Rosierb82e1172013-04-24 18:09:54 +00002378 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2379 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesc9686712012-07-06 00:59:19 +00002380 // If fast-math is set then set the fp-contract mode to fast.
2381 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2382 }
2383 }
2384
Bob Wilson455e72e2012-07-19 03:52:53 +00002385 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2386 // and if we find them, tell the frontend to provide the appropriate
2387 // preprocessor macros. This is distinct from enabling any optimizations as
2388 // these options induce language changes which must survive serialization
2389 // and deserialization, etc.
Chad Rosierb82e1172013-04-24 18:09:54 +00002390 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2391 options::OPT_fno_fast_math))
2392 if (!A->getOption().matches(options::OPT_fno_fast_math))
2393 CmdArgs.push_back("-ffast-math");
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002394 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2395 if (A->getOption().matches(options::OPT_ffinite_math_only))
2396 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002397
Daniel Dunbar1b718482010-05-14 22:00:22 +00002398 // Decide whether to use verbose asm. Verbose assembly is the default on
2399 // toolchains which have the integrated assembler on by default.
2400 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2401 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer20249a12010-10-21 03:16:25 +00002402 IsVerboseAsmDefault) ||
Daniel Dunbar1b718482010-05-14 22:00:22 +00002403 Args.hasArg(options::OPT_dA))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002404 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002405
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002406 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2407 CmdArgs.push_back("-mdebug-pass");
2408 CmdArgs.push_back("Structure");
2409 }
2410 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2411 CmdArgs.push_back("-mdebug-pass");
2412 CmdArgs.push_back("Arguments");
2413 }
2414
John McCalld0c2ec42010-02-19 02:45:38 +00002415 // Enable -mconstructor-aliases except on darwin, where we have to
2416 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson905c45f2011-10-14 05:03:44 +00002417 if (!getToolChain().getTriple().isOSDarwin())
John McCalld0c2ec42010-02-19 02:45:38 +00002418 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00002419
John McCall32096692011-03-18 02:56:14 +00002420 // Darwin's kernel doesn't support guard variables; just die if we
2421 // try to use them.
Bob Wilson905c45f2011-10-14 05:03:44 +00002422 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall32096692011-03-18 02:56:14 +00002423 CmdArgs.push_back("-fforbid-guard-variables");
2424
Douglas Gregor6f755502011-02-01 15:15:22 +00002425 if (Args.hasArg(options::OPT_mms_bitfields)) {
2426 CmdArgs.push_back("-mms-bitfields");
2427 }
John McCalld0c2ec42010-02-19 02:45:38 +00002428
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002429 // This is a coarse approximation of what llvm-gcc actually does, both
2430 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2431 // complicated ways.
2432 bool AsynchronousUnwindTables =
2433 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2434 options::OPT_fno_asynchronous_unwind_tables,
2435 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002436 !KernelOrKext);
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002437 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2438 AsynchronousUnwindTables))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002439 CmdArgs.push_back("-munwind-tables");
2440
Chandler Carrutha6b25812012-11-21 23:40:23 +00002441 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola8af669f2012-06-19 01:26:10 +00002442
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002443 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2444 CmdArgs.push_back("-mlimit-float-precision");
Richard Smith1d489cf2012-11-01 04:30:05 +00002445 CmdArgs.push_back(A->getValue());
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002446 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002447
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002448 // FIXME: Handle -mtune=.
2449 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002450
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002451 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002452 CmdArgs.push_back("-mcode-model");
Richard Smith1d489cf2012-11-01 04:30:05 +00002453 CmdArgs.push_back(A->getValue());
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002454 }
2455
Rafael Espindolab330e402013-08-20 22:12:08 +00002456 // Add the target cpu
2457 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2458 llvm::Triple ETriple(ETripleStr);
2459 std::string CPU = getCPUName(Args, ETriple);
2460 if (!CPU.empty()) {
2461 CmdArgs.push_back("-target-cpu");
2462 CmdArgs.push_back(Args.MakeArgString(CPU));
2463 }
2464
Rafael Espindola5389b842013-08-21 21:59:03 +00002465 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2466 CmdArgs.push_back("-mfpmath");
2467 CmdArgs.push_back(A->getValue());
2468 }
2469
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002470 // Add the target features
2471 getTargetFeatures(D, ETriple, Args, CmdArgs);
2472
Rafael Espindolab330e402013-08-20 22:12:08 +00002473 // Add target specific flags.
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002474 switch(getToolChain().getArch()) {
Daniel Dunbar6acda162009-09-09 22:33:08 +00002475 default:
2476 break;
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002477
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002478 case llvm::Triple::arm:
2479 case llvm::Triple::thumb:
Daniel Dunbarfa41d692011-03-17 17:10:06 +00002480 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002481 break;
2482
Eric Christophered734732010-03-02 02:41:08 +00002483 case llvm::Triple::mips:
2484 case llvm::Triple::mipsel:
Akira Hatanaka7ec02582011-09-21 02:13:07 +00002485 case llvm::Triple::mips64:
2486 case llvm::Triple::mips64el:
Eric Christophered734732010-03-02 02:41:08 +00002487 AddMIPSTargetArgs(Args, CmdArgs);
2488 break;
2489
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002490 case llvm::Triple::sparc:
2491 AddSparcTargetArgs(Args, CmdArgs);
2492 break;
2493
Daniel Dunbar6acda162009-09-09 22:33:08 +00002494 case llvm::Triple::x86:
2495 case llvm::Triple::x86_64:
2496 AddX86TargetArgs(Args, CmdArgs);
2497 break;
Tony Linthicum96319392011-12-12 21:14:55 +00002498
2499 case llvm::Triple::hexagon:
2500 AddHexagonTargetArgs(Args, CmdArgs);
2501 break;
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002502 }
2503
Hans Wennborgb3574792013-08-08 00:17:41 +00002504 // Add clang-cl arguments.
2505 if (getToolChain().getDriver().IsCLMode())
2506 AddClangCLArgs(Args, CmdArgs);
2507
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002508 // Pass the linker version in use.
2509 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2510 CmdArgs.push_back("-target-linker-version");
Richard Smith1d489cf2012-11-01 04:30:05 +00002511 CmdArgs.push_back(A->getValue());
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002512 }
2513
Eric Christopherd3e22df2013-04-03 01:58:53 +00002514 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbar1ad66482010-07-01 01:31:45 +00002515 CmdArgs.push_back("-momit-leaf-frame-pointer");
2516
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002517 // Explicitly error on some things we know we don't support and can't just
2518 // ignore.
2519 types::ID InputType = Inputs[0].getType();
Daniel Dunbare94db472010-09-24 19:39:37 +00002520 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2521 Arg *Unsupported;
Daniel Dunbare94db472010-09-24 19:39:37 +00002522 if (types::isCXX(InputType) &&
Bob Wilson905c45f2011-10-14 05:03:44 +00002523 getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002524 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilsona544aee2011-08-13 23:48:55 +00002525 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2526 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002527 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbare94db472010-09-24 19:39:37 +00002528 << Unsupported->getOption().getName();
2529 }
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002530 }
2531
Daniel Dunbar1d460332009-03-18 10:01:51 +00002532 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbarf7c16d92010-08-24 22:44:13 +00002533 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosier2b819102011-08-02 17:58:04 +00002534 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbar322c29f2011-02-02 21:11:35 +00002535 CmdArgs.push_back("-header-include-file");
2536 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2537 D.CCPrintHeadersFilename : "-");
2538 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002539 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump1eb44332009-09-09 15:08:12 +00002540 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002541
Chad Rosier2b819102011-08-02 17:58:04 +00002542 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00002543 CmdArgs.push_back("-diagnostic-log-file");
2544 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2545 D.CCLogDiagnosticsFilename : "-");
2546 }
2547
Eric Christopherc706c8e2013-02-05 07:29:57 +00002548 // Use the last option from "-g" group. "-gline-tables-only"
2549 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola18f36d92010-03-07 04:46:18 +00002550 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002551 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopherc706c8e2013-02-05 07:29:57 +00002552 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002553 CmdArgs.push_back("-gline-tables-only");
Manman Renfc0f91c2013-06-19 01:46:49 +00002554 else if (A->getOption().matches(options::OPT_gdwarf_2))
2555 CmdArgs.push_back("-gdwarf-2");
2556 else if (A->getOption().matches(options::OPT_gdwarf_3))
2557 CmdArgs.push_back("-gdwarf-3");
2558 else if (A->getOption().matches(options::OPT_gdwarf_4))
2559 CmdArgs.push_back("-gdwarf-4");
Eric Christopherc706c8e2013-02-05 07:29:57 +00002560 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren8ed38d82013-07-02 23:15:25 +00002561 !A->getOption().matches(options::OPT_ggdb0)) {
2562 // Default is dwarf-2 for darwin.
2563 if (getToolChain().getTriple().isOSDarwin())
2564 CmdArgs.push_back("-gdwarf-2");
2565 else
2566 CmdArgs.push_back("-g");
2567 }
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002568 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002569
Alexey Samsonov7f326072012-06-21 08:22:39 +00002570 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2571 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christopherda3301e2012-10-18 21:52:18 +00002572 if (Args.hasArg(options::OPT_gcolumn_info))
2573 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonov7f326072012-06-21 08:22:39 +00002574
Eric Christopher0f43a6d2013-09-13 22:37:55 +00002575 // FIXME: Move backend command line options to the module.
Eric Christopherc706c8e2013-02-05 07:29:57 +00002576 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2577 // splitting and extraction.
Eric Christopherf870e122013-02-21 22:35:05 +00002578 // FIXME: Currently only works on Linux.
Cameron Esfahani57b1da12013-09-14 01:09:11 +00002579 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherf870e122013-02-21 22:35:05 +00002580 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopherc706c8e2013-02-05 07:29:57 +00002581 CmdArgs.push_back("-g");
2582 CmdArgs.push_back("-backend-option");
2583 CmdArgs.push_back("-split-dwarf=Enable");
2584 }
2585
Eric Christopher0f43a6d2013-09-13 22:37:55 +00002586 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2587 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2588 CmdArgs.push_back("-backend-option");
2589 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2590 }
Eric Christopher3e8ac1b2013-06-18 00:03:50 +00002591
2592 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2593
Rafael Espindola9cf933a2010-05-06 21:06:04 +00002594 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2595 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2596
Chris Lattner7255a2d2010-06-22 00:03:40 +00002597 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2598
Nick Lewyckye8ba8d72011-04-21 23:44:07 +00002599 if (Args.hasArg(options::OPT_ftest_coverage) ||
2600 Args.hasArg(options::OPT_coverage))
2601 CmdArgs.push_back("-femit-coverage-notes");
2602 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2603 Args.hasArg(options::OPT_coverage))
2604 CmdArgs.push_back("-femit-coverage-data");
2605
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002606 if (C.getArgs().hasArg(options::OPT_c) ||
2607 C.getArgs().hasArg(options::OPT_S)) {
2608 if (Output.isFilename()) {
Nick Lewycky3dc05412011-05-05 00:08:20 +00002609 CmdArgs.push_back("-coverage-file");
Eric Christopher025b3d42013-02-22 00:24:40 +00002610 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky0f815f12013-03-07 08:28:53 +00002611 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolaa2148242013-08-10 01:40:10 +00002612 SmallString<128> Pwd;
2613 if (!llvm::sys::fs::current_path(Pwd)) {
2614 llvm::sys::path::append(Pwd, CoverageFilename.str());
2615 CoverageFilename.swap(Pwd);
Nick Lewycky0f815f12013-03-07 08:28:53 +00002616 }
2617 }
Eric Christopher025b3d42013-02-22 00:24:40 +00002618 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002619 }
2620 }
2621
Daniel Dunbara268fc02011-10-11 18:20:10 +00002622 // Pass options for controlling the default header search paths.
2623 if (Args.hasArg(options::OPT_nostdinc)) {
2624 CmdArgs.push_back("-nostdsysteminc");
2625 CmdArgs.push_back("-nobuiltininc");
2626 } else {
Daniel Dunbar92d6d402011-10-11 18:20:16 +00002627 if (Args.hasArg(options::OPT_nostdlibinc))
2628 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbara268fc02011-10-11 18:20:10 +00002629 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2630 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2631 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002632
Daniel Dunbar5f122322009-12-15 01:02:52 +00002633 // Pass the path to compiler resource files.
Daniel Dunbar5f122322009-12-15 01:02:52 +00002634 CmdArgs.push_back("-resource-dir");
Daniel Dunbar225c4172010-01-20 02:35:16 +00002635 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar2ac9fc22009-04-07 21:42:00 +00002636
Argyrios Kyrtzidis389db162010-11-03 22:45:23 +00002637 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2638
Ted Kremenek30660a82012-03-06 20:06:33 +00002639 bool ARCMTEnabled = false;
Argyrios Kyrtzidisdce3ce32013-09-17 19:14:29 +00002640 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002641 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002642 options::OPT_ccc_arcmt_modify,
2643 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002644 ARCMTEnabled = true;
John McCall8f0e8d22011-06-15 23:25:17 +00002645 switch (A->getOption().getID()) {
2646 default:
2647 llvm_unreachable("missed a case");
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002648 case options::OPT_ccc_arcmt_check:
John McCall8f0e8d22011-06-15 23:25:17 +00002649 CmdArgs.push_back("-arcmt-check");
2650 break;
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002651 case options::OPT_ccc_arcmt_modify:
John McCall8f0e8d22011-06-15 23:25:17 +00002652 CmdArgs.push_back("-arcmt-modify");
2653 break;
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002654 case options::OPT_ccc_arcmt_migrate:
2655 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenek30660a82012-03-06 20:06:33 +00002656 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002657 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidis7ee20492011-07-19 17:20:03 +00002658
2659 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2660 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002661 break;
John McCall8f0e8d22011-06-15 23:25:17 +00002662 }
2663 }
Argyrios Kyrtzidisf75ece42013-06-24 19:01:18 +00002664 } else {
2665 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2666 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2667 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCall8f0e8d22011-06-15 23:25:17 +00002668 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002669
Ted Kremenek30660a82012-03-06 20:06:33 +00002670 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2671 if (ARCMTEnabled) {
2672 D.Diag(diag::err_drv_argument_not_allowed_with)
2673 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2674 }
2675 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002676 CmdArgs.push_back(A->getValue());
Ted Kremenek30660a82012-03-06 20:06:33 +00002677
2678 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand4129992013-07-09 16:59:14 +00002679 options::OPT_objcmt_migrate_subscripting,
2680 options::OPT_objcmt_migrate_property)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002681 // None specified, means enable them all.
2682 CmdArgs.push_back("-objcmt-migrate-literals");
2683 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand4129992013-07-09 16:59:14 +00002684 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenek30660a82012-03-06 20:06:33 +00002685 } else {
2686 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2687 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand4129992013-07-09 16:59:14 +00002688 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenek30660a82012-03-06 20:06:33 +00002689 }
2690 }
2691
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002692 // Add preprocessing options like -I, -D, etc. if we are using the
2693 // preprocessor.
2694 //
2695 // FIXME: Support -fpreprocessed
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002696 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier9d718632013-01-24 19:14:47 +00002697 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002698
Rafael Espindola19d9d2e2011-07-21 23:40:37 +00002699 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2700 // that "The compiler can only warn and ignore the option if not recognized".
2701 // When building with ccache, it will pass -D options to clang even on
2702 // preprocessed inputs and configure concludes that -fPIC is not supported.
2703 Args.ClaimAllArgs(options::OPT_D);
2704
Rafael Espindola55ee1eb2013-08-27 16:58:15 +00002705 // Manually translate -O4 to -O3; let clang reject others.
2706 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2707 if (A->getOption().matches(options::OPT_O4)) {
2708 CmdArgs.push_back("-O3");
2709 D.Diag(diag::warn_O4_is_O3);
2710 } else {
2711 A->render(Args, CmdArgs);
2712 }
2713 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002714
Chad Rosierb2c08872012-12-12 20:06:31 +00002715 // Don't warn about unused -flto. This can happen when we're preprocessing or
2716 // precompiling.
2717 Args.ClaimAllArgs(options::OPT_flto);
2718
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002719 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremeneke8cf7d12012-07-07 05:53:30 +00002720 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2721 CmdArgs.push_back("-pedantic");
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002722 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002723 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard573d262009-04-07 22:13:21 +00002724
2725 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgadbb4552013-07-31 16:57:56 +00002726 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbard573d262009-04-07 22:13:21 +00002727 //
2728 // If a std is supplied, only add -trigraphs if it follows the
2729 // option.
2730 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2731 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes528365d2009-10-16 14:28:06 +00002732 if (types::isCXX(InputType))
Daniel Dunbar294691e2009-11-04 06:24:38 +00002733 CmdArgs.push_back("-std=c++98");
Nuno Lopes528365d2009-10-16 14:28:06 +00002734 else
Daniel Dunbar294691e2009-11-04 06:24:38 +00002735 CmdArgs.push_back("-std=c89");
Daniel Dunbard573d262009-04-07 22:13:21 +00002736 else
2737 Std->render(Args, CmdArgs);
2738
Daniel Dunbar0e100312010-06-14 21:23:08 +00002739 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2740 options::OPT_trigraphs))
2741 if (A != Std)
Daniel Dunbard573d262009-04-07 22:13:21 +00002742 A->render(Args, CmdArgs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002743 } else {
2744 // Honor -std-default.
Daniel Dunbar4a5290e2010-01-29 21:03:02 +00002745 //
2746 // FIXME: Clang doesn't correctly handle -std= when the input language
2747 // doesn't match. For the time being just ignore this for C++ inputs;
2748 // eventually we want to do all the standard defaulting here instead of
2749 // splitting it between the driver and clang -cc1.
2750 if (!types::isCXX(InputType))
Nico Weber50f88b92012-08-30 02:08:31 +00002751 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2752 "-std=", /*Joined=*/true);
2753 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2754 CmdArgs.push_back("-std=c++11");
2755
Daniel Dunbard573d262009-04-07 22:13:21 +00002756 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002757 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002758
Richard Smithe9813b32013-09-04 22:50:31 +00002759 // GCC's behavior for -Wwrite-strings is a bit strange:
2760 // * In C, this "warning flag" changes the types of string literals from
2761 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
2762 // for the discarded qualifier.
2763 // * In C++, this is just a normal warning flag.
2764 //
2765 // Implementing this warning correctly in C is hard, so we follow GCC's
2766 // behavior for now. FIXME: Directly diagnose uses of a string literal as
2767 // a non-const char* in C, rather than using this crude hack.
2768 if (!types::isCXX(InputType)) {
2769 // FIXME: This should behave just like a warning flag, and thus should also
2770 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
2771 Arg *WriteStrings =
2772 Args.getLastArg(options::OPT_Wwrite_strings,
2773 options::OPT_Wno_write_strings, options::OPT_w);
2774 if (WriteStrings &&
2775 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
2776 CmdArgs.push_back("-fconst-strings");
Chandler Carruth50465d12011-04-23 06:30:43 +00002777 }
2778
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002779 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruthf8c247d2011-04-23 19:48:40 +00002780 // during C++ compilation, which it is by default. GCC keeps this define even
2781 // in the presence of '-w', match this behavior bug-for-bug.
2782 if (types::isCXX(InputType) &&
2783 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2784 true)) {
2785 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002786 }
2787
Chandler Carruthc304ba32010-05-22 02:21:53 +00002788 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2789 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2790 if (Asm->getOption().matches(options::OPT_fasm))
2791 CmdArgs.push_back("-fgnu-keywords");
2792 else
2793 CmdArgs.push_back("-fno-gnu-keywords");
2794 }
2795
Rafael Espindola61b1efe2011-05-02 17:43:32 +00002796 if (ShouldDisableCFI(Args, getToolChain()))
2797 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolaf24a1512011-04-30 18:35:43 +00002798
Nick Lewyckyea523d72011-10-17 23:05:52 +00002799 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2800 CmdArgs.push_back("-fno-dwarf-directory-asm");
2801
Daniel Dunbarf4910132013-04-16 18:21:19 +00002802 if (ShouldDisableAutolink(Args, getToolChain()))
2803 CmdArgs.push_back("-fno-autolink");
2804
Chandler Carruthd566df62012-12-17 21:40:04 +00002805 // Add in -fdebug-compilation-dir if necessary.
2806 addDebugCompDirArg(Args, CmdArgs);
Nick Lewycky7c4fd912011-10-21 02:32:14 +00002807
Richard Smithc18c4232011-11-21 19:36:32 +00002808 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2809 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002810 CmdArgs.push_back("-ftemplate-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002811 CmdArgs.push_back(A->getValue());
Daniel Dunbar1d460332009-03-18 10:01:51 +00002812 }
2813
Richard Smithc18c4232011-11-21 19:36:32 +00002814 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2815 CmdArgs.push_back("-fconstexpr-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002816 CmdArgs.push_back(A->getValue());
Richard Smithc18c4232011-11-21 19:36:32 +00002817 }
2818
Richard Smithe7565632013-05-08 02:12:03 +00002819 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2820 CmdArgs.push_back("-fconstexpr-steps");
2821 CmdArgs.push_back(A->getValue());
2822 }
2823
Richard Smith9e738cc2013-02-22 01:59:51 +00002824 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2825 CmdArgs.push_back("-fbracket-depth");
2826 CmdArgs.push_back(A->getValue());
2827 }
2828
Argyrios Kyrtzidis1380a142010-11-18 00:20:36 +00002829 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2830 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002831 if (A->getNumValues()) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002832 StringRef bytes = A->getValue();
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002833 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2834 } else
2835 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidis3532fdd2010-11-17 23:11:54 +00002836 }
2837
Nuno Lopesb3198a82012-05-08 22:10:46 +00002838
Michael J. Spencerc6357102012-10-22 22:13:48 +00002839 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar66861e02009-11-20 22:21:36 +00002840 CmdArgs.push_back("-relocatable-pch");
Mike Stump1eb44332009-09-09 15:08:12 +00002841
Daniel Dunbar294691e2009-11-04 06:24:38 +00002842 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2843 CmdArgs.push_back("-fconstant-string-class");
Richard Smith1d489cf2012-11-01 04:30:05 +00002844 CmdArgs.push_back(A->getValue());
Daniel Dunbar294691e2009-11-04 06:24:38 +00002845 }
David Chisnall8a5a9aa2009-08-31 16:41:57 +00002846
Chris Lattner124fca52010-01-09 21:54:33 +00002847 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2848 CmdArgs.push_back("-ftabstop");
Richard Smith1d489cf2012-11-01 04:30:05 +00002849 CmdArgs.push_back(A->getValue());
Chris Lattner124fca52010-01-09 21:54:33 +00002850 }
2851
Chris Lattner0f0c9632010-04-07 20:49:23 +00002852 CmdArgs.push_back("-ferror-limit");
2853 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smith1d489cf2012-11-01 04:30:05 +00002854 CmdArgs.push_back(A->getValue());
Chris Lattner0f0c9632010-04-07 20:49:23 +00002855 else
2856 CmdArgs.push_back("19");
Douglas Gregor575cf372010-04-20 07:18:24 +00002857
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002858 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2859 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002860 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002861 }
2862
2863 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2864 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002865 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002866 }
2867
Richard Smith08d6e032011-12-16 19:06:07 +00002868 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2869 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002870 CmdArgs.push_back(A->getValue());
Richard Smith08d6e032011-12-16 19:06:07 +00002871 }
2872
Daniel Dunbar55efe142009-11-04 06:24:47 +00002873 // Pass -fmessage-length=.
Daniel Dunbara28690e2009-11-30 08:40:54 +00002874 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar55efe142009-11-04 06:24:47 +00002875 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002876 CmdArgs.push_back(A->getValue());
Daniel Dunbar55efe142009-11-04 06:24:47 +00002877 } else {
2878 // If -fmessage-length=N was not specified, determine whether this is a
2879 // terminal and, if so, implicitly define -fmessage-length appropriately.
2880 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner5f9e2722011-07-23 10:55:15 +00002881 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar55efe142009-11-04 06:24:47 +00002882 }
2883
John McCalla880b192013-02-19 01:57:35 +00002884 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2885 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2886 options::OPT_fvisibility_ms_compat)) {
2887 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2888 CmdArgs.push_back("-fvisibility");
2889 CmdArgs.push_back(A->getValue());
2890 } else {
2891 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2892 CmdArgs.push_back("-fvisibility");
2893 CmdArgs.push_back("hidden");
2894 CmdArgs.push_back("-ftype-visibility");
2895 CmdArgs.push_back("default");
2896 }
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002897 }
2898
Douglas Gregor7cf84d62010-06-15 17:05:35 +00002899 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002900
Hans Wennborgde981f32012-06-28 08:01:44 +00002901 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2902
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002903 // -fhosted is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002904 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2905 KernelOrKext)
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002906 CmdArgs.push_back("-ffreestanding");
2907
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002908 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002909 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002910 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patelc69e1cf2010-09-30 19:05:55 +00002911 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel033be8b2011-11-04 20:05:58 +00002912 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christophere88c4512011-10-25 07:13:06 +00002913 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidt9e0b6472013-07-03 15:36:02 +00002914 // AltiVec language extensions aren't relevant for assembling.
2915 if (!isa<PreprocessJobAction>(JA) ||
2916 Output.getType() != types::TY_PP_Asm)
2917 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu246b6aa2012-06-26 18:18:47 +00002918 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2919 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier4574c3d2012-03-13 23:45:51 +00002920
Alexey Samsonov1b8f12d2013-08-19 09:14:21 +00002921 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Alexey Samsonov8bdc92c2013-08-09 07:42:13 +00002922 Sanitize.addArgs(getToolChain(), Args, CmdArgs);
Richard Smithc4dabad2012-11-05 22:04:41 +00002923
Will Dietz2d382d12012-12-30 20:53:28 +00002924 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2925 options::OPT_fno_sanitize_recover,
2926 true))
2927 CmdArgs.push_back("-fno-sanitize-recover");
2928
Chad Rosier78d85b12013-01-29 23:31:22 +00002929 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2930 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2931 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2932 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2933
Eric Christopher98654c92013-02-19 06:16:53 +00002934 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier4574c3d2012-03-13 23:45:51 +00002935 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002936 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00002937 getToolChain().getArch() == llvm::Triple::ppc64 ||
2938 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier4574c3d2012-03-13 23:45:51 +00002939 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00002940 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier4574c3d2012-03-13 23:45:51 +00002941
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00002942 if (getToolChain().SupportsProfiling())
2943 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00002944
2945 // -flax-vector-conversions is default.
2946 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2947 options::OPT_fno_lax_vector_conversions))
2948 CmdArgs.push_back("-fno-lax-vector-conversions");
2949
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002950 if (Args.getLastArg(options::OPT_fapple_kext))
2951 CmdArgs.push_back("-fapple-kext");
2952
David Blaikie940152f2012-06-14 18:55:27 +00002953 if (Args.hasFlag(options::OPT_frewrite_includes,
2954 options::OPT_fno_rewrite_includes, false))
2955 CmdArgs.push_back("-frewrite-includes");
2956
Fariborz Jahanian34e65772009-05-22 20:17:16 +00002957 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner182e0922009-04-21 05:34:31 +00002958 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregor4786c152010-08-19 20:24:43 +00002959 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002960 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2961 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnall7f18e672010-09-17 18:29:54 +00002962
2963 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2964 CmdArgs.push_back("-ftrapv-handler");
Richard Smith1d489cf2012-11-01 04:30:05 +00002965 CmdArgs.push_back(A->getValue());
David Chisnall7f18e672010-09-17 18:29:54 +00002966 }
2967
Bob Wilson71fd6cc2012-02-03 06:27:22 +00002968 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng49af1f32011-04-08 21:37:45 +00002969
Chandler Carruth5adb5a82011-03-27 00:04:55 +00002970 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2971 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2972 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2973 options::OPT_fno_wrapv)) {
2974 if (A->getOption().matches(options::OPT_fwrapv))
2975 CmdArgs.push_back("-fwrapv");
2976 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2977 options::OPT_fno_strict_overflow)) {
2978 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2979 CmdArgs.push_back("-fwrapv");
2980 }
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002981 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruthb26404a2013-08-08 08:34:35 +00002982 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
2983 options::OPT_fno_unroll_loops);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002984
Daniel Dunbar5345c392009-09-03 04:54:28 +00002985 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2986
Mahesha Sf3b52312012-10-27 07:47:56 +00002987
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002988 // -stack-protector=0 is default.
2989 unsigned StackProtectorLevel = 0;
Bill Wendling45483f72009-06-28 07:36:13 +00002990 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2991 options::OPT_fstack_protector_all,
2992 options::OPT_fstack_protector)) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002993 if (A->getOption().matches(options::OPT_fstack_protector))
2994 StackProtectorLevel = 1;
2995 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2996 StackProtectorLevel = 2;
Nico Weber2fef1112011-08-23 07:38:27 +00002997 } else {
2998 StackProtectorLevel =
2999 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3000 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003001 if (StackProtectorLevel) {
3002 CmdArgs.push_back("-stack-protector");
Chris Lattner5f9e2722011-07-23 10:55:15 +00003003 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003004 }
Chad Rosiera7afeb02012-08-21 16:16:06 +00003005
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003006 // --param ssp-buffer-size=
3007 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3008 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003009 StringRef Str((*it)->getValue());
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003010 if (Str.startswith("ssp-buffer-size=")) {
3011 if (StackProtectorLevel) {
Chad Rosiera7afeb02012-08-21 16:16:06 +00003012 CmdArgs.push_back("-stack-protector-buffer-size");
3013 // FIXME: Verify the argument is a valid integer.
3014 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosiera7afeb02012-08-21 16:16:06 +00003015 }
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003016 (*it)->claim();
Chad Rosiera7afeb02012-08-21 16:16:06 +00003017 }
Bill Wendling45483f72009-06-28 07:36:13 +00003018 }
3019
Nick Lewycky4e785c92011-12-06 03:33:03 +00003020 // Translate -mstackrealign
3021 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3022 false)) {
3023 CmdArgs.push_back("-backend-option");
3024 CmdArgs.push_back("-force-align-stack");
3025 }
3026 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3027 false)) {
3028 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3029 }
3030
Joerg Sonnenbergere9d11db2011-12-05 23:05:23 +00003031 if (Args.hasArg(options::OPT_mstack_alignment)) {
3032 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3033 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopher1a584022011-05-02 21:18:22 +00003034 }
Chad Rosier586a0612012-11-29 00:42:06 +00003035 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golin02ab7d32013-08-24 14:44:41 +00003036 if (!KernelOrKext) {
Renato Golinb69f9e02013-08-28 23:56:07 +00003037 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3038 options::OPT_munaligned_access)) {
3039 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3040 CmdArgs.push_back("-backend-option");
3041 CmdArgs.push_back("-arm-strict-align");
3042 } else {
3043 CmdArgs.push_back("-backend-option");
3044 CmdArgs.push_back("-arm-no-strict-align");
3045 }
Renato Golin02ab7d32013-08-24 14:44:41 +00003046 }
Chad Rosier7e293272012-11-09 17:29:19 +00003047 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00003048
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003049 // Forward -f options with positive and negative forms; we translate
3050 // these by hand.
3051
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003052 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar2843c192011-02-04 17:24:47 +00003053 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003054 CmdArgs.push_back("-fapple-kext");
3055 if (!Args.hasArg(options::OPT_fbuiltin))
3056 CmdArgs.push_back("-fno-builtin");
Chad Rosier3d265502012-03-26 21:29:17 +00003057 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003058 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003059 // -fbuiltin is default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003060 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar53e84842009-11-19 04:55:23 +00003061 CmdArgs.push_back("-fno-builtin");
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003062
Nuno Lopesfc284482009-12-16 16:59:22 +00003063 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3064 options::OPT_fno_assume_sane_operator_new))
3065 CmdArgs.push_back("-fno-assume-sane-operator-new");
3066
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003067 // -fblocks=0 is default.
3068 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnalle6533ff2011-02-28 17:11:43 +00003069 getToolChain().IsBlocksDefault()) ||
3070 (Args.hasArg(options::OPT_fgnu_runtime) &&
3071 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3072 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003073 CmdArgs.push_back("-fblocks");
John McCall13db5cf2011-09-09 20:41:01 +00003074
3075 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3076 !getToolChain().hasBlocksRuntime())
3077 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall5e530af2009-11-17 19:33:30 +00003078 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003079
Douglas Gregor64554ba2012-01-18 15:19:58 +00003080 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3081 // users must also pass -fcxx-modules. The latter flag will disappear once the
3082 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorf43b7212013-01-16 01:23:41 +00003083 bool HaveModules = false;
Douglas Gregor64554ba2012-01-18 15:19:58 +00003084 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3085 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3086 options::OPT_fno_cxx_modules,
3087 false);
Douglas Gregorf43b7212013-01-16 01:23:41 +00003088 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor64554ba2012-01-18 15:19:58 +00003089 CmdArgs.push_back("-fmodules");
Douglas Gregorf43b7212013-01-16 01:23:41 +00003090 HaveModules = true;
3091 }
3092 }
3093
Daniel Jasper056ec122013-08-05 20:26:17 +00003094 // -fmodule-maps enables module map processing (off by default) for header
3095 // checking. It is implied by -fmodules.
3096 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3097 false)) {
3098 CmdArgs.push_back("-fmodule-maps");
3099 }
3100
Daniel Jasper95411412013-10-21 06:34:34 +00003101 // -fmodules-decluse checks that modules used are declared so (off by
3102 // default).
Daniel Jasperddd2dfc2013-09-24 09:14:14 +00003103 if (Args.hasFlag(options::OPT_fmodules_decluse,
3104 options::OPT_fno_modules_decluse,
3105 false)) {
Daniel Jasper097595a2013-09-29 12:40:54 +00003106 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperddd2dfc2013-09-24 09:14:14 +00003107 }
3108
Daniel Jasper95411412013-10-21 06:34:34 +00003109 // -fmodule-name specifies the module that is currently being built (or
3110 // used for header checking by -fmodule-maps).
3111 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3112 A->claim();
3113 A->render(Args, CmdArgs);
3114 }
3115
3116 // -fmodule-map-file can be used to specify a file containing module
3117 // definitions.
3118 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3119 A->claim();
3120 A->render(Args, CmdArgs);
3121 }
3122
Douglas Gregor953a61f2013-02-07 19:01:24 +00003123 // If a module path was provided, pass it along. Otherwise, use a temporary
3124 // directory.
3125 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3126 A->claim();
3127 if (HaveModules) {
3128 A->render(Args, CmdArgs);
3129 }
3130 } else if (HaveModules) {
3131 SmallString<128> DefaultModuleCache;
3132 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3133 DefaultModuleCache);
Douglas Gregor892b6fb2013-03-21 21:48:48 +00003134 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3135 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor250172a2013-02-07 22:59:12 +00003136 const char Arg[] = "-fmodules-cache-path=";
3137 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3138 Arg, Arg + strlen(Arg));
Douglas Gregor953a61f2013-02-07 19:01:24 +00003139 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3140 }
3141
3142 // Pass through all -fmodules-ignore-macro arguments.
3143 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregord44d2872013-03-25 21:19:16 +00003144 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3145 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor953a61f2013-02-07 19:01:24 +00003146
John McCall32579cf2010-04-09 19:12:06 +00003147 // -faccess-control is default.
John McCall7002f4c2010-04-09 19:03:51 +00003148 if (Args.hasFlag(options::OPT_fno_access_control,
3149 options::OPT_faccess_control,
John McCall32579cf2010-04-09 19:12:06 +00003150 false))
John McCall7002f4c2010-04-09 19:03:51 +00003151 CmdArgs.push_back("-fno-access-control");
John McCall3ddd6e02010-03-17 01:32:13 +00003152
Anders Carlssona4c24752010-11-21 00:09:52 +00003153 // -felide-constructors is the default.
3154 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3155 options::OPT_felide_constructors,
3156 false))
3157 CmdArgs.push_back("-fno-elide-constructors");
3158
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003159 // -frtti is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00003160 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smithc4dabad2012-11-05 22:04:41 +00003161 KernelOrKext) {
Daniel Dunbar53e84842009-11-19 04:55:23 +00003162 CmdArgs.push_back("-fno-rtti");
Mike Stump738f8c22009-07-31 23:15:31 +00003163
Richard Smithc4dabad2012-11-05 22:04:41 +00003164 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonovbb1071c2012-11-06 15:09:03 +00003165 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumi03c60762012-11-06 22:02:00 +00003166 std::string NoRttiArg =
Richard Smithc4dabad2012-11-05 22:04:41 +00003167 Args.getLastArg(options::OPT_mkernel,
3168 options::OPT_fapple_kext,
Richard Smith04fd3822012-11-06 01:12:02 +00003169 options::OPT_fno_rtti)->getAsString(Args);
Richard Smithc4dabad2012-11-05 22:04:41 +00003170 D.Diag(diag::err_drv_argument_not_allowed_with)
3171 << "-fsanitize=vptr" << NoRttiArg;
3172 }
3173 }
3174
Tony Linthicum96319392011-12-12 21:14:55 +00003175 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00003176 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum96319392011-12-12 21:14:55 +00003177 options::OPT_fno_short_enums,
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003178 getToolChain().getArch() ==
Tony Linthicum96319392011-12-12 21:14:55 +00003179 llvm::Triple::hexagon))
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00003180 CmdArgs.push_back("-fshort-enums");
3181
Daniel Dunbar1f95e652009-11-17 06:37:03 +00003182 // -fsigned-char is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00003183 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbar1f95e652009-11-17 06:37:03 +00003184 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar76743522009-11-29 02:39:08 +00003185 CmdArgs.push_back("-fno-signed-char");
Eli Friedman5a779732009-06-05 07:21:14 +00003186
Anders Carlssona508b7d2010-02-06 23:23:06 +00003187 // -fthreadsafe-static is default.
Michael J. Spencer20249a12010-10-21 03:16:25 +00003188 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssona508b7d2010-02-06 23:23:06 +00003189 options::OPT_fno_threadsafe_statics))
3190 CmdArgs.push_back("-fno-threadsafe-statics");
3191
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00003192 // -fuse-cxa-atexit is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00003193 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3194 options::OPT_fno_use_cxa_atexit,
3195 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum96319392011-12-12 21:14:55 +00003196 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003197 getToolChain().getArch() != llvm::Triple::hexagon) ||
Chad Rosierafc4baa2012-03-26 22:04:46 +00003198 KernelOrKext)
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00003199 CmdArgs.push_back("-fno-use-cxa-atexit");
3200
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003201 // -fms-extensions=0 is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00003202 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003203 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3204 CmdArgs.push_back("-fms-extensions");
3205
Francois Pichetae556082011-09-17 04:32:15 +00003206 // -fms-compatibility=0 is default.
Douglas Gregorba97b6e2011-10-24 15:49:38 +00003207 if (Args.hasFlag(options::OPT_fms_compatibility,
3208 options::OPT_fno_ms_compatibility,
3209 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3210 Args.hasFlag(options::OPT_fms_extensions,
3211 options::OPT_fno_ms_extensions,
3212 true))))
Francois Pichetae556082011-09-17 04:32:15 +00003213 CmdArgs.push_back("-fms-compatibility");
3214
Reid Kleckner8c64c182013-09-18 00:33:59 +00003215 // -fmsc-version=1700 is default.
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003216 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3217 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3218 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00003219 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003220 if (msc_ver.empty())
Reid Kleckner8c64c182013-09-18 00:33:59 +00003221 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003222 else
3223 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3224 }
3225
3226
Eric Christophercfc01e42013-02-18 00:38:31 +00003227 // -fno-borland-extensions is default.
Dawn Perchik400b6072010-09-02 23:59:25 +00003228 if (Args.hasFlag(options::OPT_fborland_extensions,
3229 options::OPT_fno_borland_extensions, false))
3230 CmdArgs.push_back("-fborland-extensions");
3231
Francois Pichet8efcc012011-09-01 16:38:08 +00003232 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3233 // needs it.
Francois Pichet8387e2a2011-04-22 22:18:13 +00003234 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3235 options::OPT_fno_delayed_template_parsing,
Francois Pichet8efcc012011-09-01 16:38:08 +00003236 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet805bc1f2011-08-26 00:22:34 +00003237 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet8387e2a2011-04-22 22:18:13 +00003238
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00003239 // -fgnu-keywords default varies depending on language; only pass if
3240 // specified.
3241 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbar40788d92010-04-24 17:56:39 +00003242 options::OPT_fno_gnu_keywords))
3243 A->render(Args, CmdArgs);
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00003244
Rafael Espindola01ba8542011-06-02 17:30:53 +00003245 if (Args.hasFlag(options::OPT_fgnu89_inline,
3246 options::OPT_fno_gnu89_inline,
3247 false))
Rafael Espindolafb3f4aa2011-06-02 16:13:27 +00003248 CmdArgs.push_back("-fgnu89-inline");
3249
Chad Rosierfc055f92012-03-15 22:31:42 +00003250 if (Args.hasArg(options::OPT_fno_inline))
3251 CmdArgs.push_back("-fno-inline");
3252
Chad Rosier634a4b12012-03-06 21:17:19 +00003253 if (Args.hasArg(options::OPT_fno_inline_functions))
3254 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier250008b2012-03-06 18:49:20 +00003255
John McCall260611a2012-06-20 06:18:46 +00003256 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall9f084a32011-07-06 00:26:06 +00003257
John McCall260611a2012-06-20 06:18:46 +00003258 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahaniana6f5cc32013-10-15 17:16:30 +00003259 // legacy is the default. Next runtime is always legacy dispatch and
3260 // -fno-objc-legacy-dispatch gets ignored silently.
3261 if (objcRuntime.isNonFragile() && !objcRuntime.isNeXTFamily()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003262 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3263 options::OPT_fno_objc_legacy_dispatch,
David Chisnall2c7886d2012-07-04 11:52:24 +00003264 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003265 getToolChain().getArch()))) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003266 if (getToolChain().UseObjCMixedDispatch())
3267 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3268 else
3269 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3270 }
3271 }
3272
Fariborz Jahanian3d145f62012-11-15 19:02:45 +00003273 // -fencode-extended-block-signature=1 is default.
3274 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3275 CmdArgs.push_back("-fencode-extended-block-signature");
3276 }
3277
John McCall9f084a32011-07-06 00:26:06 +00003278 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3279 // NOTE: This logic is duplicated in ToolChains.cpp.
3280 bool ARC = isObjCAutoRefCount(Args);
3281 if (ARC) {
John McCall0a7dd782012-08-21 02:47:43 +00003282 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis5840dd92012-02-29 03:43:52 +00003283
John McCall9f084a32011-07-06 00:26:06 +00003284 CmdArgs.push_back("-fobjc-arc");
3285
Chandler Carruth7ffa0322011-11-04 07:34:47 +00003286 // FIXME: It seems like this entire block, and several around it should be
3287 // wrapped in isObjC, but for now we just use it here as this is where it
3288 // was being used previously.
3289 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3290 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3291 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3292 else
3293 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3294 }
3295
John McCall9f084a32011-07-06 00:26:06 +00003296 // Allow the user to enable full exceptions code emission.
3297 // We define off for Objective-CC, on for Objective-C++.
3298 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3299 options::OPT_fno_objc_arc_exceptions,
3300 /*default*/ types::isCXX(InputType)))
3301 CmdArgs.push_back("-fobjc-arc-exceptions");
3302 }
3303
3304 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3305 // rewriter.
John McCall260611a2012-06-20 06:18:46 +00003306 if (rewriteKind != RK_None)
John McCall9f084a32011-07-06 00:26:06 +00003307 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003308
John McCall9f084a32011-07-06 00:26:06 +00003309 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3310 // takes precedence.
3311 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3312 if (!GCArg)
3313 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3314 if (GCArg) {
3315 if (ARC) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00003316 D.Diag(diag::err_drv_objc_gc_arr)
John McCall9f084a32011-07-06 00:26:06 +00003317 << GCArg->getAsString(Args);
3318 } else if (getToolChain().SupportsObjCGC()) {
3319 GCArg->render(Args, CmdArgs);
3320 } else {
3321 // FIXME: We should move this to a hard error.
Chris Lattner5f9e2722011-07-23 10:55:15 +00003322 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall9f084a32011-07-06 00:26:06 +00003323 << GCArg->getAsString(Args);
3324 }
3325 }
3326
John McCalld71315c2011-06-22 00:53:57 +00003327 // Add exception args.
3328 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall260611a2012-06-20 06:18:46 +00003329 KernelOrKext, objcRuntime, CmdArgs);
John McCalld71315c2011-06-22 00:53:57 +00003330
3331 if (getToolChain().UseSjLjExceptions())
3332 CmdArgs.push_back("-fsjlj-exceptions");
3333
3334 // C++ "sane" operator new.
Daniel Dunbar984eb862010-02-01 21:07:25 +00003335 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3336 options::OPT_fno_assume_sane_operator_new))
3337 CmdArgs.push_back("-fno-assume-sane-operator-new");
3338
Daniel Dunbarf35f14d2010-04-27 15:34:57 +00003339 // -fconstant-cfstrings is default, and may be subject to argument translation
3340 // on Darwin.
3341 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3342 options::OPT_fno_constant_cfstrings) ||
3343 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3344 options::OPT_mno_constant_cfstrings))
3345 CmdArgs.push_back("-fno-constant-cfstrings");
3346
John Thompsona6fda122009-11-05 20:14:16 +00003347 // -fshort-wchar default varies depending on platform; only
3348 // pass if specified.
Daniel Dunbar1744a352010-04-27 15:35:03 +00003349 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3350 A->render(Args, CmdArgs);
John Thompsona6fda122009-11-05 20:14:16 +00003351
Hans Wennborgb087a5d2013-07-31 23:39:13 +00003352 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003353 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00003354 options::OPT_fno_pascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00003355 false))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003356 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00003357
Daniel Dunbar88934e82011-10-05 21:04:55 +00003358 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3359 // -fno-pack-struct doesn't apply to -fpack-struct=.
3360 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloy8049c442012-05-02 07:56:14 +00003361 std::string PackStructStr = "-fpack-struct=";
Richard Smith1d489cf2012-11-01 04:30:05 +00003362 PackStructStr += A->getValue();
James Molloy8049c442012-05-02 07:56:14 +00003363 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar88934e82011-10-05 21:04:55 +00003364 } else if (Args.hasFlag(options::OPT_fpack_struct,
3365 options::OPT_fno_pack_struct, false)) {
James Molloy8049c442012-05-02 07:56:14 +00003366 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar88934e82011-10-05 21:04:55 +00003367 }
3368
Robert Lytton5f15f4d2013-08-13 09:43:10 +00003369 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003370 if (!Args.hasArg(options::OPT_fcommon))
3371 CmdArgs.push_back("-fno-common");
Chad Rosierec09b3e2012-03-26 21:35:40 +00003372 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003373 }
Daniel Dunbar88934e82011-10-05 21:04:55 +00003374
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003375 // -fcommon is default, only pass non-default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003376 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003377 CmdArgs.push_back("-fno-common");
3378
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003379 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003380 // -funsigned-bitfields.
Mike Stump1eb44332009-09-09 15:08:12 +00003381 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003382 options::OPT_funsigned_bitfields))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003383 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003384 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3385
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003386 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3387 if (!Args.hasFlag(options::OPT_ffor_scope,
3388 options::OPT_fno_for_scope))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003389 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003390 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3391
Jeffrey Yasskin0ea22fd2010-06-08 04:56:20 +00003392 // -fcaret-diagnostics is default.
3393 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3394 options::OPT_fno_caret_diagnostics, true))
3395 CmdArgs.push_back("-fno-caret-diagnostics");
3396
Daniel Dunbar49138fc2009-04-19 21:09:34 +00003397 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump1eb44332009-09-09 15:08:12 +00003398 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar49138fc2009-04-19 21:09:34 +00003399 options::OPT_fno_diagnostics_fixit_info))
3400 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003401
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003402 // Enable -fdiagnostics-show-option by default.
Mike Stump1eb44332009-09-09 15:08:12 +00003403 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003404 options::OPT_fno_diagnostics_show_option))
3405 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar838be482009-11-04 06:24:57 +00003406
Chris Lattner6fbe8392010-05-04 21:55:25 +00003407 if (const Arg *A =
3408 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3409 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smith1d489cf2012-11-01 04:30:05 +00003410 CmdArgs.push_back(A->getValue());
Chris Lattner6fbe8392010-05-04 21:55:25 +00003411 }
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003412
Douglas Gregorc9471b02011-05-21 17:07:29 +00003413 if (const Arg *A =
3414 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3415 CmdArgs.push_back("-fdiagnostics-format");
Richard Smith1d489cf2012-11-01 04:30:05 +00003416 CmdArgs.push_back(A->getValue());
Douglas Gregorc9471b02011-05-21 17:07:29 +00003417 }
3418
Chandler Carruthabaca7a2011-03-27 01:50:55 +00003419 if (Arg *A = Args.getLastArg(
3420 options::OPT_fdiagnostics_show_note_include_stack,
3421 options::OPT_fno_diagnostics_show_note_include_stack)) {
3422 if (A->getOption().matches(
3423 options::OPT_fdiagnostics_show_note_include_stack))
3424 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3425 else
3426 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3427 }
3428
Daniel Dunbar838be482009-11-04 06:24:57 +00003429 // Color diagnostics are the default, unless the terminal doesn't support
3430 // them.
Nico Weber9753d462013-04-17 21:52:44 +00003431 // Support both clang's -f[no-]color-diagnostics and gcc's
3432 // -f[no-]diagnostics-colors[=never|always|auto].
3433 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3434 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3435 it != ie; ++it) {
3436 const Option &O = (*it)->getOption();
3437 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3438 !O.matches(options::OPT_fdiagnostics_color) &&
3439 !O.matches(options::OPT_fno_color_diagnostics) &&
3440 !O.matches(options::OPT_fno_diagnostics_color) &&
3441 !O.matches(options::OPT_fdiagnostics_color_EQ))
3442 continue;
3443
3444 (*it)->claim();
3445 if (O.matches(options::OPT_fcolor_diagnostics) ||
3446 O.matches(options::OPT_fdiagnostics_color)) {
3447 ShowColors = Colors_On;
3448 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3449 O.matches(options::OPT_fno_diagnostics_color)) {
3450 ShowColors = Colors_Off;
3451 } else {
3452 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3453 StringRef value((*it)->getValue());
3454 if (value == "always")
3455 ShowColors = Colors_On;
3456 else if (value == "never")
3457 ShowColors = Colors_Off;
3458 else if (value == "auto")
3459 ShowColors = Colors_Auto;
3460 else
3461 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3462 << ("-fdiagnostics-color=" + value).str();
3463 }
3464 }
3465 if (ShowColors == Colors_On ||
3466 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar838be482009-11-04 06:24:57 +00003467 CmdArgs.push_back("-fcolor-diagnostics");
3468
Nico Rieck2956ef42013-09-11 00:38:02 +00003469 if (Args.hasArg(options::OPT_fansi_escape_codes))
3470 CmdArgs.push_back("-fansi-escape-codes");
3471
Daniel Dunbar75eb1d62009-06-08 21:13:54 +00003472 if (!Args.hasFlag(options::OPT_fshow_source_location,
3473 options::OPT_fno_show_source_location))
3474 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003475
Douglas Gregorc9471b02011-05-21 17:07:29 +00003476 if (!Args.hasFlag(options::OPT_fshow_column,
3477 options::OPT_fno_show_column,
3478 true))
3479 CmdArgs.push_back("-fno-show-column");
3480
Douglas Gregora0068fc2010-07-09 17:35:33 +00003481 if (!Args.hasFlag(options::OPT_fspell_checking,
3482 options::OPT_fno_spell_checking))
3483 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003484
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00003485
Chad Rosier15490fd2012-12-05 21:08:21 +00003486 // -fno-asm-blocks is default.
3487 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3488 false))
3489 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00003490
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003491 // Enable vectorization per default according to the optimization level
3492 // selected. For optimization levels that want vectorization we use the alias
3493 // option to simplify the hasFlag logic.
3494 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3495 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier31422792013-04-24 18:29:59 +00003496 options::OPT_fvectorize;
Chad Rosier31422792013-04-24 18:29:59 +00003497 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkelcf5691e2013-08-28 05:21:45 +00003498 options::OPT_fno_vectorize, EnableVec))
Chad Rosierc04d0932012-12-11 17:12:28 +00003499 CmdArgs.push_back("-vectorize-loops");
Chad Rosierc04d0932012-12-11 17:12:28 +00003500
Rafael Espindolad8360612013-08-01 23:56:42 +00003501 // -fslp-vectorize is default.
3502 if (Args.hasFlag(options::OPT_fslp_vectorize,
3503 options::OPT_fno_slp_vectorize, true))
Nadav Rotem50ea9632013-04-15 04:57:18 +00003504 CmdArgs.push_back("-vectorize-slp");
Hal Finkel443c9992012-12-11 19:59:32 +00003505
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003506 // -fno-slp-vectorize-aggressive is default.
3507 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00003508 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003509 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003510
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00003511 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3512 A->render(Args, CmdArgs);
3513
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003514 // -fdollars-in-identifiers default varies depending on platform and
3515 // language; only pass if specified.
Mike Stump1eb44332009-09-09 15:08:12 +00003516 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003517 options::OPT_fno_dollars_in_identifiers)) {
3518 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar8663b182009-12-16 20:10:18 +00003519 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003520 else
Daniel Dunbar8663b182009-12-16 20:10:18 +00003521 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003522 }
3523
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003524 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3525 // practical purposes.
Mike Stump1eb44332009-09-09 15:08:12 +00003526 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003527 options::OPT_fno_unit_at_a_time)) {
3528 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003529 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003530 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00003531
Eli Friedman19bda3a2011-11-02 01:53:16 +00003532 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3533 options::OPT_fno_apple_pragma_pack, false))
3534 CmdArgs.push_back("-fapple-pragma-pack");
3535
Eli Benderskyf3ecf892013-07-24 18:20:14 +00003536 // le32-specific flags:
3537 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3538 // by default.
3539 if (getToolChain().getArch() == llvm::Triple::le32) {
3540 CmdArgs.push_back("-fno-math-builtin");
3541 }
3542
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003543 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003544 //
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00003545 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003546#if 0
Bob Wilson905c45f2011-10-14 05:03:44 +00003547 if (getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003548 (getToolChain().getArch() == llvm::Triple::arm ||
3549 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003550 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3551 CmdArgs.push_back("-fno-builtin-strcat");
3552 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3553 CmdArgs.push_back("-fno-builtin-strcpy");
3554 }
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003555#endif
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003556
Daniel Dunbard98750f2011-03-18 21:23:40 +00003557 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump1eb44332009-09-09 15:08:12 +00003558 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbard98750f2011-03-18 21:23:40 +00003559 options::OPT_traditional_cpp)) {
3560 if (isa<PreprocessJobAction>(JA))
3561 CmdArgs.push_back("-traditional-cpp");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003562 else
Chris Lattner5f9e2722011-07-23 10:55:15 +00003563 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbard98750f2011-03-18 21:23:40 +00003564 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00003565
Daniel Dunbar1d460332009-03-18 10:01:51 +00003566 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnerd82df3a2009-04-12 01:56:53 +00003567 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremenek36f6e302011-11-11 00:07:43 +00003568
3569 // Handle serialized diagnostics.
3570 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3571 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smith1d489cf2012-11-01 04:30:05 +00003572 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremenek36f6e302011-11-11 00:07:43 +00003573 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003574
Ted Kremenek127ff2e2012-09-13 06:41:18 +00003575 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3576 CmdArgs.push_back("-fretain-comments-from-system-headers");
3577
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00003578 // Forward -fcomment-block-commands to -cc1.
3579 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenko6fd7d302013-04-10 15:35:17 +00003580 // Forward -fparse-all-comments to -cc1.
3581 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00003582
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003583 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3584 // parser.
Daniel Dunbar1d460332009-03-18 10:01:51 +00003585 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003586 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3587 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003588 (*it)->claim();
Daniel Dunbarfb36d212010-04-17 06:10:00 +00003589
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003590 // We translate this by hand to the -cc1 argument, since nightly test uses
3591 // it and developers have been trained to spell it with -mllvm.
Richard Smith1d489cf2012-11-01 04:30:05 +00003592 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003593 CmdArgs.push_back("-disable-llvm-optzns");
3594 else
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003595 (*it)->render(Args, CmdArgs);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003596 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003597
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00003598 if (Output.getType() == types::TY_Dependencies) {
3599 // Handled with other dependency code.
Daniel Dunbar115a7922009-03-19 07:29:38 +00003600 } else if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003601 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003602 CmdArgs.push_back(Output.getFilename());
3603 } else {
3604 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003605 }
3606
Daniel Dunbar1d460332009-03-18 10:01:51 +00003607 for (InputInfoList::const_iterator
3608 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3609 const InputInfo &II = *it;
3610 CmdArgs.push_back("-x");
Fariborz Jahaniana5ee0892012-09-28 19:05:17 +00003611 if (Args.hasArg(options::OPT_rewrite_objc))
3612 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3613 else
3614 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003615 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00003616 CmdArgs.push_back(II.getFilename());
Daniel Dunbar1d460332009-03-18 10:01:51 +00003617 else
Daniel Dunbar115a7922009-03-19 07:29:38 +00003618 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00003619 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003620
Chris Lattnere6113de2009-11-03 19:50:27 +00003621 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3622
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003623 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003624
3625 // Optionally embed the -cc1 level arguments into the debug info, for build
3626 // analysis.
3627 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar6e900472010-06-04 18:47:06 +00003628 ArgStringList OriginalArgs;
3629 for (ArgList::const_iterator it = Args.begin(),
3630 ie = Args.end(); it != ie; ++it)
3631 (*it)->render(Args, OriginalArgs);
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003632
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003633 SmallString<256> Flags;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003634 Flags += Exec;
Daniel Dunbar6e900472010-06-04 18:47:06 +00003635 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003636 Flags += " ";
Daniel Dunbar6e900472010-06-04 18:47:06 +00003637 Flags += OriginalArgs[i];
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003638 }
3639 CmdArgs.push_back("-dwarf-debug-flags");
3640 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3641 }
3642
Eric Christopher80190392013-02-22 20:12:52 +00003643 // Add the split debug info name to the command lines here so we
3644 // can propagate it to the backend.
3645 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00003646 getToolChain().getTriple().isOSLinux() &&
Eric Christopherff971d72013-02-22 23:50:16 +00003647 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopher80190392013-02-22 20:12:52 +00003648 const char *SplitDwarfOut;
3649 if (SplitDwarf) {
3650 CmdArgs.push_back("-split-dwarf-file");
3651 SplitDwarfOut = SplitDebugName(Args, Inputs);
3652 CmdArgs.push_back(SplitDwarfOut);
3653 }
3654
3655 // Finally add the compile command to the compilation.
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00003656 if (Args.hasArg(options::OPT__SLASH_fallback)) {
3657 tools::visualstudio::Compile CL(getToolChain());
3658 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3659 LinkingOutput);
3660 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3661 } else {
3662 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3663 }
3664
Daniel Dunbara880db02009-03-23 19:03:36 +00003665
Eric Christopherff971d72013-02-22 23:50:16 +00003666 // Handle the debug info splitting at object creation time if we're
3667 // creating an object.
Eric Christopher59320e72013-02-21 22:35:01 +00003668 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherff971d72013-02-22 23:50:16 +00003669 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopher80190392013-02-22 20:12:52 +00003670 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher59320e72013-02-21 22:35:01 +00003671
Roman Divackybe4c8702011-02-10 16:52:03 +00003672 if (Arg *A = Args.getLastArg(options::OPT_pg))
3673 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003674 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divackybe4c8702011-02-10 16:52:03 +00003675 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer20249a12010-10-21 03:16:25 +00003676
Daniel Dunbar68fb4692009-04-03 20:51:31 +00003677 // Claim some arguments which clang supports automatically.
3678
Daniel Dunbarf4046862010-04-15 06:18:42 +00003679 // -fpch-preprocess is used with gcc to add a special marker in the output to
3680 // include the PCH file. Clang's PTH solution is completely transparent, so we
3681 // do not need to deal with it at all.
Daniel Dunbar68fb4692009-04-03 20:51:31 +00003682 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003683
Daniel Dunbara880db02009-03-23 19:03:36 +00003684 // Claim some arguments which clang doesn't support, but we don't
3685 // care to warn the user about.
Daniel Dunbarcdd96862009-11-25 11:53:23 +00003686 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3687 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola035ff0c2011-02-28 23:29:45 +00003688
Rafael Espindola6155fbe2013-09-04 19:37:35 +00003689 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003690 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003691}
3692
John McCall260611a2012-06-20 06:18:46 +00003693/// Add options related to the Objective-C runtime/ABI.
3694///
3695/// Returns true if the runtime is non-fragile.
3696ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3697 ArgStringList &cmdArgs,
3698 RewriteKind rewriteKind) const {
3699 // Look for the controlling runtime option.
3700 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3701 options::OPT_fgnu_runtime,
3702 options::OPT_fobjc_runtime_EQ);
3703
3704 // Just forward -fobjc-runtime= to the frontend. This supercedes
3705 // options about fragility.
3706 if (runtimeArg &&
3707 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3708 ObjCRuntime runtime;
Richard Smith1d489cf2012-11-01 04:30:05 +00003709 StringRef value = runtimeArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003710 if (runtime.tryParse(value)) {
3711 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3712 << value;
3713 }
3714
3715 runtimeArg->render(args, cmdArgs);
3716 return runtime;
3717 }
3718
3719 // Otherwise, we'll need the ABI "version". Version numbers are
3720 // slightly confusing for historical reasons:
3721 // 1 - Traditional "fragile" ABI
3722 // 2 - Non-fragile ABI, version 1
3723 // 3 - Non-fragile ABI, version 2
3724 unsigned objcABIVersion = 1;
3725 // If -fobjc-abi-version= is present, use that to set the version.
3726 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003727 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003728 if (value == "1")
3729 objcABIVersion = 1;
3730 else if (value == "2")
3731 objcABIVersion = 2;
3732 else if (value == "3")
3733 objcABIVersion = 3;
3734 else
3735 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3736 << value;
3737 } else {
3738 // Otherwise, determine if we are using the non-fragile ABI.
3739 bool nonFragileABIIsDefault =
3740 (rewriteKind == RK_NonFragile ||
3741 (rewriteKind == RK_None &&
3742 getToolChain().IsObjCNonFragileABIDefault()));
3743 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3744 options::OPT_fno_objc_nonfragile_abi,
3745 nonFragileABIIsDefault)) {
3746 // Determine the non-fragile ABI version to use.
3747#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3748 unsigned nonFragileABIVersion = 1;
3749#else
3750 unsigned nonFragileABIVersion = 2;
3751#endif
3752
3753 if (Arg *abiArg = args.getLastArg(
3754 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003755 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003756 if (value == "1")
3757 nonFragileABIVersion = 1;
3758 else if (value == "2")
3759 nonFragileABIVersion = 2;
3760 else
3761 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3762 << value;
3763 }
3764
3765 objcABIVersion = 1 + nonFragileABIVersion;
3766 } else {
3767 objcABIVersion = 1;
3768 }
3769 }
3770
3771 // We don't actually care about the ABI version other than whether
3772 // it's non-fragile.
3773 bool isNonFragile = objcABIVersion != 1;
3774
3775 // If we have no runtime argument, ask the toolchain for its default runtime.
3776 // However, the rewriter only really supports the Mac runtime, so assume that.
3777 ObjCRuntime runtime;
3778 if (!runtimeArg) {
3779 switch (rewriteKind) {
3780 case RK_None:
3781 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3782 break;
3783 case RK_Fragile:
3784 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3785 break;
3786 case RK_NonFragile:
3787 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3788 break;
3789 }
3790
3791 // -fnext-runtime
3792 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3793 // On Darwin, make this use the default behavior for the toolchain.
3794 if (getToolChain().getTriple().isOSDarwin()) {
3795 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3796
3797 // Otherwise, build for a generic macosx port.
3798 } else {
3799 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3800 }
3801
3802 // -fgnu-runtime
3803 } else {
3804 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnalla422cd02012-07-04 10:37:03 +00003805 // Legacy behaviour is to target the gnustep runtime if we are i
3806 // non-fragile mode or the GCC runtime in fragile mode.
3807 if (isNonFragile)
David Chisnall891dac72012-10-16 15:11:55 +00003808 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnalla422cd02012-07-04 10:37:03 +00003809 else
3810 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall260611a2012-06-20 06:18:46 +00003811 }
3812
3813 cmdArgs.push_back(args.MakeArgString(
3814 "-fobjc-runtime=" + runtime.getAsString()));
3815 return runtime;
3816}
3817
Hans Wennborgb3574792013-08-08 00:17:41 +00003818void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
3819 unsigned RTOptionID = options::OPT__SLASH_MT;
3820
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00003821 if (Args.hasArg(options::OPT__SLASH_LDd))
3822 // The /LDd option implies /MTd. The dependent lib part can be overridden,
3823 // but defining _DEBUG is sticky.
3824 RTOptionID = options::OPT__SLASH_MTd;
3825
Hans Wennborg76da1782013-09-18 22:26:39 +00003826 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborgb3574792013-08-08 00:17:41 +00003827 RTOptionID = A->getOption().getID();
Hans Wennborg42ade492013-09-11 16:38:41 +00003828
Hans Wennborgb3574792013-08-08 00:17:41 +00003829 switch(RTOptionID) {
3830 case options::OPT__SLASH_MD:
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00003831 if (Args.hasArg(options::OPT__SLASH_LDd))
3832 CmdArgs.push_back("-D_DEBUG");
Hans Wennborgb3574792013-08-08 00:17:41 +00003833 CmdArgs.push_back("-D_MT");
3834 CmdArgs.push_back("-D_DLL");
3835 CmdArgs.push_back("--dependent-lib=msvcrt");
3836 break;
3837 case options::OPT__SLASH_MDd:
3838 CmdArgs.push_back("-D_DEBUG");
3839 CmdArgs.push_back("-D_MT");
3840 CmdArgs.push_back("-D_DLL");
3841 CmdArgs.push_back("--dependent-lib=msvcrtd");
3842 break;
3843 case options::OPT__SLASH_MT:
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00003844 if (Args.hasArg(options::OPT__SLASH_LDd))
3845 CmdArgs.push_back("-D_DEBUG");
Hans Wennborgb3574792013-08-08 00:17:41 +00003846 CmdArgs.push_back("-D_MT");
3847 CmdArgs.push_back("--dependent-lib=libcmt");
3848 break;
3849 case options::OPT__SLASH_MTd:
3850 CmdArgs.push_back("-D_DEBUG");
3851 CmdArgs.push_back("-D_MT");
3852 CmdArgs.push_back("--dependent-lib=libcmtd");
3853 break;
3854 default:
3855 llvm_unreachable("Unexpected option ID.");
3856 }
3857
Reid Klecknera32c5232013-08-08 19:33:10 +00003858 // This provides POSIX compatibility (maps 'open' to '_open'), which most
3859 // users want. The /Za flag to cl.exe turns this off, but it's not
3860 // implemented in clang.
3861 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborgf0f98912013-08-08 19:54:30 +00003862
3863 // FIXME: Make this default for the win32 triple.
3864 CmdArgs.push_back("-cxx-abi");
3865 CmdArgs.push_back("microsoft");
Hans Wennborg708002e2013-08-09 00:32:23 +00003866
3867 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
3868 A->render(Args, CmdArgs);
Hans Wennborgb6475522013-09-10 01:07:07 +00003869
3870 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
3871 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborg89e32742013-09-24 00:08:55 +00003872 if (Args.hasArg(options::OPT__SLASH_fallback))
3873 CmdArgs.push_back("msvc-fallback");
3874 else
3875 CmdArgs.push_back("msvc");
Hans Wennborgb6475522013-09-10 01:07:07 +00003876 }
Hans Wennborgb3574792013-08-08 00:17:41 +00003877}
3878
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003879void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003880 const InputInfo &Output,
3881 const InputInfoList &Inputs,
3882 const ArgList &Args,
3883 const char *LinkingOutput) const {
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003884 ArgStringList CmdArgs;
3885
3886 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3887 const InputInfo &Input = Inputs[0];
3888
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003889 // Don't warn about "clang -w -c foo.s"
3890 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003891 // and "clang -emit-llvm -c foo.s"
3892 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003893
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003894 // Invoke ourselves in -cc1as mode.
3895 //
3896 // FIXME: Implement custom jobs for internal actions.
3897 CmdArgs.push_back("-cc1as");
3898
3899 // Add the "effective" target triple.
3900 CmdArgs.push_back("-triple");
Chad Rosier61ab80a2011-09-20 20:44:06 +00003901 std::string TripleStr =
3902 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003903 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3904
3905 // Set the output mode, we currently only expect to be used as a real
3906 // assembler.
3907 CmdArgs.push_back("-filetype");
3908 CmdArgs.push_back("obj");
3909
Eric Christopher27e2b982012-12-18 00:31:10 +00003910 // Set the main file name, so that debug info works even with
3911 // -save-temps or preprocessed assembly.
3912 CmdArgs.push_back("-main-file-name");
3913 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3914
Rafael Espindolab330e402013-08-20 22:12:08 +00003915 // Add the target cpu
Rafael Espindola146dbbf2013-08-21 16:39:20 +00003916 const llvm::Triple &Triple = getToolChain().getTriple();
3917 std::string CPU = getCPUName(Args, Triple);
Rafael Espindolab330e402013-08-20 22:12:08 +00003918 if (!CPU.empty()) {
3919 CmdArgs.push_back("-target-cpu");
3920 CmdArgs.push_back(Args.MakeArgString(CPU));
3921 }
3922
Rafael Espindola146dbbf2013-08-21 16:39:20 +00003923 // Add the target features
3924 const Driver &D = getToolChain().getDriver();
3925 getTargetFeatures(D, Triple, Args, CmdArgs);
Jim Grosbachfc308292012-02-10 20:37:10 +00003926
Daniel Dunbar7f6f8c82011-03-17 17:37:29 +00003927 // Ignore explicit -force_cpusubtype_ALL option.
3928 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003929
Eric Christopher8f0a4032012-01-10 00:38:01 +00003930 // Determine the original source input.
3931 const Action *SourceAction = &JA;
3932 while (SourceAction->getKind() != Action::InputClass) {
3933 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3934 SourceAction = SourceAction->getInputs()[0];
3935 }
3936
Chandler Carruthd566df62012-12-17 21:40:04 +00003937 // Forward -g and handle debug info related flags, assuming we are dealing
3938 // with an actual assembly file.
Eric Christopher8f0a4032012-01-10 00:38:01 +00003939 if (SourceAction->getType() == types::TY_Asm ||
3940 SourceAction->getType() == types::TY_PP_Asm) {
3941 Args.ClaimAllArgs(options::OPT_g_Group);
3942 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3943 if (!A->getOption().matches(options::OPT_g0))
3944 CmdArgs.push_back("-g");
Chandler Carruthd566df62012-12-17 21:40:04 +00003945
3946 // Add the -fdebug-compilation-dir flag if needed.
3947 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderby02341792013-01-17 21:38:06 +00003948
3949 // Set the AT_producer to the clang version when using the integrated
3950 // assembler on assembly source files.
3951 CmdArgs.push_back("-dwarf-debug-producer");
3952 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopher8f0a4032012-01-10 00:38:01 +00003953 }
Kevin Enderby567003e2011-12-22 19:31:58 +00003954
3955 // Optionally embed the -cc1as level arguments into the debug info, for build
3956 // analysis.
3957 if (getToolChain().UseDwarfDebugFlags()) {
3958 ArgStringList OriginalArgs;
3959 for (ArgList::const_iterator it = Args.begin(),
3960 ie = Args.end(); it != ie; ++it)
3961 (*it)->render(Args, OriginalArgs);
3962
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003963 SmallString<256> Flags;
Kevin Enderby567003e2011-12-22 19:31:58 +00003964 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3965 Flags += Exec;
3966 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3967 Flags += " ";
3968 Flags += OriginalArgs[i];
3969 }
3970 CmdArgs.push_back("-dwarf-debug-flags");
3971 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3972 }
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003973
3974 // FIXME: Add -static support, once we have it.
3975
David Blaikie73168db2013-07-25 21:19:01 +00003976 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
3977 getToolChain().getDriver());
3978
Daniel Dunbar3df23252011-04-29 17:53:18 +00003979 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003980
3981 assert(Output.isFilename() && "Unexpected lipo output.");
3982 CmdArgs.push_back("-o");
3983 CmdArgs.push_back(Output.getFilename());
3984
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003985 assert(Input.isFilename() && "Invalid input.");
3986 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003987
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003988 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003989 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher708d72a2013-04-10 21:30:40 +00003990
3991 // Handle the debug info splitting at object creation time if we're
3992 // creating an object.
3993 // TODO: Currently only works on linux with newer objcopy.
3994 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00003995 getToolChain().getTriple().isOSLinux())
Eric Christopher708d72a2013-04-10 21:30:40 +00003996 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
3997 SplitDebugName(Args, Inputs));
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003998}
3999
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004000void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004001 const InputInfo &Output,
4002 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00004003 const ArgList &Args,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004004 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004005 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004006 ArgStringList CmdArgs;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004007
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004008 for (ArgList::const_iterator
Daniel Dunbar1d460332009-03-18 10:01:51 +00004009 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004010 Arg *A = *it;
Michael J. Spencer91e06da2012-10-19 22:37:06 +00004011 if (forwardToGCC(A->getOption())) {
Daniel Dunbar2dffe2d2010-08-03 16:14:14 +00004012 // Don't forward any -g arguments to assembly steps.
4013 if (isa<AssembleJobAction>(JA) &&
4014 A->getOption().matches(options::OPT_g_Group))
4015 continue;
4016
NAKAMURA Takumi3c6c8222013-08-19 11:51:51 +00004017 // Don't forward any -W arguments to assembly and link steps.
4018 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4019 A->getOption().matches(options::OPT_W_Group))
4020 continue;
4021
Daniel Dunbar75877192009-03-19 07:55:12 +00004022 // It is unfortunate that we have to claim here, as this means
4023 // we will basically never report anything interesting for
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004024 // platforms using a generic gcc, even if we are just using gcc
4025 // to get to the assembler.
Daniel Dunbar75877192009-03-19 07:55:12 +00004026 A->claim();
Daniel Dunbar1d460332009-03-18 10:01:51 +00004027 A->render(Args, CmdArgs);
Daniel Dunbar75877192009-03-19 07:55:12 +00004028 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004029 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004030
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004031 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004032
4033 // If using a driver driver, force the arch.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004034 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson905c45f2011-10-14 05:03:44 +00004035 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004036 CmdArgs.push_back("-arch");
Daniel Dunbarbf54a062009-04-01 20:33:11 +00004037
4038 // FIXME: Remove these special cases.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004039 if (Arch == llvm::Triple::ppc)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004040 CmdArgs.push_back("ppc");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004041 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004042 CmdArgs.push_back("ppc64");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00004043 else if (Arch == llvm::Triple::ppc64le)
4044 CmdArgs.push_back("ppc64le");
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004045 else
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004046 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004047 }
4048
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004049 // Try to force gcc to match the tool chain we want, if we recognize
4050 // the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004051 //
4052 // FIXME: The triple class should directly provide the information we want
4053 // here.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004054 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004055 CmdArgs.push_back("-m32");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00004056 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4057 Arch == llvm::Triple::ppc64le)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004058 CmdArgs.push_back("-m64");
4059
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004060 if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004061 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00004062 CmdArgs.push_back(Output.getFilename());
4063 } else {
4064 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004065 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar115a7922009-03-19 07:29:38 +00004066 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004067
Tony Linthicum96319392011-12-12 21:14:55 +00004068 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4069 options::OPT_Xassembler);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004070
4071 // Only pass -x if gcc will understand it; otherwise hope gcc
4072 // understands the suffix correctly. The main use case this would go
4073 // wrong in is for linker inputs if they happened to have an odd
4074 // suffix; really the only way to get this to happen is a command
4075 // like '-x foobar a.c' which will treat a.c like a linker input.
4076 //
4077 // FIXME: For the linker case specifically, can we safely convert
4078 // inputs into '-Wl,' options?
4079 for (InputInfoList::const_iterator
4080 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4081 const InputInfo &II = *it;
Daniel Dunbara8304f62009-05-02 20:14:53 +00004082
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004083 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00004084 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4085 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004086 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004087 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004088 else if (II.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004089 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004090 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00004091 else if (II.getType() == types::TY_ModuleFile)
4092 D.Diag(diag::err_drv_no_module_support)
4093 << getToolChain().getTripleString();
Daniel Dunbara8304f62009-05-02 20:14:53 +00004094
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004095 if (types::canTypeBeUserSpecified(II.getType())) {
4096 CmdArgs.push_back("-x");
4097 CmdArgs.push_back(types::getTypeName(II.getType()));
4098 }
4099
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004100 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00004101 CmdArgs.push_back(II.getFilename());
Daniel Dunbar48f99942010-09-25 18:10:05 +00004102 else {
4103 const Arg &A = II.getInputArg();
4104
4105 // Reverse translate some rewritten options.
4106 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4107 CmdArgs.push_back("-lstdc++");
4108 continue;
4109 }
4110
Daniel Dunbar115a7922009-03-19 07:29:38 +00004111 // Don't render as input, we need gcc to do the translations.
Daniel Dunbar48f99942010-09-25 18:10:05 +00004112 A.render(Args, CmdArgs);
4113 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004114 }
4115
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00004116 const std::string customGCCName = D.getCCCGenericGCCName();
4117 const char *GCCName;
4118 if (!customGCCName.empty())
4119 GCCName = customGCCName.c_str();
Hans Wennborg76b86c22013-07-18 20:29:38 +00004120 else if (D.CCCIsCXX()) {
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00004121 GCCName = "g++";
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00004122 } else
4123 GCCName = "gcc";
4124
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004125 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004126 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004127 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004128}
4129
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004130void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4131 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004132 CmdArgs.push_back("-E");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004133}
4134
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004135void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
4136 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004137 // The type is good enough.
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004138}
4139
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004140void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4141 ArgStringList &CmdArgs) const {
Daniel Dunbar64952502010-02-11 03:16:21 +00004142 const Driver &D = getToolChain().getDriver();
4143
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004144 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00004145 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4146 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004147 CmdArgs.push_back("-c");
Daniel Dunbar64952502010-02-11 03:16:21 +00004148 else {
4149 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004150 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00004151 << getTypeName(JA.getType());
Michael J. Spencer20249a12010-10-21 03:16:25 +00004152
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004153 CmdArgs.push_back("-S");
Daniel Dunbar64952502010-02-11 03:16:21 +00004154 }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004155}
4156
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004157void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
4158 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004159 CmdArgs.push_back("-c");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004160}
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004161
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004162void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4163 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004164 // The types are (hopefully) good enough.
4165}
4166
Tony Linthicum96319392011-12-12 21:14:55 +00004167// Hexagon tools start.
4168void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4169 ArgStringList &CmdArgs) const {
4170
4171}
4172void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4173 const InputInfo &Output,
4174 const InputInfoList &Inputs,
4175 const ArgList &Args,
4176 const char *LinkingOutput) const {
4177
4178 const Driver &D = getToolChain().getDriver();
4179 ArgStringList CmdArgs;
4180
4181 std::string MarchString = "-march=";
Matthew Curtis67814152012-12-06 14:16:43 +00004182 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum96319392011-12-12 21:14:55 +00004183 CmdArgs.push_back(Args.MakeArgString(MarchString));
4184
4185 RenderExtraToolArgs(JA, CmdArgs);
4186
4187 if (Output.isFilename()) {
4188 CmdArgs.push_back("-o");
4189 CmdArgs.push_back(Output.getFilename());
4190 } else {
4191 assert(Output.isNothing() && "Unexpected output");
4192 CmdArgs.push_back("-fsyntax-only");
4193 }
4194
Matthew Curtis33c95f12012-12-06 17:49:03 +00004195 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4196 if (!SmallDataThreshold.empty())
4197 CmdArgs.push_back(
4198 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00004199
Matthew Curtis3d8d4222012-12-07 17:23:04 +00004200 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4201 options::OPT_Xassembler);
4202
Tony Linthicum96319392011-12-12 21:14:55 +00004203 // Only pass -x if gcc will understand it; otherwise hope gcc
4204 // understands the suffix correctly. The main use case this would go
4205 // wrong in is for linker inputs if they happened to have an odd
4206 // suffix; really the only way to get this to happen is a command
4207 // like '-x foobar a.c' which will treat a.c like a linker input.
4208 //
4209 // FIXME: For the linker case specifically, can we safely convert
4210 // inputs into '-Wl,' options?
4211 for (InputInfoList::const_iterator
4212 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4213 const InputInfo &II = *it;
4214
4215 // Don't try to pass LLVM or AST inputs to a generic gcc.
4216 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4217 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4218 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4219 << getToolChain().getTripleString();
4220 else if (II.getType() == types::TY_AST)
4221 D.Diag(clang::diag::err_drv_no_ast_support)
4222 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00004223 else if (II.getType() == types::TY_ModuleFile)
4224 D.Diag(diag::err_drv_no_module_support)
4225 << getToolChain().getTripleString();
Tony Linthicum96319392011-12-12 21:14:55 +00004226
4227 if (II.isFilename())
4228 CmdArgs.push_back(II.getFilename());
4229 else
4230 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4231 II.getInputArg().render(Args, CmdArgs);
4232 }
4233
4234 const char *GCCName = "hexagon-as";
4235 const char *Exec =
4236 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4237 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4238
4239}
4240void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4241 ArgStringList &CmdArgs) const {
4242 // The types are (hopefully) good enough.
4243}
4244
4245void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4246 const InputInfo &Output,
4247 const InputInfoList &Inputs,
4248 const ArgList &Args,
4249 const char *LinkingOutput) const {
4250
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004251 const toolchains::Hexagon_TC& ToolChain =
4252 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4253 const Driver &D = ToolChain.getDriver();
4254
Tony Linthicum96319392011-12-12 21:14:55 +00004255 ArgStringList CmdArgs;
4256
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004257 //----------------------------------------------------------------------------
4258 //
4259 //----------------------------------------------------------------------------
4260 bool hasStaticArg = Args.hasArg(options::OPT_static);
4261 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtis33c95f12012-12-06 17:49:03 +00004262 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004263 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4264 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4265 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4266 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum96319392011-12-12 21:14:55 +00004267
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004268 //----------------------------------------------------------------------------
4269 // Silence warnings for various options
4270 //----------------------------------------------------------------------------
Tony Linthicum96319392011-12-12 21:14:55 +00004271
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004272 Args.ClaimAllArgs(options::OPT_g_Group);
4273 Args.ClaimAllArgs(options::OPT_emit_llvm);
4274 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4275 // handled somewhere else.
4276 Args.ClaimAllArgs(options::OPT_static_libgcc);
4277
4278 //----------------------------------------------------------------------------
4279 //
4280 //----------------------------------------------------------------------------
4281 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4282 e = ToolChain.ExtraOpts.end();
4283 i != e; ++i)
4284 CmdArgs.push_back(i->c_str());
Tony Linthicum96319392011-12-12 21:14:55 +00004285
Matthew Curtis67814152012-12-06 14:16:43 +00004286 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4287 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop43115d42012-01-13 20:37:10 +00004288
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004289 if (buildingLib) {
4290 CmdArgs.push_back("-shared");
4291 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4292 // hexagon-gcc does
Tony Linthicum96319392011-12-12 21:14:55 +00004293 }
4294
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004295 if (hasStaticArg)
4296 CmdArgs.push_back("-static");
Tony Linthicum96319392011-12-12 21:14:55 +00004297
Matthew Curtis33c95f12012-12-06 17:49:03 +00004298 if (buildPIE && !buildingLib)
4299 CmdArgs.push_back("-pie");
4300
4301 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4302 if (!SmallDataThreshold.empty()) {
4303 CmdArgs.push_back(
4304 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4305 }
4306
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004307 //----------------------------------------------------------------------------
4308 //
4309 //----------------------------------------------------------------------------
4310 CmdArgs.push_back("-o");
4311 CmdArgs.push_back(Output.getFilename());
Tony Linthicum96319392011-12-12 21:14:55 +00004312
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004313 const std::string MarchSuffix = "/" + MarchString;
4314 const std::string G0Suffix = "/G0";
4315 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4316 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4317 + "/";
4318 const std::string StartFilesDir = RootDir
4319 + "hexagon/lib"
4320 + (buildingLib
4321 ? MarchG0Suffix : MarchSuffix);
4322
4323 //----------------------------------------------------------------------------
4324 // moslib
4325 //----------------------------------------------------------------------------
4326 std::vector<std::string> oslibs;
4327 bool hasStandalone= false;
4328
4329 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4330 ie = Args.filtered_end(); it != ie; ++it) {
4331 (*it)->claim();
4332 oslibs.push_back((*it)->getValue());
4333 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum96319392011-12-12 21:14:55 +00004334 }
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004335 if (oslibs.empty()) {
4336 oslibs.push_back("standalone");
4337 hasStandalone = true;
4338 }
Tony Linthicum96319392011-12-12 21:14:55 +00004339
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004340 //----------------------------------------------------------------------------
4341 // Start Files
4342 //----------------------------------------------------------------------------
4343 if (incStdLib && incStartFiles) {
4344
4345 if (!buildingLib) {
4346 if (hasStandalone) {
4347 CmdArgs.push_back(
4348 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4349 }
4350 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4351 }
4352 std::string initObj = useShared ? "/initS.o" : "/init.o";
4353 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4354 }
4355
4356 //----------------------------------------------------------------------------
4357 // Library Search Paths
4358 //----------------------------------------------------------------------------
4359 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4360 for (ToolChain::path_list::const_iterator
4361 i = LibPaths.begin(),
4362 e = LibPaths.end();
4363 i != e;
4364 ++i)
4365 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4366
4367 //----------------------------------------------------------------------------
4368 //
4369 //----------------------------------------------------------------------------
4370 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4371 Args.AddAllArgs(CmdArgs, options::OPT_e);
4372 Args.AddAllArgs(CmdArgs, options::OPT_s);
4373 Args.AddAllArgs(CmdArgs, options::OPT_t);
4374 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4375
4376 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4377
4378 //----------------------------------------------------------------------------
4379 // Libraries
4380 //----------------------------------------------------------------------------
4381 if (incStdLib && incDefLibs) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00004382 if (D.CCCIsCXX()) {
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004383 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4384 CmdArgs.push_back("-lm");
4385 }
4386
4387 CmdArgs.push_back("--start-group");
4388
4389 if (!buildingLib) {
4390 for(std::vector<std::string>::iterator i = oslibs.begin(),
4391 e = oslibs.end(); i != e; ++i)
4392 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4393 CmdArgs.push_back("-lc");
4394 }
4395 CmdArgs.push_back("-lgcc");
4396
4397 CmdArgs.push_back("--end-group");
4398 }
4399
4400 //----------------------------------------------------------------------------
4401 // End files
4402 //----------------------------------------------------------------------------
4403 if (incStdLib && incStartFiles) {
4404 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4405 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4406 }
4407
4408 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00004409 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum96319392011-12-12 21:14:55 +00004410}
4411// Hexagon tools end.
4412
Rafael Espindolacfed8282012-10-31 18:51:07 +00004413llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4414 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4415 // archs which Darwin doesn't use.
4416
4417 // The matching this routine does is fairly pointless, since it is neither the
4418 // complete architecture list, nor a reasonable subset. The problem is that
4419 // historically the driver driver accepts this and also ties its -march=
4420 // handling to the architecture name, so we need to be careful before removing
4421 // support for it.
4422
4423 // This code must be kept in sync with Clang's Darwin specific argument
4424 // translation.
4425
4426 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4427 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4428 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4429 .Case("ppc64", llvm::Triple::ppc64)
4430 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4431 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4432 llvm::Triple::x86)
4433 .Case("x86_64", llvm::Triple::x86_64)
4434 // This is derived from the driver driver.
Bob Wilson2503ebd2013-03-04 22:37:49 +00004435 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4436 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4437 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindolacfed8282012-10-31 18:51:07 +00004438 .Case("r600", llvm::Triple::r600)
4439 .Case("nvptx", llvm::Triple::nvptx)
4440 .Case("nvptx64", llvm::Triple::nvptx64)
4441 .Case("amdil", llvm::Triple::amdil)
4442 .Case("spir", llvm::Triple::spir)
4443 .Default(llvm::Triple::UnknownArch);
4444}
Tony Linthicum96319392011-12-12 21:14:55 +00004445
Bob Wilson66b8a662012-11-23 06:14:39 +00004446const char *Clang::getBaseInputName(const ArgList &Args,
4447 const InputInfoList &Inputs) {
Michael J. Spencer472ccff2010-12-18 00:19:12 +00004448 return Args.MakeArgString(
4449 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004450}
4451
Bob Wilson66b8a662012-11-23 06:14:39 +00004452const char *Clang::getBaseInputStem(const ArgList &Args,
4453 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004454 const char *Str = getBaseInputName(Args, Inputs);
4455
Chris Lattner657ca662011-01-16 08:14:11 +00004456 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar88137642009-09-09 22:32:48 +00004457 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004458
4459 return Str;
4460}
4461
Bob Wilson66b8a662012-11-23 06:14:39 +00004462const char *Clang::getDependencyFileName(const ArgList &Args,
4463 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004464 // FIXME: Think about this more.
4465 std::string Res;
4466
4467 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00004468 std::string Str(OutputOpt->getValue());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004469 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier30601782011-08-17 23:08:45 +00004470 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +00004471 Res = getBaseInputStem(Args, Inputs);
Chad Rosier30601782011-08-17 23:08:45 +00004472 }
Daniel Dunbar88137642009-09-09 22:32:48 +00004473 return Args.MakeArgString(Res + ".d");
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004474}
4475
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004476void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004477 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004478 const InputInfoList &Inputs,
4479 const ArgList &Args,
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004480 const char *LinkingOutput) const {
4481 ArgStringList CmdArgs;
4482
4483 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4484 const InputInfo &Input = Inputs[0];
4485
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004486 // Determine the original source input.
4487 const Action *SourceAction = &JA;
4488 while (SourceAction->getKind() != Action::InputClass) {
4489 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4490 SourceAction = SourceAction->getInputs()[0];
4491 }
4492
4493 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher88b7cf02011-08-19 00:30:14 +00004494 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004495 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004496 if (Args.hasArg(options::OPT_gstabs))
4497 CmdArgs.push_back("--gstabs");
4498 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson591ff152011-11-02 05:10:45 +00004499 CmdArgs.push_back("-g");
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004500 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004501
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004502 // Derived from asm spec.
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004503 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004504
Daniel Dunbarf5438e32010-07-22 01:47:22 +00004505 // Use -force_cpusubtype_ALL on x86 by default.
Eli Bendersky8f4269a2013-07-24 22:20:49 +00004506 if (getToolChain().getArch() == llvm::Triple::x86 ||
4507 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004508 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4509 CmdArgs.push_back("-force_cpusubtype_ALL");
4510
Eli Bendersky8f4269a2013-07-24 22:20:49 +00004511 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004512 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher59320e72013-02-21 22:35:01 +00004513 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004514 (!getDarwinToolChain().isTargetIPhoneOS() ||
4515 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4516 Args.hasArg(options::OPT_static)))
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004517 CmdArgs.push_back("-static");
4518
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004519 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4520 options::OPT_Xassembler);
4521
4522 assert(Output.isFilename() && "Unexpected lipo output.");
4523 CmdArgs.push_back("-o");
4524 CmdArgs.push_back(Output.getFilename());
4525
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004526 assert(Input.isFilename() && "Invalid input.");
4527 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004528
4529 // asm_final spec is empty.
4530
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004531 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004532 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004533 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004534}
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004535
David Blaikie99ba9e32011-12-20 02:48:34 +00004536void darwin::DarwinTool::anchor() {}
4537
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +00004538void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4539 ArgStringList &CmdArgs) const {
Chris Lattner5f9e2722011-07-23 10:55:15 +00004540 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbareeff4062010-01-22 02:04:58 +00004541
Daniel Dunbar02633b52009-03-26 16:23:12 +00004542 // Derived from darwin_arch spec.
4543 CmdArgs.push_back("-arch");
Daniel Dunbareeff4062010-01-22 02:04:58 +00004544 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004545
Daniel Dunbareeff4062010-01-22 02:04:58 +00004546 // FIXME: Is this needed anymore?
4547 if (ArchName == "arm")
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004548 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004549}
4550
Bill Wendling6acf8b42012-10-02 18:02:50 +00004551bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4552 // We only need to generate a temp path for LTO if we aren't compiling object
4553 // files. When compiling source files, we run 'dsymutil' after linking. We
4554 // don't run 'dsymutil' when compiling object files.
4555 for (InputInfoList::const_iterator
4556 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4557 if (it->getType() != types::TY_Object)
4558 return true;
4559
4560 return false;
4561}
4562
Daniel Dunbar748de8e2010-09-09 21:51:05 +00004563void darwin::Link::AddLinkArgs(Compilation &C,
4564 const ArgList &Args,
Bill Wendling6acf8b42012-10-02 18:02:50 +00004565 ArgStringList &CmdArgs,
4566 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004567 const Driver &D = getToolChain().getDriver();
Daniel Dunbarce911f52011-04-28 21:23:41 +00004568 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbar02633b52009-03-26 16:23:12 +00004569
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004570 unsigned Version[3] = { 0, 0, 0 };
4571 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4572 bool HadExtra;
Richard Smith1d489cf2012-11-01 04:30:05 +00004573 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004574 Version[1], Version[2], HadExtra) ||
4575 HadExtra)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004576 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004577 << A->getAsString(Args);
4578 }
4579
4580 // Newer linkers support -demangle, pass it if supported and not disabled by
4581 // the user.
Daniel Dunbard2d20882012-01-04 21:45:27 +00004582 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004583 // Don't pass -demangle to ld_classic.
4584 //
4585 // FIXME: This is a temporary workaround, ld should be handling this.
4586 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4587 Args.hasArg(options::OPT_static));
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004588 if (getToolChain().getArch() == llvm::Triple::x86) {
4589 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4590 options::OPT_Wl_COMMA),
4591 ie = Args.filtered_end(); it != ie; ++it) {
4592 const Arg *A = *it;
4593 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smith1d489cf2012-11-01 04:30:05 +00004594 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004595 UsesLdClassic = true;
4596 }
4597 }
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004598 if (!UsesLdClassic)
4599 CmdArgs.push_back("-demangle");
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004600 }
4601
Bob Wilsonbd77c592013-08-02 22:25:34 +00004602 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4603 CmdArgs.push_back("-export_dynamic");
4604
Bill Wendlingc35f9082012-11-16 23:03:00 +00004605 // If we are using LTO, then automatically create a temporary file path for
4606 // the linker to use, so that it's lifetime will extend past a possible
4607 // dsymutil step.
4608 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4609 const char *TmpPath = C.getArgs().MakeArgString(
4610 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4611 C.addTempFile(TmpPath);
4612 CmdArgs.push_back("-object_path_lto");
4613 CmdArgs.push_back(TmpPath);
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004614 }
4615
Daniel Dunbar02633b52009-03-26 16:23:12 +00004616 // Derived from the "link" spec.
4617 Args.AddAllArgs(CmdArgs, options::OPT_static);
4618 if (!Args.hasArg(options::OPT_static))
4619 CmdArgs.push_back("-dynamic");
4620 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4621 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4622 // here. How do we wish to handle such things?
4623 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004624
Daniel Dunbar02633b52009-03-26 16:23:12 +00004625 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara6d38492010-01-22 02:04:52 +00004626 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara6d38492010-01-22 02:04:52 +00004627 // FIXME: Why do this only on this path?
Daniel Dunbar8917dd42010-01-22 03:37:33 +00004628 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004629
4630 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4631 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4632 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4633
4634 Arg *A;
4635 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4636 (A = Args.getLastArg(options::OPT_current__version)) ||
4637 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004638 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004639 << A->getAsString(Args) << "-dynamiclib";
4640
4641 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4642 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4643 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4644 } else {
4645 CmdArgs.push_back("-dylib");
4646
4647 Arg *A;
4648 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4649 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4650 (A = Args.getLastArg(options::OPT_client__name)) ||
4651 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4652 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4653 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004654 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004655 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004656
Daniel Dunbar02633b52009-03-26 16:23:12 +00004657 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4658 "-dylib_compatibility_version");
4659 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4660 "-dylib_current_version");
4661
Daniel Dunbara6d38492010-01-22 02:04:52 +00004662 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004663
4664 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4665 "-dylib_install_name");
4666 }
4667
4668 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4669 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4670 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarce911f52011-04-28 21:23:41 +00004671 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004672 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004673 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4674 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4675 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4676 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4677 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4678 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar99ca47b2011-06-28 20:16:02 +00004679 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004680 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4681 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4682 Args.AddAllArgs(CmdArgs, options::OPT_init);
4683
Daniel Dunbarce911f52011-04-28 21:23:41 +00004684 // Add the deployment target.
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004685 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbarb7f5ef72011-04-30 04:22:58 +00004686
4687 // If we had an explicit -mios-simulator-version-min argument, honor that,
4688 // otherwise use the traditional deployment targets. We can't just check the
4689 // is-sim attribute because existing code follows this path, and the linker
4690 // may not handle the argument.
4691 //
4692 // FIXME: We may be able to remove this, once we can verify no one depends on
4693 // it.
4694 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4695 CmdArgs.push_back("-ios_simulator_version_min");
4696 else if (DarwinTC.isTargetIPhoneOS())
4697 CmdArgs.push_back("-iphoneos_version_min");
4698 else
4699 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004700 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarce911f52011-04-28 21:23:41 +00004701
Daniel Dunbar02633b52009-03-26 16:23:12 +00004702 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4703 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4704 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4705 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4706 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004707
Daniel Dunbar47e879d2010-07-13 23:31:40 +00004708 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4709 options::OPT_fno_pie,
4710 options::OPT_fno_PIE)) {
4711 if (A->getOption().matches(options::OPT_fpie) ||
4712 A->getOption().matches(options::OPT_fPIE))
4713 CmdArgs.push_back("-pie");
4714 else
4715 CmdArgs.push_back("-no_pie");
4716 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004717
4718 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4719 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4720 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4721 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4722 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4723 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4724 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4725 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4726 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4727 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4728 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4729 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4730 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4731 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4732 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4733 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004734
Daniel Dunbarcc957192011-05-02 21:03:47 +00004735 // Give --sysroot= preference, over the Apple specific behavior to also use
4736 // --isysroot as the syslibroot.
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004737 StringRef sysroot = C.getSysRoot();
4738 if (sysroot != "") {
Daniel Dunbarcc957192011-05-02 21:03:47 +00004739 CmdArgs.push_back("-syslibroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004740 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbarcc957192011-05-02 21:03:47 +00004741 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4742 CmdArgs.push_back("-syslibroot");
Richard Smith1d489cf2012-11-01 04:30:05 +00004743 CmdArgs.push_back(A->getValue());
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004744 }
4745
Daniel Dunbar02633b52009-03-26 16:23:12 +00004746 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4747 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4748 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4749 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4750 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004751 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004752 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4753 Args.AddAllArgs(CmdArgs, options::OPT_y);
4754 Args.AddLastArg(CmdArgs, options::OPT_w);
4755 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4756 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4757 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4758 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4759 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4760 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4761 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4762 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4763 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4764 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4765 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4766 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4767}
4768
4769void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004770 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004771 const InputInfoList &Inputs,
4772 const ArgList &Args,
Daniel Dunbar02633b52009-03-26 16:23:12 +00004773 const char *LinkingOutput) const {
4774 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbare0be8b12009-09-08 16:39:16 +00004775
Daniel Dunbar02633b52009-03-26 16:23:12 +00004776 // The logic here is derived from gcc's behavior; most of which
4777 // comes from specs (starting with link_command). Consult gcc for
4778 // more information.
Daniel Dunbar02633b52009-03-26 16:23:12 +00004779 ArgStringList CmdArgs;
4780
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00004781 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4782 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4783 options::OPT_ccc_arcmt_migrate)) {
4784 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4785 (*I)->claim();
4786 const char *Exec =
4787 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4788 CmdArgs.push_back(Output.getFilename());
4789 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4790 return;
4791 }
4792
Daniel Dunbar02633b52009-03-26 16:23:12 +00004793 // I'm not sure why this particular decomposition exists in gcc, but
4794 // we follow suite for ease of comparison.
Bill Wendling6acf8b42012-10-02 18:02:50 +00004795 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004796
Daniel Dunbar02633b52009-03-26 16:23:12 +00004797 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4798 Args.AddAllArgs(CmdArgs, options::OPT_s);
4799 Args.AddAllArgs(CmdArgs, options::OPT_t);
4800 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4801 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004802 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004803 Args.AddAllArgs(CmdArgs, options::OPT_r);
4804
Daniel Dunbar270073c2010-10-18 22:08:36 +00004805 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4806 // members of static archive libraries which implement Objective-C classes or
4807 // categories.
4808 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4809 CmdArgs.push_back("-ObjC");
Michael J. Spencer20249a12010-10-21 03:16:25 +00004810
Daniel Dunbar02633b52009-03-26 16:23:12 +00004811 CmdArgs.push_back("-o");
4812 CmdArgs.push_back(Output.getFilename());
4813
Chad Rosier18937312012-05-16 23:45:12 +00004814 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004815 !Args.hasArg(options::OPT_nostartfiles)) {
4816 // Derived from startfile spec.
4817 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004818 // Derived from darwin_dylib1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004819 if (getDarwinToolChain().isTargetIOSSimulator()) {
4820 // The simulator doesn't have a versioned crt1 file.
4821 CmdArgs.push_back("-ldylib1.o");
4822 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004823 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4824 CmdArgs.push_back("-ldylib1.o");
4825 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004826 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004827 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004828 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004829 CmdArgs.push_back("-ldylib1.10.5.o");
4830 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004831 } else {
4832 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004833 if (!Args.hasArg(options::OPT_static)) {
4834 // Derived from darwin_bundle1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004835 if (getDarwinToolChain().isTargetIOSSimulator()) {
4836 // The simulator doesn't have a versioned crt1 file.
4837 CmdArgs.push_back("-lbundle1.o");
4838 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004839 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4840 CmdArgs.push_back("-lbundle1.o");
4841 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004842 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004843 CmdArgs.push_back("-lbundle1.o");
4844 }
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004845 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004846 } else {
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00004847 if (Args.hasArg(options::OPT_pg) &&
4848 getToolChain().SupportsProfiling()) {
Daniel Dunbar02633b52009-03-26 16:23:12 +00004849 if (Args.hasArg(options::OPT_static) ||
4850 Args.hasArg(options::OPT_object) ||
4851 Args.hasArg(options::OPT_preload)) {
4852 CmdArgs.push_back("-lgcrt0.o");
4853 } else {
4854 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004855
Daniel Dunbar02633b52009-03-26 16:23:12 +00004856 // darwin_crt2 spec is empty.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004857 }
Bob Wilson4e6e7912012-07-04 00:18:41 +00004858 // By default on OS X 10.8 and later, we don't link with a crt1.o
4859 // file and the linker knows to use _main as the entry point. But,
4860 // when compiling with -pg, we need to link with the gcrt1.o file,
4861 // so pass the -no_new_main option to tell the linker to use the
4862 // "start" symbol as the entry point.
Bob Wilson1fc6e4f2012-07-03 20:42:10 +00004863 if (getDarwinToolChain().isTargetMacOS() &&
4864 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4865 CmdArgs.push_back("-no_new_main");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004866 } else {
4867 if (Args.hasArg(options::OPT_static) ||
4868 Args.hasArg(options::OPT_object) ||
4869 Args.hasArg(options::OPT_preload)) {
4870 CmdArgs.push_back("-lcrt0.o");
4871 } else {
4872 // Derived from darwin_crt1 spec.
Daniel Dunbar40355802011-03-31 17:12:33 +00004873 if (getDarwinToolChain().isTargetIOSSimulator()) {
4874 // The simulator doesn't have a versioned crt1 file.
4875 CmdArgs.push_back("-lcrt1.o");
4876 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004877 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4878 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004879 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004880 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004881 } else {
4882 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4883 CmdArgs.push_back("-lcrt1.o");
4884 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4885 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004886 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004887 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004888
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004889 // darwin_crt2 spec is empty.
4890 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004891 }
4892 }
4893 }
4894 }
4895
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004896 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4897 Args.hasArg(options::OPT_shared_libgcc) &&
4898 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar88137642009-09-09 22:32:48 +00004899 const char *Str =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004900 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar88137642009-09-09 22:32:48 +00004901 CmdArgs.push_back(Str);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004902 }
4903 }
4904
4905 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004906
Daniel Dunbar02633b52009-03-26 16:23:12 +00004907 if (Args.hasArg(options::OPT_fopenmp))
4908 // This is more complicated in gcc...
4909 CmdArgs.push_back("-lgomp");
4910
Douglas Gregor04e326b2012-05-15 21:00:27 +00004911 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4912
Bob Wilson63d9f3c2012-05-15 18:57:39 +00004913 if (isObjCRuntimeLinked(Args) &&
4914 !Args.hasArg(options::OPT_nostdlib) &&
4915 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004916 // Avoid linking compatibility stubs on i386 mac.
4917 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004918 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004919 // If we don't have ARC or subscripting runtime support, link in the
4920 // runtime stubs. We have to do this *before* adding any of the normal
4921 // linker inputs so that its initializer gets run first.
John McCall260611a2012-06-20 06:18:46 +00004922 ObjCRuntime runtime =
4923 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004924 // We use arclite library for both ARC and subscripting support.
John McCall0a7dd782012-08-21 02:47:43 +00004925 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall260611a2012-06-20 06:18:46 +00004926 !runtime.hasSubscripting())
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004927 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004928 }
Bob Wilson0b1c7152012-04-21 00:21:42 +00004929 CmdArgs.push_back("-framework");
4930 CmdArgs.push_back("Foundation");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004931 // Link libobj.
4932 CmdArgs.push_back("-lobjc");
John McCall9f084a32011-07-06 00:26:06 +00004933 }
John McCallf85e1932011-06-15 23:02:42 +00004934
Daniel Dunbar02633b52009-03-26 16:23:12 +00004935 if (LinkingOutput) {
4936 CmdArgs.push_back("-arch_multiple");
4937 CmdArgs.push_back("-final_output");
4938 CmdArgs.push_back(LinkingOutput);
4939 }
4940
Daniel Dunbar02633b52009-03-26 16:23:12 +00004941 if (Args.hasArg(options::OPT_fnested_functions))
4942 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004943
Daniel Dunbar02633b52009-03-26 16:23:12 +00004944 if (!Args.hasArg(options::OPT_nostdlib) &&
4945 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00004946 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar132e35d2010-09-17 01:20:05 +00004947 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbaredfa02b2009-04-08 06:06:21 +00004948
Daniel Dunbar02633b52009-03-26 16:23:12 +00004949 // link_ssp spec is empty.
4950
Daniel Dunbar6cd41542009-09-18 08:15:03 +00004951 // Let the tool chain choose which runtime library to link.
4952 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004953 }
4954
Chad Rosier18937312012-05-16 23:45:12 +00004955 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004956 !Args.hasArg(options::OPT_nostartfiles)) {
4957 // endfile_spec is empty.
4958 }
4959
4960 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4961 Args.AddAllArgs(CmdArgs, options::OPT_F);
4962
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004963 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004964 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004965 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar02633b52009-03-26 16:23:12 +00004966}
4967
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004968void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004969 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004970 const InputInfoList &Inputs,
4971 const ArgList &Args,
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004972 const char *LinkingOutput) const {
4973 ArgStringList CmdArgs;
4974
4975 CmdArgs.push_back("-create");
4976 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbara428df82009-03-24 00:24:37 +00004977
4978 CmdArgs.push_back("-output");
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004979 CmdArgs.push_back(Output.getFilename());
Daniel Dunbara428df82009-03-24 00:24:37 +00004980
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004981 for (InputInfoList::const_iterator
4982 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4983 const InputInfo &II = *it;
4984 assert(II.isFilename() && "Unexpected lipo input.");
4985 CmdArgs.push_back(II.getFilename());
4986 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004987 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004988 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004989 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004990}
Daniel Dunbar68a31d42009-03-31 17:45:15 +00004991
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004992void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004993 const InputInfo &Output,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004994 const InputInfoList &Inputs,
4995 const ArgList &Args,
4996 const char *LinkingOutput) const {
4997 ArgStringList CmdArgs;
4998
Daniel Dunbar03e92302011-05-09 17:23:16 +00004999 CmdArgs.push_back("-o");
5000 CmdArgs.push_back(Output.getFilename());
5001
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00005002 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5003 const InputInfo &Input = Inputs[0];
5004 assert(Input.isFilename() && "Unexpected dsymutil input.");
5005 CmdArgs.push_back(Input.getFilename());
5006
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00005007 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005008 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005009 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00005010}
5011
Eric Christopherf8571862011-08-23 17:56:55 +00005012void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher27e2b982012-12-18 00:31:10 +00005013 const InputInfo &Output,
5014 const InputInfoList &Inputs,
5015 const ArgList &Args,
5016 const char *LinkingOutput) const {
Eric Christopherf8571862011-08-23 17:56:55 +00005017 ArgStringList CmdArgs;
5018 CmdArgs.push_back("--verify");
Eric Christopher1c79dc42012-02-06 19:13:09 +00005019 CmdArgs.push_back("--debug-info");
5020 CmdArgs.push_back("--eh-frame");
Eric Christopherb822f722012-02-06 19:43:51 +00005021 CmdArgs.push_back("--quiet");
Eric Christopherf8571862011-08-23 17:56:55 +00005022
5023 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5024 const InputInfo &Input = Inputs[0];
5025 assert(Input.isFilename() && "Unexpected verify input");
5026
5027 // Grabbing the output of the earlier dsymutil run.
5028 CmdArgs.push_back(Input.getFilename());
5029
5030 const char *Exec =
5031 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5032 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5033}
5034
David Chisnall31c46902012-02-15 13:39:01 +00005035void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5036 const InputInfo &Output,
5037 const InputInfoList &Inputs,
5038 const ArgList &Args,
5039 const char *LinkingOutput) const {
5040 ArgStringList CmdArgs;
5041
5042 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5043 options::OPT_Xassembler);
5044
5045 CmdArgs.push_back("-o");
5046 CmdArgs.push_back(Output.getFilename());
5047
5048 for (InputInfoList::const_iterator
5049 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5050 const InputInfo &II = *it;
5051 CmdArgs.push_back(II.getFilename());
5052 }
5053
5054 const char *Exec =
5055 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5056 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5057}
5058
5059
5060void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5061 const InputInfo &Output,
5062 const InputInfoList &Inputs,
5063 const ArgList &Args,
5064 const char *LinkingOutput) const {
5065 // FIXME: Find a real GCC, don't hard-code versions here
5066 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5067 const llvm::Triple &T = getToolChain().getTriple();
5068 std::string LibPath = "/usr/lib/";
5069 llvm::Triple::ArchType Arch = T.getArch();
5070 switch (Arch) {
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00005071 case llvm::Triple::x86:
5072 GCCLibPath +=
5073 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5074 break;
5075 case llvm::Triple::x86_64:
5076 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5077 GCCLibPath += "/4.5.2/amd64/";
5078 LibPath += "amd64/";
5079 break;
5080 default:
5081 llvm_unreachable("Unsupported architecture");
David Chisnall31c46902012-02-15 13:39:01 +00005082 }
5083
5084 ArgStringList CmdArgs;
5085
David Chisnall41d476d2012-02-29 15:06:12 +00005086 // Demangle C++ names in errors
5087 CmdArgs.push_back("-C");
5088
David Chisnall31c46902012-02-15 13:39:01 +00005089 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5090 (!Args.hasArg(options::OPT_shared))) {
5091 CmdArgs.push_back("-e");
5092 CmdArgs.push_back("_start");
5093 }
5094
5095 if (Args.hasArg(options::OPT_static)) {
5096 CmdArgs.push_back("-Bstatic");
5097 CmdArgs.push_back("-dn");
5098 } else {
5099 CmdArgs.push_back("-Bdynamic");
5100 if (Args.hasArg(options::OPT_shared)) {
5101 CmdArgs.push_back("-shared");
5102 } else {
5103 CmdArgs.push_back("--dynamic-linker");
5104 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5105 }
5106 }
5107
5108 if (Output.isFilename()) {
5109 CmdArgs.push_back("-o");
5110 CmdArgs.push_back(Output.getFilename());
5111 } else {
5112 assert(Output.isNothing() && "Invalid output.");
5113 }
5114
5115 if (!Args.hasArg(options::OPT_nostdlib) &&
5116 !Args.hasArg(options::OPT_nostartfiles)) {
5117 if (!Args.hasArg(options::OPT_shared)) {
5118 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5119 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00005120 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005121 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5122 } else {
5123 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00005124 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5125 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005126 }
Hans Wennborg76b86c22013-07-18 20:29:38 +00005127 if (getToolChain().getDriver().CCCIsCXX())
David Chisnalle6dd6832012-03-13 14:14:54 +00005128 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005129 }
5130
5131 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5132
5133 Args.AddAllArgs(CmdArgs, options::OPT_L);
5134 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5135 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall165329c2012-02-28 17:10:04 +00005136 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnall31c46902012-02-15 13:39:01 +00005137
5138 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5139
5140 if (!Args.hasArg(options::OPT_nostdlib) &&
5141 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005142 if (getToolChain().getDriver().CCCIsCXX())
David Chisnalle58e6f92012-04-10 11:49:50 +00005143 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnallb6229592012-02-15 18:24:31 +00005144 CmdArgs.push_back("-lgcc_s");
David Chisnall165329c2012-02-28 17:10:04 +00005145 if (!Args.hasArg(options::OPT_shared)) {
5146 CmdArgs.push_back("-lgcc");
David Chisnall31c46902012-02-15 13:39:01 +00005147 CmdArgs.push_back("-lc");
David Chisnall7dbefe12012-02-28 20:06:45 +00005148 CmdArgs.push_back("-lm");
David Chisnall165329c2012-02-28 17:10:04 +00005149 }
David Chisnall31c46902012-02-15 13:39:01 +00005150 }
5151
5152 if (!Args.hasArg(options::OPT_nostdlib) &&
5153 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall165329c2012-02-28 17:10:04 +00005154 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005155 }
David Chisnalld1ac03e2012-02-16 16:00:47 +00005156 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005157
5158 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5159
5160 const char *Exec =
5161 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5162 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5163}
5164
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005165void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005166 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00005167 const InputInfoList &Inputs,
5168 const ArgList &Args,
5169 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005170 ArgStringList CmdArgs;
5171
5172 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5173 options::OPT_Xassembler);
5174
5175 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005176 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005177
5178 for (InputInfoList::const_iterator
5179 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5180 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005181 CmdArgs.push_back(II.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005182 }
5183
5184 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005185 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005186 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005187}
5188
5189void auroraux::Link::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 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00005197 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005198 CmdArgs.push_back("-e");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005199 CmdArgs.push_back("_start");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005200 }
5201
5202 if (Args.hasArg(options::OPT_static)) {
5203 CmdArgs.push_back("-Bstatic");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005204 CmdArgs.push_back("-dn");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005205 } else {
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005206// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005207 CmdArgs.push_back("-Bdynamic");
5208 if (Args.hasArg(options::OPT_shared)) {
5209 CmdArgs.push_back("-shared");
5210 } else {
Edward O'Callaghan3cecc192009-10-16 19:44:18 +00005211 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005212 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5213 }
5214 }
5215
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005216 if (Output.isFilename()) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005217 CmdArgs.push_back("-o");
5218 CmdArgs.push_back(Output.getFilename());
5219 } else {
5220 assert(Output.isNothing() && "Invalid output.");
5221 }
5222
5223 if (!Args.hasArg(options::OPT_nostdlib) &&
5224 !Args.hasArg(options::OPT_nostartfiles)) {
5225 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00005226 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005227 getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005228 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005229 getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005230 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005231 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005232 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005233 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005234 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005235 }
Chris Lattner38e317d2010-07-07 16:01:42 +00005236 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005237 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005238 }
5239
Daniel Dunbar294691e2009-11-04 06:24:38 +00005240 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5241 + getToolChain().getTripleString()
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00005242 + "/4.2.4"));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005243
5244 Args.AddAllArgs(CmdArgs, options::OPT_L);
5245 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5246 Args.AddAllArgs(CmdArgs, options::OPT_e);
5247
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005248 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005249
5250 if (!Args.hasArg(options::OPT_nostdlib) &&
5251 !Args.hasArg(options::OPT_nodefaultlibs)) {
5252 // FIXME: For some reason GCC passes -lgcc before adding
5253 // the default system libraries. Just mimic this for now.
5254 CmdArgs.push_back("-lgcc");
5255
5256 if (Args.hasArg(options::OPT_pthread))
5257 CmdArgs.push_back("-pthread");
5258 if (!Args.hasArg(options::OPT_shared))
5259 CmdArgs.push_back("-lc");
5260 CmdArgs.push_back("-lgcc");
5261 }
5262
5263 if (!Args.hasArg(options::OPT_nostdlib) &&
5264 !Args.hasArg(options::OPT_nostartfiles)) {
5265 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005266 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005267 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005268 }
5269
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005270 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005271
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005272 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005273 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005274 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005275}
5276
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005277void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005278 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005279 const InputInfoList &Inputs,
5280 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005281 const char *LinkingOutput) const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005282 ArgStringList CmdArgs;
5283
5284 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5285 options::OPT_Xassembler);
5286
5287 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005288 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005289
5290 for (InputInfoList::const_iterator
5291 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5292 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005293 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005294 }
5295
5296 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005297 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005298 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005299}
5300
5301void openbsd::Link::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,
5305 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00005306 const Driver &D = getToolChain().getDriver();
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005307 ArgStringList CmdArgs;
5308
Rafael Espindola6cc2a682012-12-31 22:41:36 +00005309 // Silence warning for "clang -g foo.o -o foo"
5310 Args.ClaimAllArgs(options::OPT_g_Group);
5311 // and "clang -emit-llvm foo.o -o foo"
5312 Args.ClaimAllArgs(options::OPT_emit_llvm);
5313 // and for "clang -w foo.o -o foo". Other warning options are already
5314 // handled somewhere else.
5315 Args.ClaimAllArgs(options::OPT_w);
5316
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005317 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00005318 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005319 CmdArgs.push_back("-e");
5320 CmdArgs.push_back("__start");
5321 }
5322
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005323 if (Args.hasArg(options::OPT_static)) {
5324 CmdArgs.push_back("-Bstatic");
5325 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005326 if (Args.hasArg(options::OPT_rdynamic))
5327 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005328 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005329 CmdArgs.push_back("-Bdynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005330 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005331 CmdArgs.push_back("-shared");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005332 } else {
5333 CmdArgs.push_back("-dynamic-linker");
5334 CmdArgs.push_back("/usr/libexec/ld.so");
5335 }
5336 }
5337
Rafael Espindola9adba392013-06-05 04:28:55 +00005338 if (Args.hasArg(options::OPT_nopie))
5339 CmdArgs.push_back("-nopie");
5340
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005341 if (Output.isFilename()) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005342 CmdArgs.push_back("-o");
5343 CmdArgs.push_back(Output.getFilename());
5344 } else {
5345 assert(Output.isNothing() && "Invalid output.");
5346 }
5347
5348 if (!Args.hasArg(options::OPT_nostdlib) &&
5349 !Args.hasArg(options::OPT_nostartfiles)) {
5350 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman62d829a2011-12-15 02:15:56 +00005351 if (Args.hasArg(options::OPT_pg))
5352 CmdArgs.push_back(Args.MakeArgString(
5353 getToolChain().GetFilePath("gcrt0.o")));
5354 else
5355 CmdArgs.push_back(Args.MakeArgString(
5356 getToolChain().GetFilePath("crt0.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005357 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005358 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005359 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005360 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005361 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005362 }
5363 }
5364
Edward O'Callaghane7e18202009-10-28 15:13:08 +00005365 std::string Triple = getToolChain().getTripleString();
5366 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar294691e2009-11-04 06:24:38 +00005367 Triple.replace(0, 6, "amd64");
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00005368 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbar95c04572010-08-01 23:13:54 +00005369 "/4.2.1"));
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005370
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005371 Args.AddAllArgs(CmdArgs, options::OPT_L);
5372 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5373 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindola6cc2a682012-12-31 22:41:36 +00005374 Args.AddAllArgs(CmdArgs, options::OPT_s);
5375 Args.AddAllArgs(CmdArgs, options::OPT_t);
5376 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5377 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005378
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005379 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005380
5381 if (!Args.hasArg(options::OPT_nostdlib) &&
5382 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005383 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00005384 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman62d829a2011-12-15 02:15:56 +00005385 if (Args.hasArg(options::OPT_pg))
5386 CmdArgs.push_back("-lm_p");
5387 else
5388 CmdArgs.push_back("-lm");
Daniel Dunbar95c04572010-08-01 23:13:54 +00005389 }
5390
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005391 // FIXME: For some reason GCC passes -lgcc before adding
5392 // the default system libraries. Just mimic this for now.
5393 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005394
Eric Christopherdc6cc872012-09-13 06:32:34 +00005395 if (Args.hasArg(options::OPT_pthread)) {
5396 if (!Args.hasArg(options::OPT_shared) &&
5397 Args.hasArg(options::OPT_pg))
5398 CmdArgs.push_back("-lpthread_p");
5399 else
5400 CmdArgs.push_back("-lpthread");
5401 }
5402
Chandler Carruth657849c2011-12-17 22:32:42 +00005403 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherdc6cc872012-09-13 06:32:34 +00005404 if (Args.hasArg(options::OPT_pg))
Eli Friedman62d829a2011-12-15 02:15:56 +00005405 CmdArgs.push_back("-lc_p");
5406 else
5407 CmdArgs.push_back("-lc");
Chandler Carruth657849c2011-12-17 22:32:42 +00005408 }
Eric Christopherdc6cc872012-09-13 06:32:34 +00005409
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005410 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005411 }
5412
5413 if (!Args.hasArg(options::OPT_nostdlib) &&
5414 !Args.hasArg(options::OPT_nostartfiles)) {
5415 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005416 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005417 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005418 else
Chris Lattner38e317d2010-07-07 16:01:42 +00005419 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005420 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005421 }
5422
5423 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005424 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005425 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005426}
Ed Schoutenc66a5a32009-04-02 19:13:12 +00005427
Eli Friedman42f74f22012-08-08 23:57:20 +00005428void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5429 const InputInfo &Output,
5430 const InputInfoList &Inputs,
5431 const ArgList &Args,
5432 const char *LinkingOutput) const {
5433 ArgStringList CmdArgs;
5434
5435 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5436 options::OPT_Xassembler);
5437
5438 CmdArgs.push_back("-o");
5439 CmdArgs.push_back(Output.getFilename());
5440
5441 for (InputInfoList::const_iterator
5442 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5443 const InputInfo &II = *it;
5444 CmdArgs.push_back(II.getFilename());
5445 }
5446
5447 const char *Exec =
5448 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5449 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5450}
5451
5452void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5453 const InputInfo &Output,
5454 const InputInfoList &Inputs,
5455 const ArgList &Args,
5456 const char *LinkingOutput) const {
5457 const Driver &D = getToolChain().getDriver();
5458 ArgStringList CmdArgs;
5459
5460 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5461 (!Args.hasArg(options::OPT_shared))) {
5462 CmdArgs.push_back("-e");
5463 CmdArgs.push_back("__start");
5464 }
5465
5466 if (Args.hasArg(options::OPT_static)) {
5467 CmdArgs.push_back("-Bstatic");
5468 } else {
5469 if (Args.hasArg(options::OPT_rdynamic))
5470 CmdArgs.push_back("-export-dynamic");
5471 CmdArgs.push_back("--eh-frame-hdr");
5472 CmdArgs.push_back("-Bdynamic");
5473 if (Args.hasArg(options::OPT_shared)) {
5474 CmdArgs.push_back("-shared");
5475 } else {
5476 CmdArgs.push_back("-dynamic-linker");
5477 CmdArgs.push_back("/usr/libexec/ld.so");
5478 }
5479 }
5480
5481 if (Output.isFilename()) {
5482 CmdArgs.push_back("-o");
5483 CmdArgs.push_back(Output.getFilename());
5484 } else {
5485 assert(Output.isNothing() && "Invalid output.");
5486 }
5487
5488 if (!Args.hasArg(options::OPT_nostdlib) &&
5489 !Args.hasArg(options::OPT_nostartfiles)) {
5490 if (!Args.hasArg(options::OPT_shared)) {
5491 if (Args.hasArg(options::OPT_pg))
5492 CmdArgs.push_back(Args.MakeArgString(
5493 getToolChain().GetFilePath("gcrt0.o")));
5494 else
5495 CmdArgs.push_back(Args.MakeArgString(
5496 getToolChain().GetFilePath("crt0.o")));
5497 CmdArgs.push_back(Args.MakeArgString(
5498 getToolChain().GetFilePath("crtbegin.o")));
5499 } else {
5500 CmdArgs.push_back(Args.MakeArgString(
5501 getToolChain().GetFilePath("crtbeginS.o")));
5502 }
5503 }
5504
5505 Args.AddAllArgs(CmdArgs, options::OPT_L);
5506 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5507 Args.AddAllArgs(CmdArgs, options::OPT_e);
5508
5509 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5510
5511 if (!Args.hasArg(options::OPT_nostdlib) &&
5512 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005513 if (D.CCCIsCXX()) {
Eli Friedman42f74f22012-08-08 23:57:20 +00005514 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5515 if (Args.hasArg(options::OPT_pg))
5516 CmdArgs.push_back("-lm_p");
5517 else
5518 CmdArgs.push_back("-lm");
5519 }
5520
Rafael Espindola3667bbe2012-10-23 17:07:31 +00005521 if (Args.hasArg(options::OPT_pthread)) {
5522 if (!Args.hasArg(options::OPT_shared) &&
5523 Args.hasArg(options::OPT_pg))
5524 CmdArgs.push_back("-lpthread_p");
5525 else
5526 CmdArgs.push_back("-lpthread");
5527 }
5528
Eli Friedman42f74f22012-08-08 23:57:20 +00005529 if (!Args.hasArg(options::OPT_shared)) {
5530 if (Args.hasArg(options::OPT_pg))
5531 CmdArgs.push_back("-lc_p");
5532 else
5533 CmdArgs.push_back("-lc");
5534 }
5535
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00005536 StringRef MyArch;
5537 switch (getToolChain().getTriple().getArch()) {
5538 case llvm::Triple::arm:
5539 MyArch = "arm";
5540 break;
5541 case llvm::Triple::x86:
5542 MyArch = "i386";
5543 break;
5544 case llvm::Triple::x86_64:
5545 MyArch = "amd64";
5546 break;
5547 default:
5548 llvm_unreachable("Unsupported architecture");
5549 }
5550 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman42f74f22012-08-08 23:57:20 +00005551 }
5552
5553 if (!Args.hasArg(options::OPT_nostdlib) &&
5554 !Args.hasArg(options::OPT_nostartfiles)) {
5555 if (!Args.hasArg(options::OPT_shared))
5556 CmdArgs.push_back(Args.MakeArgString(
5557 getToolChain().GetFilePath("crtend.o")));
5558 else
5559 CmdArgs.push_back(Args.MakeArgString(
5560 getToolChain().GetFilePath("crtendS.o")));
5561 }
Eli Friedmanc9c48db2012-08-09 22:42:04 +00005562
5563 const char *Exec =
5564 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5565 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman42f74f22012-08-08 23:57:20 +00005566}
5567
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005568void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005569 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005570 const InputInfoList &Inputs,
5571 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005572 const char *LinkingOutput) const {
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005573 ArgStringList CmdArgs;
5574
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005575 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5576 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc55da4b2012-09-05 21:32:44 +00005577 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005578 CmdArgs.push_back("--32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005579 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky3393cef2011-06-04 07:37:31 +00005580 CmdArgs.push_back("-a32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005581 else if (getToolChain().getArch() == llvm::Triple::mips ||
5582 getToolChain().getArch() == llvm::Triple::mipsel ||
5583 getToolChain().getArch() == llvm::Triple::mips64 ||
5584 getToolChain().getArch() == llvm::Triple::mips64el) {
5585 StringRef CPUName;
5586 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00005587 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer20249a12010-10-21 03:16:25 +00005588
Eric Christopherc55da4b2012-09-05 21:32:44 +00005589 CmdArgs.push_back("-march");
5590 CmdArgs.push_back(CPUName.data());
5591
Eric Christopherc55da4b2012-09-05 21:32:44 +00005592 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00005593 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc55da4b2012-09-05 21:32:44 +00005594
5595 if (getToolChain().getArch() == llvm::Triple::mips ||
5596 getToolChain().getArch() == llvm::Triple::mips64)
5597 CmdArgs.push_back("-EB");
5598 else
5599 CmdArgs.push_back("-EL");
5600
5601 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5602 options::OPT_fpic, options::OPT_fno_pic,
5603 options::OPT_fPIE, options::OPT_fno_PIE,
5604 options::OPT_fpie, options::OPT_fno_pie);
5605 if (LastPICArg &&
5606 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5607 LastPICArg->getOption().matches(options::OPT_fpic) ||
5608 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5609 LastPICArg->getOption().matches(options::OPT_fpie))) {
5610 CmdArgs.push_back("-KPIC");
5611 }
Rafael Espindola27fa2362012-12-13 04:17:14 +00005612 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5613 getToolChain().getArch() == llvm::Triple::thumb) {
5614 CmdArgs.push_back("-mfpu=softvfp");
5615 switch(getToolChain().getTriple().getEnvironment()) {
5616 case llvm::Triple::GNUEABI:
5617 case llvm::Triple::EABI:
Anton Korobeynikovb234e742013-03-18 07:59:20 +00005618 CmdArgs.push_back("-meabi=5");
Rafael Espindola27fa2362012-12-13 04:17:14 +00005619 break;
5620
5621 default:
5622 CmdArgs.push_back("-matpcs");
5623 }
Eric Christopherc55da4b2012-09-05 21:32:44 +00005624 }
Eric Christophered734732010-03-02 02:41:08 +00005625
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005626 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5627 options::OPT_Xassembler);
5628
5629 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005630 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005631
5632 for (InputInfoList::const_iterator
5633 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5634 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005635 CmdArgs.push_back(II.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005636 }
5637
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005638 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005639 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005640 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005641}
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005642
5643void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005644 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005645 const InputInfoList &Inputs,
5646 const ArgList &Args,
Daniel Dunbara8304f62009-05-02 20:14:53 +00005647 const char *LinkingOutput) const {
Roman Divacky94380162012-08-28 15:09:03 +00005648 const toolchains::FreeBSD& ToolChain =
5649 static_cast<const toolchains::FreeBSD&>(getToolChain());
5650 const Driver &D = ToolChain.getDriver();
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005651 ArgStringList CmdArgs;
David Chisnalldfa210b2012-07-29 15:24:44 +00005652
5653 // Silence warning for "clang -g foo.o -o foo"
5654 Args.ClaimAllArgs(options::OPT_g_Group);
5655 // and "clang -emit-llvm foo.o -o foo"
5656 Args.ClaimAllArgs(options::OPT_emit_llvm);
5657 // and for "clang -w foo.o -o foo". Other warning options are already
5658 // handled somewhere else.
5659 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005660
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005661 if (!D.SysRoot.empty())
5662 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5663
Roman Divacky94380162012-08-28 15:09:03 +00005664 if (Args.hasArg(options::OPT_pie))
5665 CmdArgs.push_back("-pie");
5666
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005667 if (Args.hasArg(options::OPT_static)) {
5668 CmdArgs.push_back("-Bstatic");
5669 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005670 if (Args.hasArg(options::OPT_rdynamic))
5671 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005672 CmdArgs.push_back("--eh-frame-hdr");
5673 if (Args.hasArg(options::OPT_shared)) {
5674 CmdArgs.push_back("-Bshareable");
5675 } else {
5676 CmdArgs.push_back("-dynamic-linker");
5677 CmdArgs.push_back("/libexec/ld-elf.so.1");
5678 }
Roman Divacky94380162012-08-28 15:09:03 +00005679 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5680 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnalldfa210b2012-07-29 15:24:44 +00005681 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5682 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5683 CmdArgs.push_back("--hash-style=both");
5684 }
5685 }
5686 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005687 }
5688
5689 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5690 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005691 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005692 CmdArgs.push_back("-m");
5693 CmdArgs.push_back("elf_i386_fbsd");
5694 }
5695
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005696 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky000a6552011-06-04 07:40:24 +00005697 CmdArgs.push_back("-m");
Roman Divacky1052c1d2011-11-21 16:50:32 +00005698 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky000a6552011-06-04 07:40:24 +00005699 }
5700
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005701 if (Output.isFilename()) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005702 CmdArgs.push_back("-o");
5703 CmdArgs.push_back(Output.getFilename());
5704 } else {
5705 assert(Output.isNothing() && "Invalid output.");
5706 }
5707
5708 if (!Args.hasArg(options::OPT_nostdlib) &&
5709 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divacky94380162012-08-28 15:09:03 +00005710 const char *crt1 = NULL;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005711 if (!Args.hasArg(options::OPT_shared)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005712 if (Args.hasArg(options::OPT_pg))
Roman Divacky94380162012-08-28 15:09:03 +00005713 crt1 = "gcrt1.o";
5714 else if (Args.hasArg(options::OPT_pie))
5715 crt1 = "Scrt1.o";
5716 else
5717 crt1 = "crt1.o";
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005718 }
Roman Divacky94380162012-08-28 15:09:03 +00005719 if (crt1)
5720 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5721
5722 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5723
5724 const char *crtbegin = NULL;
5725 if (Args.hasArg(options::OPT_static))
5726 crtbegin = "crtbeginT.o";
5727 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5728 crtbegin = "crtbeginS.o";
5729 else
5730 crtbegin = "crtbegin.o";
5731
5732 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005733 }
5734
5735 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divacky94380162012-08-28 15:09:03 +00005736 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divacky58e5ac92011-03-01 17:53:14 +00005737 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5738 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005739 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005740 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5741 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnallc7363772010-08-15 22:58:12 +00005742 Args.AddAllArgs(CmdArgs, options::OPT_s);
5743 Args.AddAllArgs(CmdArgs, options::OPT_t);
5744 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5745 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005746
Roman Divacky94380162012-08-28 15:09:03 +00005747 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005748
5749 if (!Args.hasArg(options::OPT_nostdlib) &&
5750 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005751 if (D.CCCIsCXX()) {
Roman Divacky94380162012-08-28 15:09:03 +00005752 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divackyc16bb762011-02-10 16:59:40 +00005753 if (Args.hasArg(options::OPT_pg))
5754 CmdArgs.push_back("-lm_p");
5755 else
5756 CmdArgs.push_back("-lm");
Daniel Dunbar20022632010-02-17 08:07:51 +00005757 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005758 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5759 // the default system libraries. Just mimic this for now.
Roman Divackyc16bb762011-02-10 16:59:40 +00005760 if (Args.hasArg(options::OPT_pg))
5761 CmdArgs.push_back("-lgcc_p");
5762 else
5763 CmdArgs.push_back("-lgcc");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005764 if (Args.hasArg(options::OPT_static)) {
5765 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005766 } else if (Args.hasArg(options::OPT_pg)) {
5767 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005768 } else {
5769 CmdArgs.push_back("--as-needed");
5770 CmdArgs.push_back("-lgcc_s");
5771 CmdArgs.push_back("--no-as-needed");
5772 }
5773
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005774 if (Args.hasArg(options::OPT_pthread)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005775 if (Args.hasArg(options::OPT_pg))
5776 CmdArgs.push_back("-lpthread_p");
5777 else
5778 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005779 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005780
Roman Divackyc16bb762011-02-10 16:59:40 +00005781 if (Args.hasArg(options::OPT_pg)) {
5782 if (Args.hasArg(options::OPT_shared))
5783 CmdArgs.push_back("-lc");
5784 else
5785 CmdArgs.push_back("-lc_p");
5786 CmdArgs.push_back("-lgcc_p");
5787 } else {
5788 CmdArgs.push_back("-lc");
5789 CmdArgs.push_back("-lgcc");
5790 }
5791
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005792 if (Args.hasArg(options::OPT_static)) {
5793 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005794 } else if (Args.hasArg(options::OPT_pg)) {
5795 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005796 } else {
5797 CmdArgs.push_back("--as-needed");
5798 CmdArgs.push_back("-lgcc_s");
5799 CmdArgs.push_back("--no-as-needed");
5800 }
5801 }
5802
5803 if (!Args.hasArg(options::OPT_nostdlib) &&
5804 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyf6513812012-09-07 13:36:21 +00005805 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divacky94380162012-08-28 15:09:03 +00005806 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackyf6513812012-09-07 13:36:21 +00005807 else
5808 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divacky94380162012-08-28 15:09:03 +00005809 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005810 }
5811
Roman Divacky94380162012-08-28 15:09:03 +00005812 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005813
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005814 const char *Exec =
Roman Divacky94380162012-08-28 15:09:03 +00005815 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005816 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005817}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005818
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005819void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5820 const InputInfo &Output,
5821 const InputInfoList &Inputs,
5822 const ArgList &Args,
5823 const char *LinkingOutput) const {
5824 ArgStringList CmdArgs;
5825
5826 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5827 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005828 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005829 CmdArgs.push_back("--32");
5830
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005831 // Set byte order explicitly
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005832 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005833 CmdArgs.push_back("-EB");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005834 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005835 CmdArgs.push_back("-EL");
5836
5837 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5838 options::OPT_Xassembler);
5839
5840 CmdArgs.push_back("-o");
5841 CmdArgs.push_back(Output.getFilename());
5842
5843 for (InputInfoList::const_iterator
5844 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5845 const InputInfo &II = *it;
5846 CmdArgs.push_back(II.getFilename());
5847 }
5848
David Chisnall5adcec12011-09-27 22:03:18 +00005849 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005850 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5851}
5852
5853void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5854 const InputInfo &Output,
5855 const InputInfoList &Inputs,
5856 const ArgList &Args,
5857 const char *LinkingOutput) const {
5858 const Driver &D = getToolChain().getDriver();
5859 ArgStringList CmdArgs;
5860
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005861 if (!D.SysRoot.empty())
5862 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5863
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005864 if (Args.hasArg(options::OPT_static)) {
5865 CmdArgs.push_back("-Bstatic");
5866 } else {
5867 if (Args.hasArg(options::OPT_rdynamic))
5868 CmdArgs.push_back("-export-dynamic");
5869 CmdArgs.push_back("--eh-frame-hdr");
5870 if (Args.hasArg(options::OPT_shared)) {
5871 CmdArgs.push_back("-Bshareable");
5872 } else {
5873 CmdArgs.push_back("-dynamic-linker");
5874 CmdArgs.push_back("/libexec/ld.elf_so");
5875 }
5876 }
5877
5878 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5879 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005880 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005881 CmdArgs.push_back("-m");
5882 CmdArgs.push_back("elf_i386");
5883 }
5884
5885 if (Output.isFilename()) {
5886 CmdArgs.push_back("-o");
5887 CmdArgs.push_back(Output.getFilename());
5888 } else {
5889 assert(Output.isNothing() && "Invalid output.");
5890 }
5891
5892 if (!Args.hasArg(options::OPT_nostdlib) &&
5893 !Args.hasArg(options::OPT_nostartfiles)) {
5894 if (!Args.hasArg(options::OPT_shared)) {
5895 CmdArgs.push_back(Args.MakeArgString(
5896 getToolChain().GetFilePath("crt0.o")));
5897 CmdArgs.push_back(Args.MakeArgString(
5898 getToolChain().GetFilePath("crti.o")));
5899 CmdArgs.push_back(Args.MakeArgString(
5900 getToolChain().GetFilePath("crtbegin.o")));
5901 } else {
5902 CmdArgs.push_back(Args.MakeArgString(
5903 getToolChain().GetFilePath("crti.o")));
5904 CmdArgs.push_back(Args.MakeArgString(
5905 getToolChain().GetFilePath("crtbeginS.o")));
5906 }
5907 }
5908
5909 Args.AddAllArgs(CmdArgs, options::OPT_L);
5910 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5911 Args.AddAllArgs(CmdArgs, options::OPT_e);
5912 Args.AddAllArgs(CmdArgs, options::OPT_s);
5913 Args.AddAllArgs(CmdArgs, options::OPT_t);
5914 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5915 Args.AddAllArgs(CmdArgs, options::OPT_r);
5916
5917 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5918
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00005919 unsigned Major, Minor, Micro;
5920 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
5921 bool useLibgcc = true;
5922 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
5923 if (getToolChain().getArch() == llvm::Triple::x86 ||
5924 getToolChain().getArch() == llvm::Triple::x86_64)
5925 useLibgcc = false;
5926 }
5927
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005928 if (!Args.hasArg(options::OPT_nostdlib) &&
5929 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005930 if (D.CCCIsCXX()) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005931 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5932 CmdArgs.push_back("-lm");
5933 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005934 if (Args.hasArg(options::OPT_pthread))
5935 CmdArgs.push_back("-lpthread");
5936 CmdArgs.push_back("-lc");
5937
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00005938 if (useLibgcc) {
5939 if (Args.hasArg(options::OPT_static)) {
5940 // libgcc_eh depends on libc, so resolve as much as possible,
5941 // pull in any new requirements from libc and then get the rest
5942 // of libgcc.
5943 CmdArgs.push_back("-lgcc_eh");
5944 CmdArgs.push_back("-lc");
5945 CmdArgs.push_back("-lgcc");
5946 } else {
5947 CmdArgs.push_back("-lgcc");
5948 CmdArgs.push_back("--as-needed");
5949 CmdArgs.push_back("-lgcc_s");
5950 CmdArgs.push_back("--no-as-needed");
5951 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005952 }
5953 }
5954
5955 if (!Args.hasArg(options::OPT_nostdlib) &&
5956 !Args.hasArg(options::OPT_nostartfiles)) {
5957 if (!Args.hasArg(options::OPT_shared))
5958 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5959 "crtend.o")));
5960 else
5961 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5962 "crtendS.o")));
5963 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5964 "crtn.o")));
5965 }
5966
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005967 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005968
David Chisnall5adcec12011-09-27 22:03:18 +00005969 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005970 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5971}
5972
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00005973void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5974 const InputInfo &Output,
5975 const InputInfoList &Inputs,
5976 const ArgList &Args,
5977 const char *LinkingOutput) const {
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005978 ArgStringList CmdArgs;
5979
5980 // Add --32/--64 to make sure we get the format we want.
5981 // This is incomplete
5982 if (getToolChain().getArch() == llvm::Triple::x86) {
5983 CmdArgs.push_back("--32");
5984 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5985 CmdArgs.push_back("--64");
Eli Friedman7972c882011-11-28 23:46:52 +00005986 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5987 CmdArgs.push_back("-a32");
5988 CmdArgs.push_back("-mppc");
5989 CmdArgs.push_back("-many");
5990 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5991 CmdArgs.push_back("-a64");
5992 CmdArgs.push_back("-mppc64");
5993 CmdArgs.push_back("-many");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00005994 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
5995 CmdArgs.push_back("-a64");
5996 CmdArgs.push_back("-mppc64le");
5997 CmdArgs.push_back("-many");
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005998 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00005999 StringRef MArch = getToolChain().getArchName();
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006000 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6001 CmdArgs.push_back("-mfpu=neon");
Bernard Ogden80e90c22013-10-24 18:32:41 +00006002 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a")
6003 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00006004
6005 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
6006 getToolChain().getTriple());
6007 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00006008
6009 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
6010 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
6011 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanakac85900f2011-11-30 19:31:38 +00006012 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6013 getToolChain().getArch() == llvm::Triple::mipsel ||
6014 getToolChain().getArch() == llvm::Triple::mips64 ||
6015 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan073a7802012-04-07 22:31:29 +00006016 StringRef CPUName;
6017 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00006018 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanakac85900f2011-11-30 19:31:38 +00006019
Simon Atanasyan073a7802012-04-07 22:31:29 +00006020 CmdArgs.push_back("-march");
6021 CmdArgs.push_back(CPUName.data());
6022
Simon Atanasyan073a7802012-04-07 22:31:29 +00006023 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00006024 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan5f0a1c12012-04-06 19:15:24 +00006025
6026 if (getToolChain().getArch() == llvm::Triple::mips ||
6027 getToolChain().getArch() == llvm::Triple::mips64)
6028 CmdArgs.push_back("-EB");
6029 else
6030 CmdArgs.push_back("-EL");
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00006031
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00006032 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6033 if (StringRef(A->getValue()) == "2008")
6034 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6035 }
6036
Simon Atanasyan9dbfc612013-04-30 07:47:13 +00006037 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6038 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6039 options::OPT_mno_micromips);
6040 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6041 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6042
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00006043 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6044 options::OPT_fpic, options::OPT_fno_pic,
6045 options::OPT_fPIE, options::OPT_fno_PIE,
6046 options::OPT_fpie, options::OPT_fno_pie);
6047 if (LastPICArg &&
6048 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6049 LastPICArg->getOption().matches(options::OPT_fpic) ||
6050 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6051 LastPICArg->getOption().matches(options::OPT_fpie))) {
6052 CmdArgs.push_back("-KPIC");
6053 }
Ulrich Weigandb8409212013-05-06 16:26:41 +00006054 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00006055 // Always pass an -march option, since our default of z10 is later
6056 // than the GNU assembler's default.
6057 StringRef CPUName = getSystemZTargetCPU(Args);
6058 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006059 }
6060
6061 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6062 options::OPT_Xassembler);
6063
6064 CmdArgs.push_back("-o");
6065 CmdArgs.push_back(Output.getFilename());
6066
6067 for (InputInfoList::const_iterator
6068 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6069 const InputInfo &II = *it;
6070 CmdArgs.push_back(II.getFilename());
6071 }
6072
6073 const char *Exec =
6074 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6075 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopherc47b6f32013-06-05 23:58:15 +00006076
6077 // Handle the debug info splitting at object creation time if we're
6078 // creating an object.
6079 // TODO: Currently only works on linux with newer objcopy.
6080 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00006081 getToolChain().getTriple().isOSLinux())
Eric Christopherc47b6f32013-06-05 23:58:15 +00006082 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6083 SplitDebugName(Args, Inputs));
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006084}
6085
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006086static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6087 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chien94a71422012-09-02 09:30:11 +00006088 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth68f94db2013-03-04 02:07:55 +00006089 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6090 Args.hasArg(options::OPT_static);
Hans Wennborg76b86c22013-07-18 20:29:38 +00006091 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006092 CmdArgs.push_back("-lgcc");
6093
Logan Chien529a73d2012-11-19 12:04:11 +00006094 if (StaticLibgcc || isAndroid) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006095 if (D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006096 CmdArgs.push_back("-lgcc");
6097 } else {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006098 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006099 CmdArgs.push_back("--as-needed");
6100 CmdArgs.push_back("-lgcc_s");
Hans Wennborg76b86c22013-07-18 20:29:38 +00006101 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006102 CmdArgs.push_back("--no-as-needed");
6103 }
6104
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006105 if (StaticLibgcc && !isAndroid)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006106 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg76b86c22013-07-18 20:29:38 +00006107 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006108 CmdArgs.push_back("-lgcc");
Logan Chien529a73d2012-11-19 12:04:11 +00006109
6110 // According to Android ABI, we have to link with libdl if we are
6111 // linking with non-static libgcc.
6112 //
6113 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6114 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6115 if (isAndroid && !StaticLibgcc)
6116 CmdArgs.push_back("-ldl");
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006117}
6118
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00006119static bool hasMipsN32ABIArg(const ArgList &Args) {
6120 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smith1d489cf2012-11-01 04:30:05 +00006121 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00006122}
6123
Peter Collingbournebdaa1342013-05-27 21:40:20 +00006124static StringRef getLinuxDynamicLinker(const ArgList &Args,
6125 const toolchains::Linux &ToolChain) {
6126 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6127 return "/system/bin/linker";
6128 else if (ToolChain.getArch() == llvm::Triple::x86)
6129 return "/lib/ld-linux.so.2";
6130 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6131 return "/lib/ld-linux-aarch64.so.1";
6132 else if (ToolChain.getArch() == llvm::Triple::arm ||
6133 ToolChain.getArch() == llvm::Triple::thumb) {
6134 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6135 return "/lib/ld-linux-armhf.so.3";
6136 else
6137 return "/lib/ld-linux.so.3";
6138 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6139 ToolChain.getArch() == llvm::Triple::mipsel)
6140 return "/lib/ld.so.1";
6141 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6142 ToolChain.getArch() == llvm::Triple::mips64el) {
6143 if (hasMipsN32ABIArg(Args))
6144 return "/lib32/ld.so.1";
6145 else
6146 return "/lib64/ld.so.1";
6147 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6148 return "/lib/ld.so.1";
6149 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00006150 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbournebdaa1342013-05-27 21:40:20 +00006151 ToolChain.getArch() == llvm::Triple::systemz)
6152 return "/lib64/ld64.so.1";
6153 else
6154 return "/lib64/ld-linux-x86-64.so.2";
6155}
6156
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00006157void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6158 const InputInfo &Output,
6159 const InputInfoList &Inputs,
6160 const ArgList &Args,
6161 const char *LinkingOutput) const {
Rafael Espindolac1da9812010-11-07 20:14:31 +00006162 const toolchains::Linux& ToolChain =
6163 static_cast<const toolchains::Linux&>(getToolChain());
6164 const Driver &D = ToolChain.getDriver();
Rafael Espindola715852c2012-11-02 20:41:30 +00006165 const bool isAndroid =
6166 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Alexey Samsonov1b8f12d2013-08-19 09:14:21 +00006167 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006168 const bool IsPIE =
6169 !Args.hasArg(options::OPT_shared) &&
Alexey Samsonov8bdc92c2013-08-09 07:42:13 +00006170 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow(ToolChain));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006171
Rafael Espindolac1da9812010-11-07 20:14:31 +00006172 ArgStringList CmdArgs;
6173
Rafael Espindola26f14c32010-11-15 18:28:16 +00006174 // Silence warning for "clang -g foo.o -o foo"
6175 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00006176 // and "clang -emit-llvm foo.o -o foo"
6177 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnalldfa210b2012-07-29 15:24:44 +00006178 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindola7f6458b2010-11-17 20:37:10 +00006179 // handled somewhere else.
6180 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola26f14c32010-11-15 18:28:16 +00006181
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006182 if (!D.SysRoot.empty())
6183 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006184
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006185 if (IsPIE)
Rafael Espindolafdda1712010-11-17 22:26:15 +00006186 CmdArgs.push_back("-pie");
6187
Rafael Espindoladc1b76d2010-11-07 22:57:16 +00006188 if (Args.hasArg(options::OPT_rdynamic))
6189 CmdArgs.push_back("-export-dynamic");
6190
Rafael Espindolae0e6d3b2010-11-11 19:34:42 +00006191 if (Args.hasArg(options::OPT_s))
6192 CmdArgs.push_back("-s");
6193
Rafael Espindolac1da9812010-11-07 20:14:31 +00006194 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6195 e = ToolChain.ExtraOpts.end();
6196 i != e; ++i)
6197 CmdArgs.push_back(i->c_str());
6198
6199 if (!Args.hasArg(options::OPT_static)) {
6200 CmdArgs.push_back("--eh-frame-hdr");
6201 }
6202
6203 CmdArgs.push_back("-m");
6204 if (ToolChain.getArch() == llvm::Triple::x86)
6205 CmdArgs.push_back("elf_i386");
Tim Northoverc264e162013-01-31 12:13:10 +00006206 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6207 CmdArgs.push_back("aarch64linux");
Eric Christopher88b7cf02011-08-19 00:30:14 +00006208 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregorf0594d82011-03-06 19:11:49 +00006209 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00006210 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43ac2972011-04-05 22:04:27 +00006211 else if (ToolChain.getArch() == llvm::Triple::ppc)
6212 CmdArgs.push_back("elf32ppclinux");
6213 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6214 CmdArgs.push_back("elf64ppc");
Eli Friedman5bea4f62011-11-08 19:43:37 +00006215 else if (ToolChain.getArch() == llvm::Triple::mips)
6216 CmdArgs.push_back("elf32btsmip");
6217 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6218 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00006219 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6220 if (hasMipsN32ABIArg(Args))
6221 CmdArgs.push_back("elf32btsmipn32");
6222 else
6223 CmdArgs.push_back("elf64btsmip");
6224 }
6225 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6226 if (hasMipsN32ABIArg(Args))
6227 CmdArgs.push_back("elf32ltsmipn32");
6228 else
6229 CmdArgs.push_back("elf64ltsmip");
6230 }
Ulrich Weigandb8409212013-05-06 16:26:41 +00006231 else if (ToolChain.getArch() == llvm::Triple::systemz)
6232 CmdArgs.push_back("elf64_s390");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006233 else
6234 CmdArgs.push_back("elf_x86_64");
6235
6236 if (Args.hasArg(options::OPT_static)) {
Douglas Gregorf0594d82011-03-06 19:11:49 +00006237 if (ToolChain.getArch() == llvm::Triple::arm
6238 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00006239 CmdArgs.push_back("-Bstatic");
6240 else
6241 CmdArgs.push_back("-static");
6242 } else if (Args.hasArg(options::OPT_shared)) {
6243 CmdArgs.push_back("-shared");
Rafael Espindola715852c2012-11-02 20:41:30 +00006244 if (isAndroid) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006245 CmdArgs.push_back("-Bsymbolic");
6246 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006247 }
6248
6249 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregorf0594d82011-03-06 19:11:49 +00006250 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac1da9812010-11-07 20:14:31 +00006251 (!Args.hasArg(options::OPT_static) &&
6252 !Args.hasArg(options::OPT_shared))) {
6253 CmdArgs.push_back("-dynamic-linker");
Peter Collingbournebdaa1342013-05-27 21:40:20 +00006254 CmdArgs.push_back(Args.MakeArgString(
6255 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006256 }
6257
6258 CmdArgs.push_back("-o");
6259 CmdArgs.push_back(Output.getFilename());
6260
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006261 if (!Args.hasArg(options::OPT_nostdlib) &&
6262 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006263 if (!isAndroid) {
6264 const char *crt1 = NULL;
6265 if (!Args.hasArg(options::OPT_shared)){
Eric Christopher61f08682013-06-07 23:25:01 +00006266 if (Args.hasArg(options::OPT_pg))
6267 crt1 = "gcrt1.o";
6268 else if (IsPIE)
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006269 crt1 = "Scrt1.o";
6270 else
6271 crt1 = "crt1.o";
6272 }
6273 if (crt1)
6274 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006275
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006276 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6277 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006278
Rafael Espindola89414b32010-11-12 03:00:39 +00006279 const char *crtbegin;
6280 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006281 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006282 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006283 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006284 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006285 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006286 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006287 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006288 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramere20e5082012-10-04 19:42:20 +00006289
6290 // Add crtfastmath.o if available and fast math is enabled.
6291 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola89414b32010-11-12 03:00:39 +00006292 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006293
6294 Args.AddAllArgs(CmdArgs, options::OPT_L);
6295
6296 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6297
Roman Divacky58e5ac92011-03-01 17:53:14 +00006298 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6299 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00006300 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006301
Rafael Espindolac5151542012-04-09 23:53:34 +00006302 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6303 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6304 // forward.
Rafael Espindola6155fbe2013-09-04 19:37:35 +00006305 if (D.IsUsingLTO(Args)) {
Rafael Espindolac5151542012-04-09 23:53:34 +00006306 CmdArgs.push_back("-plugin");
6307 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6308 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth700d4e42013-01-13 11:46:33 +00006309
6310 // Try to pass driver level flags relevant to LTO code generation down to
6311 // the plugin.
6312
Rafael Espindolab330e402013-08-20 22:12:08 +00006313 // Handle flags for selecting CPU variants.
6314 std::string CPU = getCPUName(Args, ToolChain.getTriple());
6315 if (!CPU.empty()) {
Chandler Carruth700d4e42013-01-13 11:46:33 +00006316 CmdArgs.push_back(
Rafael Espindolab330e402013-08-20 22:12:08 +00006317 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6318 CPU));
6319 }
Rafael Espindolac5151542012-04-09 23:53:34 +00006320 }
6321
Chandler Carruth700d4e42013-01-13 11:46:33 +00006322
Nick Lewyckye276cfc2012-08-17 03:39:16 +00006323 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6324 CmdArgs.push_back("--no-demangle");
6325
Rafael Espindolac1da9812010-11-07 20:14:31 +00006326 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6327
Eric Christopher6716d942012-11-29 18:51:05 +00006328 // Call these before we add the C++ ABI library.
Richard Smithc4dabad2012-11-05 22:04:41 +00006329 if (Sanitize.needsUbsanRt())
Hans Wennborg76b86c22013-07-18 20:29:38 +00006330 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
Richard Smith61a574f2013-03-20 23:49:07 +00006331 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev050309f2013-05-27 11:17:01 +00006332 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher6716d942012-11-29 18:51:05 +00006333 if (Sanitize.needsAsanRt())
6334 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6335 if (Sanitize.needsTsanRt())
6336 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00006337 if (Sanitize.needsMsanRt())
6338 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev050309f2013-05-27 11:17:01 +00006339 if (Sanitize.needsLsanRt())
6340 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Peter Collingbourne2eeed712013-08-07 22:47:34 +00006341 if (Sanitize.needsDfsanRt())
6342 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith8e1cee62012-10-25 02:14:12 +00006343
Chandler Carruth80a393e2013-06-24 09:38:45 +00006344 // The profile runtime also needs access to system libraries.
6345 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6346
Hans Wennborg76b86c22013-07-18 20:29:38 +00006347 if (D.CCCIsCXX() &&
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006348 !Args.hasArg(options::OPT_nostdlib) &&
6349 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola19706f82011-10-17 22:14:51 +00006350 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6351 !Args.hasArg(options::OPT_static);
6352 if (OnlyLibstdcxxStatic)
6353 CmdArgs.push_back("-Bstatic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006354 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola19706f82011-10-17 22:14:51 +00006355 if (OnlyLibstdcxxStatic)
6356 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006357 CmdArgs.push_back("-lm");
6358 }
6359
Rafael Espindola89414b32010-11-12 03:00:39 +00006360 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006361 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6362 if (Args.hasArg(options::OPT_static))
6363 CmdArgs.push_back("--start-group");
Nick Lewycky80df0252011-06-04 06:27:06 +00006364
Chandler Carruthdf96e022013-01-17 13:19:29 +00006365 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6366 if (OpenMP) {
6367 CmdArgs.push_back("-lgomp");
6368
6369 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6370 // librt. Most modern Linux platfroms require it, but some may not.
6371 CmdArgs.push_back("-lrt");
6372 }
6373
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006374 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola89414b32010-11-12 03:00:39 +00006375
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006376 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruthdf96e022013-01-17 13:19:29 +00006377 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006378 CmdArgs.push_back("-lpthread");
6379
6380 CmdArgs.push_back("-lc");
6381
6382 if (Args.hasArg(options::OPT_static))
6383 CmdArgs.push_back("--end-group");
6384 else
6385 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6386 }
Rafael Espindolafdda1712010-11-17 22:26:15 +00006387
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006388 if (!Args.hasArg(options::OPT_nostartfiles)) {
6389 const char *crtend;
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006390 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006391 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006392 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006393 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006394 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006395 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006396
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006397 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006398 if (!isAndroid)
6399 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006400 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006401 }
6402
Rafael Espindolac1da9812010-11-07 20:14:31 +00006403 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6404}
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006405
Chris Lattner38e317d2010-07-07 16:01:42 +00006406void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006407 const InputInfo &Output,
6408 const InputInfoList &Inputs,
6409 const ArgList &Args,
6410 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00006411 ArgStringList CmdArgs;
6412
6413 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6414 options::OPT_Xassembler);
6415
6416 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006417 CmdArgs.push_back(Output.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00006418
6419 for (InputInfoList::const_iterator
6420 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6421 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006422 CmdArgs.push_back(II.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00006423 }
6424
6425 const char *Exec =
Eli Friedman6d402dc2011-12-08 23:54:21 +00006426 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006427 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00006428}
6429
6430void minix::Link::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 const Driver &D = getToolChain().getDriver();
6436 ArgStringList CmdArgs;
6437
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006438 if (Output.isFilename()) {
Chris Lattner38e317d2010-07-07 16:01:42 +00006439 CmdArgs.push_back("-o");
6440 CmdArgs.push_back(Output.getFilename());
6441 } else {
6442 assert(Output.isNothing() && "Invalid output.");
6443 }
6444
6445 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman6d402dc2011-12-08 23:54:21 +00006446 !Args.hasArg(options::OPT_nostartfiles)) {
6447 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6448 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6449 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6450 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6451 }
Chris Lattner38e317d2010-07-07 16:01:42 +00006452
6453 Args.AddAllArgs(CmdArgs, options::OPT_L);
6454 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6455 Args.AddAllArgs(CmdArgs, options::OPT_e);
6456
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006457 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00006458
Eli Friedman6d402dc2011-12-08 23:54:21 +00006459 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6460
Chris Lattner38e317d2010-07-07 16:01:42 +00006461 if (!Args.hasArg(options::OPT_nostdlib) &&
6462 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006463 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006464 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00006465 CmdArgs.push_back("-lm");
6466 }
Chris Lattner38e317d2010-07-07 16:01:42 +00006467 }
6468
6469 if (!Args.hasArg(options::OPT_nostdlib) &&
6470 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman6d402dc2011-12-08 23:54:21 +00006471 if (Args.hasArg(options::OPT_pthread))
6472 CmdArgs.push_back("-lpthread");
6473 CmdArgs.push_back("-lc");
6474 CmdArgs.push_back("-lCompilerRT-Generic");
6475 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6476 CmdArgs.push_back(
Eric Christopher27e2b982012-12-18 00:31:10 +00006477 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006478 }
6479
Eli Friedman6d402dc2011-12-08 23:54:21 +00006480 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006481 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00006482}
6483
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006484/// DragonFly Tools
6485
6486// For now, DragonFly Assemble does just about the same as for
6487// FreeBSD, but this may change soon.
6488void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006489 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00006490 const InputInfoList &Inputs,
6491 const ArgList &Args,
6492 const char *LinkingOutput) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006493 ArgStringList CmdArgs;
6494
6495 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6496 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006497 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006498 CmdArgs.push_back("--32");
6499
6500 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6501 options::OPT_Xassembler);
6502
6503 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006504 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006505
6506 for (InputInfoList::const_iterator
6507 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6508 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006509 CmdArgs.push_back(II.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006510 }
6511
6512 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006513 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006514 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006515}
6516
6517void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006518 const InputInfo &Output,
6519 const InputInfoList &Inputs,
6520 const ArgList &Args,
6521 const char *LinkingOutput) const {
John McCall8cfb7202013-04-11 22:55:55 +00006522 bool UseGCC47 = false;
Daniel Dunbaree788e72009-12-21 18:54:17 +00006523 const Driver &D = getToolChain().getDriver();
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006524 ArgStringList CmdArgs;
6525
John McCall8cfb7202013-04-11 22:55:55 +00006526 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6527 UseGCC47 = false;
6528
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006529 if (!D.SysRoot.empty())
6530 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6531
John McCall8cfb7202013-04-11 22:55:55 +00006532 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006533 if (Args.hasArg(options::OPT_static)) {
6534 CmdArgs.push_back("-Bstatic");
6535 } else {
John McCall8cfb7202013-04-11 22:55:55 +00006536 if (Args.hasArg(options::OPT_rdynamic))
6537 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006538 if (Args.hasArg(options::OPT_shared))
6539 CmdArgs.push_back("-Bshareable");
6540 else {
6541 CmdArgs.push_back("-dynamic-linker");
6542 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6543 }
John McCall8cfb7202013-04-11 22:55:55 +00006544 CmdArgs.push_back("--hash-style=both");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006545 }
6546
6547 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6548 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006549 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006550 CmdArgs.push_back("-m");
6551 CmdArgs.push_back("elf_i386");
6552 }
6553
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006554 if (Output.isFilename()) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006555 CmdArgs.push_back("-o");
6556 CmdArgs.push_back(Output.getFilename());
6557 } else {
6558 assert(Output.isNothing() && "Invalid output.");
6559 }
6560
6561 if (!Args.hasArg(options::OPT_nostdlib) &&
6562 !Args.hasArg(options::OPT_nostartfiles)) {
6563 if (!Args.hasArg(options::OPT_shared)) {
John McCall8cfb7202013-04-11 22:55:55 +00006564 if (Args.hasArg(options::OPT_pg))
6565 CmdArgs.push_back(Args.MakeArgString(
6566 getToolChain().GetFilePath("gcrt1.o")));
6567 else {
6568 if (Args.hasArg(options::OPT_pie))
6569 CmdArgs.push_back(Args.MakeArgString(
6570 getToolChain().GetFilePath("Scrt1.o")));
6571 else
6572 CmdArgs.push_back(Args.MakeArgString(
6573 getToolChain().GetFilePath("crt1.o")));
6574 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006575 }
John McCall8cfb7202013-04-11 22:55:55 +00006576 CmdArgs.push_back(Args.MakeArgString(
6577 getToolChain().GetFilePath("crti.o")));
6578 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6579 CmdArgs.push_back(Args.MakeArgString(
6580 getToolChain().GetFilePath("crtbeginS.o")));
6581 else
6582 CmdArgs.push_back(Args.MakeArgString(
6583 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006584 }
6585
6586 Args.AddAllArgs(CmdArgs, options::OPT_L);
6587 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6588 Args.AddAllArgs(CmdArgs, options::OPT_e);
6589
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006590 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006591
6592 if (!Args.hasArg(options::OPT_nostdlib) &&
6593 !Args.hasArg(options::OPT_nodefaultlibs)) {
6594 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6595 // rpaths
John McCall8cfb7202013-04-11 22:55:55 +00006596 if (UseGCC47)
6597 CmdArgs.push_back("-L/usr/lib/gcc47");
6598 else
6599 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006600
6601 if (!Args.hasArg(options::OPT_static)) {
John McCall8cfb7202013-04-11 22:55:55 +00006602 if (UseGCC47) {
6603 CmdArgs.push_back("-rpath");
6604 CmdArgs.push_back("/usr/lib/gcc47");
6605 } else {
6606 CmdArgs.push_back("-rpath");
6607 CmdArgs.push_back("/usr/lib/gcc44");
6608 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006609 }
6610
Hans Wennborg76b86c22013-07-18 20:29:38 +00006611 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006612 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola405861d2010-07-20 12:59:03 +00006613 CmdArgs.push_back("-lm");
6614 }
6615
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006616 if (Args.hasArg(options::OPT_pthread))
Mike Stump4d63f8b2009-10-31 20:11:46 +00006617 CmdArgs.push_back("-lpthread");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006618
6619 if (!Args.hasArg(options::OPT_nolibc)) {
6620 CmdArgs.push_back("-lc");
6621 }
6622
John McCall8cfb7202013-04-11 22:55:55 +00006623 if (UseGCC47) {
6624 if (Args.hasArg(options::OPT_static) ||
6625 Args.hasArg(options::OPT_static_libgcc)) {
6626 CmdArgs.push_back("-lgcc");
6627 CmdArgs.push_back("-lgcc_eh");
6628 } else {
6629 if (Args.hasArg(options::OPT_shared_libgcc)) {
6630 CmdArgs.push_back("-lgcc_pic");
6631 if (!Args.hasArg(options::OPT_shared))
6632 CmdArgs.push_back("-lgcc");
6633 } else {
6634 CmdArgs.push_back("-lgcc");
6635 CmdArgs.push_back("--as-needed");
6636 CmdArgs.push_back("-lgcc_pic");
6637 CmdArgs.push_back("--no-as-needed");
6638 }
6639 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006640 } else {
John McCall8cfb7202013-04-11 22:55:55 +00006641 if (Args.hasArg(options::OPT_shared)) {
6642 CmdArgs.push_back("-lgcc_pic");
6643 } else {
6644 CmdArgs.push_back("-lgcc");
6645 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006646 }
6647 }
6648
6649 if (!Args.hasArg(options::OPT_nostdlib) &&
6650 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall8cfb7202013-04-11 22:55:55 +00006651 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner38e317d2010-07-07 16:01:42 +00006652 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006653 getToolChain().GetFilePath("crtendS.o")));
John McCall8cfb7202013-04-11 22:55:55 +00006654 else
6655 CmdArgs.push_back(Args.MakeArgString(
6656 getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006657 CmdArgs.push_back(Args.MakeArgString(
John McCall8cfb7202013-04-11 22:55:55 +00006658 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006659 }
6660
Bill Wendling3f4be6f2011-06-27 19:15:03 +00006661 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00006662
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006663 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006664 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006665 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006666}
Michael J. Spencerff58e362010-08-21 21:55:07 +00006667
6668void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6669 const InputInfo &Output,
6670 const InputInfoList &Inputs,
6671 const ArgList &Args,
6672 const char *LinkingOutput) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006673 ArgStringList CmdArgs;
6674
6675 if (Output.isFilename()) {
Daniel Dunbare5a37f42010-09-17 00:45:02 +00006676 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6677 Output.getFilename()));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006678 } else {
6679 assert(Output.isNothing() && "Invalid output.");
6680 }
6681
6682 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg746974d2013-08-09 17:38:42 +00006683 !Args.hasArg(options::OPT_nostartfiles) &&
6684 !C.getDriver().IsCLMode()) {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006685 CmdArgs.push_back("-defaultlib:libcmt");
6686 }
6687
6688 CmdArgs.push_back("-nologo");
6689
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00006690 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
6691
6692 if (DLL) {
6693 CmdArgs.push_back(Args.MakeArgString("-dll"));
6694
6695 SmallString<128> ImplibName(Output.getFilename());
6696 llvm::sys::path::replace_extension(ImplibName, "lib");
6697 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
6698 ImplibName.str()));
6699 }
6700
Hans Wennborg3c4da0c2013-08-27 18:10:21 +00006701 if (getToolChain().getDriver().getOrParseSanitizerArgs(Args).needsAsanRt()) {
Hans Wennborg324cc032013-08-28 17:36:07 +00006702 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborg2ddffa12013-08-30 10:50:52 +00006703 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg3c4da0c2013-08-27 18:10:21 +00006704 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00006705 llvm::sys::path::append(LibSanitizer, "lib", "windows");
6706 if (DLL) {
Timur Iskhodzhanove4814132013-09-11 11:45:31 +00006707 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00006708 } else {
6709 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
6710 }
6711 // FIXME: Handle 64-bit.
Hans Wennborg3c4da0c2013-08-27 18:10:21 +00006712 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
6713 }
6714
Michael J. Spencera2284f52012-06-18 16:56:04 +00006715 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg5db95272013-08-13 23:38:57 +00006716 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencera2284f52012-06-18 16:56:04 +00006717
6718 // Add filenames immediately.
6719 for (InputInfoList::const_iterator
6720 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6721 if (it->isFilename())
6722 CmdArgs.push_back(it->getFilename());
Hans Wennborg2388b772013-08-14 01:24:35 +00006723 else
6724 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencera2284f52012-06-18 16:56:04 +00006725 }
Michael J. Spencerff58e362010-08-21 21:55:07 +00006726
6727 const char *Exec =
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006728 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006729 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6730}
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006731
6732void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
6733 const InputInfo &Output,
6734 const InputInfoList &Inputs,
6735 const ArgList &Args,
6736 const char *LinkingOutput) const {
6737 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
6738}
6739
Hans Wennborgdc40bf92013-09-20 18:16:35 +00006740// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
6741// If one cannot be found, return FallbackName.
6742// We do this special search to prevent clang-cl from falling back onto itself
6743// if it's available as cl.exe on the path.
6744static std::string FindFallback(const char *FallbackName,
6745 const char *ClangProgramPath) {
6746 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
6747 if (!OptPath.hasValue())
6748 return FallbackName;
6749
6750#ifdef LLVM_ON_WIN32
6751 const StringRef PathSeparators = ";";
6752#else
6753 const StringRef PathSeparators = ":";
6754#endif
6755
6756 SmallVector<StringRef, 8> PathSegments;
6757 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
6758
6759 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
6760 const StringRef &PathSegment = PathSegments[i];
6761 if (PathSegment.empty())
6762 continue;
6763
6764 SmallString<128> FilePath(PathSegment);
6765 llvm::sys::path::append(FilePath, FallbackName);
6766 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
6767 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
6768 return FilePath.str();
6769 }
6770
6771 return FallbackName;
6772}
6773
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006774Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
6775 const InputInfo &Output,
6776 const InputInfoList &Inputs,
6777 const ArgList &Args,
6778 const char *LinkingOutput) const {
6779 ArgStringList CmdArgs;
Hans Wennborg1413d622013-09-24 17:36:21 +00006780 CmdArgs.push_back("/nologo");
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006781 CmdArgs.push_back("/c"); // Compile only.
6782 CmdArgs.push_back("/W0"); // No warnings.
6783
6784 // The goal is to be able to invoke this tool correctly based on
6785 // any flag accepted by clang-cl.
6786
6787 // These are spelled the same way in clang and cl.exe,.
6788 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
6789 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborga8ffc162013-09-24 18:17:21 +00006790
6791 // Optimization level.
6792 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
6793 if (A->getOption().getID() == options::OPT_O0) {
6794 CmdArgs.push_back("/Od");
6795 } else {
6796 StringRef OptLevel = A->getValue();
6797 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
6798 A->render(Args, CmdArgs);
6799 else if (OptLevel == "3")
6800 CmdArgs.push_back("/Ox");
6801 }
6802 }
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006803
6804 // Flags for which clang-cl have an alias.
6805 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
6806
6807 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
6808 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
6809 : "/GR-");
6810 if (Args.hasArg(options::OPT_fsyntax_only))
6811 CmdArgs.push_back("/Zs");
6812
Hans Wennborg4fe475a2013-09-27 17:54:18 +00006813 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
6814 for (size_t I = 0, E = Includes.size(); I != E; ++I)
6815 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
6816
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006817 // Flags that can simply be passed through.
6818 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
6819 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
6820
6821 // The order of these flags is relevant, so pick the last one.
6822 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
6823 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
6824 A->render(Args, CmdArgs);
6825
6826
6827 // Input filename.
6828 assert(Inputs.size() == 1);
6829 const InputInfo &II = Inputs[0];
6830 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
6831 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
6832 if (II.isFilename())
6833 CmdArgs.push_back(II.getFilename());
6834 else
6835 II.getInputArg().renderAsInput(Args, CmdArgs);
6836
6837 // Output filename.
6838 assert(Output.getType() == types::TY_Object);
6839 const char *Fo = Args.MakeArgString(std::string("/Fo") +
6840 Output.getFilename());
6841 CmdArgs.push_back(Fo);
6842
Hans Wennborgdc40bf92013-09-20 18:16:35 +00006843 const Driver &D = getToolChain().getDriver();
6844 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006845
Hans Wennborgdc40bf92013-09-20 18:16:35 +00006846 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006847}
Robert Lytton4e490e22013-10-11 10:29:40 +00006848
6849
6850/// XCore Tools
6851// We pass assemble and link construction to the xcc tool.
6852
6853void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6854 const InputInfo &Output,
6855 const InputInfoList &Inputs,
6856 const ArgList &Args,
6857 const char *LinkingOutput) const {
6858 ArgStringList CmdArgs;
6859
6860 CmdArgs.push_back("-o");
6861 CmdArgs.push_back(Output.getFilename());
6862
6863 CmdArgs.push_back("-c");
6864
6865 if (Args.hasArg(options::OPT_g_Group)) {
6866 CmdArgs.push_back("-g");
6867 }
6868
6869 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6870 options::OPT_Xassembler);
6871
6872 for (InputInfoList::const_iterator
6873 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6874 const InputInfo &II = *it;
6875 CmdArgs.push_back(II.getFilename());
6876 }
6877
6878 const char *Exec =
6879 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6880 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6881}
6882
6883void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
6884 const InputInfo &Output,
6885 const InputInfoList &Inputs,
6886 const ArgList &Args,
6887 const char *LinkingOutput) const {
6888 ArgStringList CmdArgs;
6889
6890 if (Output.isFilename()) {
6891 CmdArgs.push_back("-o");
6892 CmdArgs.push_back(Output.getFilename());
6893 } else {
6894 assert(Output.isNothing() && "Invalid output.");
6895 }
6896
6897 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6898
6899 const char *Exec =
6900 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6901 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6902}