blob: 680f89a75caf470abb50c0eced8c47070f37dbe3 [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");
Evgeniy Stepanov6d0943f2013-10-29 19:48:47 +00001760 CmdArgs.push_back("-lm");
Richard Smith76e6e132013-03-23 00:30:08 +00001761
1762 // If possible, use a dynamic symbols file to export the symbols from the
1763 // runtime library. If we can't do so, use -export-dynamic instead to export
1764 // all symbols from the binary.
1765 if (ExportSymbols) {
1766 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1767 CmdArgs.push_back(
1768 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1769 else
1770 CmdArgs.push_back("-export-dynamic");
1771 }
Alexey Samsonov86143042013-02-27 11:14:55 +00001772}
1773
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001774/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1775/// This needs to be called before we add the C run-time (malloc, etc).
1776static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany7b5f1012011-12-06 19:18:44 +00001777 ArgStringList &CmdArgs) {
Nick Lewyckyd4705682013-10-11 03:33:53 +00001778 if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov8ba75412012-09-12 09:09:08 +00001779 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1780 llvm::sys::path::append(LibAsan, "lib", "linux",
1781 (Twine("libclang_rt.asan-") +
1782 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay45b27382012-12-04 21:18:26 +00001783 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001784 } else {
Sergey Matveev050309f2013-05-27 11:17:01 +00001785 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001786 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00001787 }
Kostya Serebryanydff466c2011-11-30 01:39:16 +00001788}
1789
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001790/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1791/// This needs to be called before we add the C run-time (malloc, etc).
1792static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1793 ArgStringList &CmdArgs) {
Sergey Matveev050309f2013-05-27 11:17:01 +00001794 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001795 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryanyf7efb0e2012-05-16 06:36:00 +00001796}
1797
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00001798/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1799/// This needs to be called before we add the C run-time (malloc, etc).
1800static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1801 ArgStringList &CmdArgs) {
Sergey Matveev050309f2013-05-27 11:17:01 +00001802 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonov86143042013-02-27 11:14:55 +00001803 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev050309f2013-05-27 11:17:01 +00001804}
1805
1806/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1807/// This needs to be called before we add the C run-time (malloc, etc).
1808static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1809 ArgStringList &CmdArgs) {
1810 if (!Args.hasArg(options::OPT_shared))
1811 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00001812}
1813
Richard Smith4def70d2012-10-09 19:52:38 +00001814/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1815/// (Linux).
1816static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smith61a574f2013-03-20 23:49:07 +00001817 ArgStringList &CmdArgs, bool IsCXX,
1818 bool HasOtherSanitizerRt) {
Nick Lewycky63d29e22013-10-19 00:27:23 +00001819 // Need a copy of sanitizer_common. This could come from another sanitizer
1820 // runtime; if we're not including one, include our own copy.
1821 if (!HasOtherSanitizerRt)
Peter Collingbournebf548552013-10-20 21:29:13 +00001822 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
1823
1824 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
1825
1826 // Only include the bits of the runtime which need a C++ ABI library if
1827 // we're linking in C++ mode.
1828 if (IsCXX)
1829 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smith4def70d2012-10-09 19:52:38 +00001830}
1831
Peter Collingbourne2eeed712013-08-07 22:47:34 +00001832static void addDfsanRTLinux(const ToolChain &TC, const ArgList &Args,
1833 ArgStringList &CmdArgs) {
1834 if (!Args.hasArg(options::OPT_shared))
1835 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "dfsan", true);
1836}
1837
Benjamin Kramer5322a552013-10-16 17:42:39 +00001838static bool shouldUseFramePointerForTarget(const ArgList &Args,
1839 const llvm::Triple &Triple) {
1840 switch (Triple.getArch()) {
1841 // Don't use a frame pointer on linux if optimizing for certain targets.
1842 case llvm::Triple::mips64:
1843 case llvm::Triple::mips64el:
1844 case llvm::Triple::mips:
1845 case llvm::Triple::mipsel:
1846 case llvm::Triple::systemz:
1847 case llvm::Triple::x86:
1848 case llvm::Triple::x86_64:
1849 if (Triple.isOSLinux())
1850 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1851 if (!A->getOption().matches(options::OPT_O0))
1852 return false;
1853 return true;
1854 case llvm::Triple::xcore:
1855 return false;
1856 default:
1857 return true;
1858 }
1859}
1860
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001861static bool shouldUseFramePointer(const ArgList &Args,
1862 const llvm::Triple &Triple) {
1863 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1864 options::OPT_fomit_frame_pointer))
1865 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1866
Benjamin Kramer5322a552013-10-16 17:42:39 +00001867 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola6af27ec2011-12-14 21:02:23 +00001868}
1869
Eric Christopherd3e22df2013-04-03 01:58:53 +00001870static bool shouldUseLeafFramePointer(const ArgList &Args,
1871 const llvm::Triple &Triple) {
1872 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1873 options::OPT_momit_leaf_frame_pointer))
1874 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1875
Benjamin Kramer5322a552013-10-16 17:42:39 +00001876 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherd3e22df2013-04-03 01:58:53 +00001877}
1878
Rafael Espindolaa2148242013-08-10 01:40:10 +00001879/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruthd566df62012-12-17 21:40:04 +00001880static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer6089adc2013-04-27 08:12:29 +00001881 SmallString<128> cwd;
1882 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosierb1c81222013-04-26 20:49:50 +00001883 CmdArgs.push_back("-fdebug-compilation-dir");
1884 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruthd566df62012-12-17 21:40:04 +00001885 }
1886}
1887
Eric Christopher80190392013-02-22 20:12:52 +00001888static const char *SplitDebugName(const ArgList &Args,
1889 const InputInfoList &Inputs) {
1890 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1891 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1892 SmallString<128> T(FinalOutput->getValue());
1893 llvm::sys::path::replace_extension(T, "dwo");
1894 return Args.MakeArgString(T);
1895 } else {
1896 // Use the compilation dir.
1897 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1898 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1899 llvm::sys::path::replace_extension(F, "dwo");
1900 T += F;
1901 return Args.MakeArgString(F);
1902 }
1903}
1904
1905static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1906 const Tool &T, const JobAction &JA,
1907 const ArgList &Args, const InputInfo &Output,
1908 const char *OutFile) {
Eric Christopher59320e72013-02-21 22:35:01 +00001909 ArgStringList ExtractArgs;
1910 ExtractArgs.push_back("--extract-dwo");
1911
1912 ArgStringList StripArgs;
1913 StripArgs.push_back("--strip-dwo");
1914
1915 // Grabbing the output of the earlier compile step.
1916 StripArgs.push_back(Output.getFilename());
1917 ExtractArgs.push_back(Output.getFilename());
Eric Christopher59320e72013-02-21 22:35:01 +00001918 ExtractArgs.push_back(OutFile);
1919
1920 const char *Exec =
Eric Christopher80190392013-02-22 20:12:52 +00001921 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher59320e72013-02-21 22:35:01 +00001922
1923 // First extract the dwo sections.
Eric Christopher80190392013-02-22 20:12:52 +00001924 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00001925
1926 // Then remove them from the original .o file.
Eric Christopher80190392013-02-22 20:12:52 +00001927 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher59320e72013-02-21 22:35:01 +00001928}
1929
Chad Rosierb82e1172013-04-24 18:09:54 +00001930static bool isOptimizationLevelFast(const ArgList &Args) {
1931 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1932 if (A->getOption().matches(options::OPT_Ofast))
1933 return true;
1934 return false;
1935}
1936
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001937/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
1938static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
1939 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindola55ee1eb2013-08-27 16:58:15 +00001940 if (A->getOption().matches(options::OPT_O4) ||
1941 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001942 return true;
1943
1944 if (A->getOption().matches(options::OPT_O0))
1945 return false;
1946
1947 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
1948
Rafael Espindola168de192013-08-26 14:05:41 +00001949 // Vectorize -Os.
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001950 StringRef S(A->getValue());
Rafael Espindola168de192013-08-26 14:05:41 +00001951 if (S == "s")
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00001952 return true;
1953
1954 // Don't vectorize -Oz.
1955 if (S == "z")
1956 return false;
1957
1958 unsigned OptLevel = 0;
1959 if (S.getAsInteger(10, OptLevel))
1960 return false;
1961
1962 return OptLevel > 1;
1963 }
1964
1965 return false;
1966}
1967
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001968void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar871adcf2009-03-18 07:06:02 +00001969 const InputInfo &Output,
Daniel Dunbar62cf6012009-03-18 06:07:59 +00001970 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00001971 const ArgList &Args,
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00001972 const char *LinkingOutput) const {
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00001973 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1974 options::OPT_fapple_kext);
Daniel Dunbaree788e72009-12-21 18:54:17 +00001975 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00001976 ArgStringList CmdArgs;
1977
Daniel Dunbar077ba6a2009-03-31 20:53:55 +00001978 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1979
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00001980 // Invoke ourselves in -cc1 mode.
1981 //
1982 // FIXME: Implement custom jobs for internal actions.
1983 CmdArgs.push_back("-cc1");
1984
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001985 // Add the "effective" target triple.
Daniel Dunbaraf07f932009-03-31 17:35:15 +00001986 CmdArgs.push_back("-triple");
Daniel Dunbar00577ad2010-08-23 22:35:37 +00001987 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001988 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbar728a5122009-09-10 06:49:20 +00001989
Daniel Dunbardd4fe002009-10-30 18:12:20 +00001990 // Select the appropriate action.
John McCall260611a2012-06-20 06:18:46 +00001991 RewriteKind rewriteKind = RK_None;
Fariborz Jahaniane982cc02012-04-04 18:50:28 +00001992
Daniel Dunbar1d460332009-03-18 10:01:51 +00001993 if (isa<AnalyzeJobAction>(JA)) {
1994 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1995 CmdArgs.push_back("-analyze");
Ted Kremenek30660a82012-03-06 20:06:33 +00001996 } else if (isa<MigrateJobAction>(JA)) {
1997 CmdArgs.push_back("-migrate");
Daniel Dunbar1d460332009-03-18 10:01:51 +00001998 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00001999 if (Output.getType() == types::TY_Dependencies)
2000 CmdArgs.push_back("-Eonly");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00002001 else {
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00002002 CmdArgs.push_back("-E");
Fariborz Jahanian51be73d2013-03-18 19:41:18 +00002003 if (Args.hasArg(options::OPT_rewrite_objc) &&
2004 !Args.hasArg(options::OPT_g_Group))
2005 CmdArgs.push_back("-P");
2006 }
Daniel Dunbar8767cbc2010-02-03 03:07:56 +00002007 } else if (isa<AssembleJobAction>(JA)) {
2008 CmdArgs.push_back("-emit-obj");
Daniel Dunbar99298002010-05-27 06:18:05 +00002009
David Blaikie73168db2013-07-25 21:19:01 +00002010 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbard02bba82010-11-19 16:23:35 +00002011
2012 // Also ignore explicit -force_cpusubtype_ALL option.
2013 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002014 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidise5c35372010-08-11 23:27:58 +00002015 // Use PCH if the user requested it.
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00002016 bool UsePCH = D.CCCUsePCH;
Daniel Dunbar0ebd9322009-10-15 20:02:44 +00002017
Aaron Ballman761322b2012-07-31 01:21:00 +00002018 if (JA.getType() == types::TY_Nothing)
2019 CmdArgs.push_back("-fsyntax-only");
2020 else if (UsePCH)
Douglas Gregordf91ef32009-04-18 00:34:01 +00002021 CmdArgs.push_back("-emit-pch");
2022 else
2023 CmdArgs.push_back("-emit-pth");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002024 } else {
2025 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002026
Daniel Dunbar1d460332009-03-18 10:01:51 +00002027 if (JA.getType() == types::TY_Nothing) {
2028 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00002029 } else if (JA.getType() == types::TY_LLVM_IR ||
2030 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002031 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00002032 } else if (JA.getType() == types::TY_LLVM_BC ||
2033 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002034 CmdArgs.push_back("-emit-llvm-bc");
2035 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbare3b8d072009-09-17 00:47:53 +00002036 CmdArgs.push_back("-S");
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00002037 } else if (JA.getType() == types::TY_AST) {
2038 CmdArgs.push_back("-emit-pch");
Douglas Gregorc544ba02013-03-27 16:47:18 +00002039 } else if (JA.getType() == types::TY_ModuleFile) {
2040 CmdArgs.push_back("-module-file-info");
Daniel Dunbar64952502010-02-11 03:16:21 +00002041 } else if (JA.getType() == types::TY_RewrittenObjC) {
2042 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00002043 rewriteKind = RK_NonFragile;
Fariborz Jahanian582b3952012-04-02 15:59:19 +00002044 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2045 CmdArgs.push_back("-rewrite-objc");
John McCall260611a2012-06-20 06:18:46 +00002046 rewriteKind = RK_Fragile;
Daniel Dunbar64952502010-02-11 03:16:21 +00002047 } else {
2048 assert(JA.getType() == types::TY_PP_Asm &&
2049 "Unexpected output type!");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002050 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00002051 }
2052
Daniel Dunbar1d460332009-03-18 10:01:51 +00002053 // The make clang go fast button.
2054 CmdArgs.push_back("-disable-free");
2055
John McCallb689afb2010-02-13 03:50:24 +00002056 // Disable the verification pass in -asserts builds.
2057#ifdef NDEBUG
2058 CmdArgs.push_back("-disable-llvm-verifier");
2059#endif
2060
Daniel Dunbarc9abc042009-04-08 05:11:16 +00002061 // Set the main file name, so that debug info works even with
2062 // -save-temps.
2063 CmdArgs.push_back("-main-file-name");
Bob Wilson66b8a662012-11-23 06:14:39 +00002064 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbarc9abc042009-04-08 05:11:16 +00002065
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00002066 // Some flags which affect the language (via preprocessor
Bob Wilson66b8a662012-11-23 06:14:39 +00002067 // defines).
Daniel Dunbar3bbc7532009-04-08 18:03:55 +00002068 if (Args.hasArg(options::OPT_static))
2069 CmdArgs.push_back("-static-define");
2070
Daniel Dunbar1d460332009-03-18 10:01:51 +00002071 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenekb8bb3e72009-09-25 05:55:59 +00002072 // Enable region store model by default.
2073 CmdArgs.push_back("-analyzer-store=region");
2074
Ted Kremenekb40d06d2009-12-07 22:26:14 +00002075 // Treat blocks as analysis entry points.
2076 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2077
Ted Kremenek51885072011-03-24 00:28:47 +00002078 CmdArgs.push_back("-analyzer-eagerly-assume");
2079
Daniel Dunbar1d460332009-03-18 10:01:51 +00002080 // Add default argument set.
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002081 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002082 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek51885072011-03-24 00:28:47 +00002083
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002084 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2085 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek51885072011-03-24 00:28:47 +00002086
Argyrios Kyrtzidis027a6ab2011-02-15 07:42:33 +00002087 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek51885072011-03-24 00:28:47 +00002088 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremeneka8180e52012-01-20 06:00:17 +00002089
2090 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek8dc05062012-01-26 02:27:38 +00002091
Jordan Rosee449edc2013-04-05 17:55:07 +00002092 if (types::isCXX(Inputs[0].getType()))
2093 CmdArgs.push_back("-analyzer-checker=cplusplus");
2094
Ted Kremenek8dc05062012-01-26 02:27:38 +00002095 // Enable the following experimental checkers for testing.
Ted Kremenek8dc05062012-01-26 02:27:38 +00002096 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2097 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2098 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2099 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2100 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2101 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002102 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002103
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002104 // Set the output format. The default is plist, for (lame) historical
2105 // reasons.
2106 CmdArgs.push_back("-analyzer-output");
2107 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smith1d489cf2012-11-01 04:30:05 +00002108 CmdArgs.push_back(A->getValue());
Daniel Dunbard8fc0f22009-05-22 00:38:15 +00002109 else
2110 CmdArgs.push_back("plist");
Daniel Dunbar1d460332009-03-18 10:01:51 +00002111
Ted Kremenek0647a7b2010-03-22 22:32:05 +00002112 // Disable the presentation of standard compiler warnings when
2113 // using --analyze. We only want to show static analyzer diagnostics
2114 // or frontend errors.
2115 CmdArgs.push_back("-w");
2116
Daniel Dunbar1d460332009-03-18 10:01:51 +00002117 // Add -Xanalyzer arguments when running as analyzer.
2118 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump1eb44332009-09-09 15:08:12 +00002119 }
2120
Daniel Dunbare2fd6642009-09-10 01:21:12 +00002121 CheckCodeGenerationOptions(D, Args);
2122
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002123 bool PIE = getToolChain().isPIEDefault();
2124 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002125 bool IsPICLevelTwo = PIC;
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002126
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002127 // For the PIC and PIE flag options, this logic is different from the
2128 // legacy logic in very old versions of GCC, as that logic was just
2129 // a bug no one had ever fixed. This logic is both more rational and
2130 // consistent with GCC's new logic now that the bugs are fixed. The last
2131 // argument relating to either PIC or PIE wins, and no other argument is
2132 // used. If the last argument is any flavor of the '-fno-...' arguments,
2133 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2134 // at the same level.
2135 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2136 options::OPT_fpic, options::OPT_fno_pic,
2137 options::OPT_fPIE, options::OPT_fno_PIE,
2138 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002139 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2140 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002141 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonovdb68e5a2013-04-09 12:28:19 +00002142 if (LastPICArg) {
2143 Option O = LastPICArg->getOption();
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00002144 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2145 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2146 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2147 PIC = PIE || O.matches(options::OPT_fPIC) ||
2148 O.matches(options::OPT_fpic);
2149 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2150 O.matches(options::OPT_fPIC);
2151 } else {
2152 PIE = PIC = false;
2153 }
2154 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002155 }
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002156
Nick Lewyckyd4705682013-10-11 03:33:53 +00002157 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002158 // specified while enabling PIC enabled level 1 PIC, just force it back to
2159 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2160 // informal testing).
2161 if (PIC && getToolChain().getTriple().isOSDarwin())
2162 IsPICLevelTwo |= getToolChain().isPICDefault();
2163
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002164 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2165 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00002166 llvm::Triple Triple(TripleStr);
Eric Christopher6c7db892013-02-18 01:16:37 +00002167 if (KernelOrKext &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00002168 (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002169 PIC = PIE = false;
Simon Atanasyanc0e83642013-10-04 11:46:54 +00002170 if (Args.hasArg(options::OPT_static))
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002171 PIC = PIE = false;
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002172
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002173 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2174 // This is a very special mode. It trumps the other modes, almost no one
2175 // uses it, and it isn't even valid on any OS but Darwin.
2176 if (!getToolChain().getTriple().isOSDarwin())
2177 D.Diag(diag::err_drv_unsupported_opt_for_target)
2178 << A->getSpelling() << getToolChain().getTriple().str();
2179
2180 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2181
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002182 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002183 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002184
Chandler Carruth7ce816a2012-11-19 03:52:03 +00002185 // Only a forced PIC mode can cause the actual compile to have PIC defines
2186 // etc., no flags are sufficient. This behavior was selected to closely
2187 // match that of llvm-gcc and Apple GCC before that.
2188 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2189 CmdArgs.push_back("-pic-level");
2190 CmdArgs.push_back("2");
2191 }
2192 } else {
2193 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2194 // handled in Clang's IRGen by the -pie-level flag.
2195 CmdArgs.push_back("-mrelocation-model");
2196 CmdArgs.push_back(PIC ? "pic" : "static");
2197
2198 if (PIC) {
2199 CmdArgs.push_back("-pic-level");
2200 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2201 if (PIE) {
2202 CmdArgs.push_back("-pie-level");
2203 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2204 }
2205 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002206 }
Chandler Carruth5e219cf2012-04-08 16:40:35 +00002207
Tanya Lattner59876c22009-11-04 01:18:09 +00002208 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2209 options::OPT_fno_merge_all_constants))
Chris Lattnerf44a1a02011-04-08 18:06:54 +00002210 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002211
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002212 // LLVM Code Generator Options.
2213
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002214 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2215 CmdArgs.push_back("-mregparm");
Richard Smith1d489cf2012-11-01 04:30:05 +00002216 CmdArgs.push_back(A->getValue());
Daniel Dunbar17d3fea2011-02-09 17:54:19 +00002217 }
2218
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00002219 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2220 options::OPT_freg_struct_return)) {
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002221 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCallb8b52972013-06-18 02:46:29 +00002222 D.Diag(diag::err_drv_unsupported_opt_for_target)
2223 << A->getSpelling() << getToolChain().getTriple().str();
2224 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2225 CmdArgs.push_back("-fpcc-struct-return");
2226 } else {
2227 assert(A->getOption().matches(options::OPT_freg_struct_return));
2228 CmdArgs.push_back("-freg-struct-return");
2229 }
2230 }
2231
Roman Divackycfe9af22011-03-01 17:40:53 +00002232 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2233 CmdArgs.push_back("-mrtd");
2234
Rafael Espindola6af27ec2011-12-14 21:02:23 +00002235 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002236 CmdArgs.push_back("-mdisable-fp-elim");
2237 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2238 options::OPT_fno_zero_initialized_in_bss))
2239 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb82e1172013-04-24 18:09:54 +00002240
2241 bool OFastEnabled = isOptimizationLevelFast(Args);
2242 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2243 // enabled. This alias option is being used to simplify the hasFlag logic.
2244 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2245 options::OPT_fstrict_aliasing;
2246 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Daniel Dunbar398c6102011-02-04 02:20:39 +00002247 options::OPT_fno_strict_aliasing,
2248 getToolChain().IsStrictAliasingDefault()))
Dan Gohman4d5625e2010-10-14 22:36:56 +00002249 CmdArgs.push_back("-relaxed-aliasing");
Manman Ren96d6c452013-10-11 20:48:38 +00002250 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2251 options::OPT_fno_struct_path_tbaa))
2252 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth82fe6ae2012-03-27 23:58:37 +00002253 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2254 false))
2255 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1db772b2012-01-23 08:29:12 +00002256 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2257 options::OPT_fno_optimize_sibling_calls))
2258 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002259
Eric Christopher31056272013-04-04 06:29:47 +00002260 // Handle segmented stacks.
2261 if (Args.hasArg(options::OPT_fsplit_stack))
2262 CmdArgs.push_back("-split-stacks");
Chad Rosierb82e1172013-04-24 18:09:54 +00002263
2264 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2265 // This alias option is being used to simplify the getLastArg logic.
2266 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2267 options::OPT_ffast_math;
Eric Christopher31056272013-04-04 06:29:47 +00002268
Chandler Carruthabf07a72012-01-02 14:19:45 +00002269 // Handle various floating point optimization flags, mapping them to the
2270 // appropriate LLVM code generation flags. The pattern for all of these is to
2271 // default off the codegen optimizations, and if any flag enables them and no
2272 // flag disables them after the flag enabling them, enable the codegen
2273 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb82e1172013-04-24 18:09:54 +00002274 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002275 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002276 options::OPT_ffinite_math_only,
2277 options::OPT_fno_finite_math_only,
2278 options::OPT_fhonor_infinities,
2279 options::OPT_fno_honor_infinities))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002280 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2281 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002282 A->getOption().getID() != options::OPT_fhonor_infinities)
2283 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb82e1172013-04-24 18:09:54 +00002284 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002285 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002286 options::OPT_ffinite_math_only,
2287 options::OPT_fno_finite_math_only,
2288 options::OPT_fhonor_nans,
2289 options::OPT_fno_honor_nans))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002290 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2291 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002292 A->getOption().getID() != options::OPT_fhonor_nans)
2293 CmdArgs.push_back("-menable-no-nans");
2294
Benjamin Kramer769aa2d2012-05-02 14:55:48 +00002295 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2296 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb82e1172013-04-24 18:09:54 +00002297 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002298 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002299 options::OPT_fmath_errno,
Chandler Carruthb69557e2013-05-18 20:47:36 +00002300 options::OPT_fno_math_errno)) {
2301 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2302 // However, turning *off* -ffast_math merely restores the toolchain default
2303 // (which may be false).
2304 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2305 A->getOption().getID() == options::OPT_ffast_math ||
2306 A->getOption().getID() == options::OPT_Ofast)
2307 MathErrno = false;
2308 else if (A->getOption().getID() == options::OPT_fmath_errno)
2309 MathErrno = true;
2310 }
Chandler Carruth4f50c502012-04-26 02:10:51 +00002311 if (MathErrno)
2312 CmdArgs.push_back("-fmath-errno");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002313
2314 // There are several flags which require disabling very specific
2315 // optimizations. Any of these being disabled forces us to turn off the
2316 // entire set of LLVM optimizations, so collect them through all the flag
2317 // madness.
2318 bool AssociativeMath = false;
Chad Rosierb82e1172013-04-24 18:09:54 +00002319 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002320 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002321 options::OPT_funsafe_math_optimizations,
2322 options::OPT_fno_unsafe_math_optimizations,
2323 options::OPT_fassociative_math,
2324 options::OPT_fno_associative_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002325 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2326 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002327 A->getOption().getID() != options::OPT_fno_associative_math)
2328 AssociativeMath = true;
2329 bool ReciprocalMath = false;
Chad Rosierb82e1172013-04-24 18:09:54 +00002330 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002331 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002332 options::OPT_funsafe_math_optimizations,
2333 options::OPT_fno_unsafe_math_optimizations,
2334 options::OPT_freciprocal_math,
2335 options::OPT_fno_reciprocal_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002336 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2337 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002338 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2339 ReciprocalMath = true;
2340 bool SignedZeros = true;
Chad Rosierb82e1172013-04-24 18:09:54 +00002341 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002342 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002343 options::OPT_funsafe_math_optimizations,
2344 options::OPT_fno_unsafe_math_optimizations,
2345 options::OPT_fsigned_zeros,
2346 options::OPT_fno_signed_zeros))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002347 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2348 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002349 A->getOption().getID() != options::OPT_fsigned_zeros)
2350 SignedZeros = false;
2351 bool TrappingMath = true;
Chad Rosierb82e1172013-04-24 18:09:54 +00002352 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002353 options::OPT_fno_fast_math,
Chandler Carruthabf07a72012-01-02 14:19:45 +00002354 options::OPT_funsafe_math_optimizations,
2355 options::OPT_fno_unsafe_math_optimizations,
2356 options::OPT_ftrapping_math,
2357 options::OPT_fno_trapping_math))
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002358 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2359 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruthabf07a72012-01-02 14:19:45 +00002360 A->getOption().getID() != options::OPT_ftrapping_math)
2361 TrappingMath = false;
2362 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2363 !TrappingMath)
2364 CmdArgs.push_back("-menable-unsafe-fp-math");
2365
Lang Hamesc9686712012-07-06 00:59:19 +00002366
2367 // Validate and pass through -fp-contract option.
Chad Rosierb82e1172013-04-24 18:09:54 +00002368 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002369 options::OPT_fno_fast_math,
Lang Hamesc9686712012-07-06 00:59:19 +00002370 options::OPT_ffp_contract)) {
2371 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002372 StringRef Val = A->getValue();
Lang Hamesc9686712012-07-06 00:59:19 +00002373 if (Val == "fast" || Val == "on" || Val == "off") {
2374 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2375 } else {
2376 D.Diag(diag::err_drv_unsupported_option_argument)
2377 << A->getOption().getName() << Val;
2378 }
Chad Rosierb82e1172013-04-24 18:09:54 +00002379 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2380 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesc9686712012-07-06 00:59:19 +00002381 // If fast-math is set then set the fp-contract mode to fast.
2382 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2383 }
2384 }
2385
Bob Wilson455e72e2012-07-19 03:52:53 +00002386 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2387 // and if we find them, tell the frontend to provide the appropriate
2388 // preprocessor macros. This is distinct from enabling any optimizations as
2389 // these options induce language changes which must survive serialization
2390 // and deserialization, etc.
Chad Rosierb82e1172013-04-24 18:09:54 +00002391 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2392 options::OPT_fno_fast_math))
2393 if (!A->getOption().matches(options::OPT_fno_fast_math))
2394 CmdArgs.push_back("-ffast-math");
Chad Rosier80ecf5e2012-09-25 22:03:25 +00002395 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2396 if (A->getOption().matches(options::OPT_ffinite_math_only))
2397 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruthabf07a72012-01-02 14:19:45 +00002398
Daniel Dunbar1b718482010-05-14 22:00:22 +00002399 // Decide whether to use verbose asm. Verbose assembly is the default on
2400 // toolchains which have the integrated assembler on by default.
2401 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2402 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer20249a12010-10-21 03:16:25 +00002403 IsVerboseAsmDefault) ||
Daniel Dunbar1b718482010-05-14 22:00:22 +00002404 Args.hasArg(options::OPT_dA))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002405 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar1b718482010-05-14 22:00:22 +00002406
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002407 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2408 CmdArgs.push_back("-mdebug-pass");
2409 CmdArgs.push_back("Structure");
2410 }
2411 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2412 CmdArgs.push_back("-mdebug-pass");
2413 CmdArgs.push_back("Arguments");
2414 }
2415
John McCalld0c2ec42010-02-19 02:45:38 +00002416 // Enable -mconstructor-aliases except on darwin, where we have to
2417 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson905c45f2011-10-14 05:03:44 +00002418 if (!getToolChain().getTriple().isOSDarwin())
John McCalld0c2ec42010-02-19 02:45:38 +00002419 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00002420
John McCall32096692011-03-18 02:56:14 +00002421 // Darwin's kernel doesn't support guard variables; just die if we
2422 // try to use them.
Bob Wilson905c45f2011-10-14 05:03:44 +00002423 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall32096692011-03-18 02:56:14 +00002424 CmdArgs.push_back("-fforbid-guard-variables");
2425
Douglas Gregor6f755502011-02-01 15:15:22 +00002426 if (Args.hasArg(options::OPT_mms_bitfields)) {
2427 CmdArgs.push_back("-mms-bitfields");
2428 }
John McCalld0c2ec42010-02-19 02:45:38 +00002429
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002430 // This is a coarse approximation of what llvm-gcc actually does, both
2431 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2432 // complicated ways.
2433 bool AsynchronousUnwindTables =
2434 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2435 options::OPT_fno_asynchronous_unwind_tables,
2436 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002437 !KernelOrKext);
Daniel Dunbar6bea73b2009-09-16 06:17:29 +00002438 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2439 AsynchronousUnwindTables))
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002440 CmdArgs.push_back("-munwind-tables");
2441
Chandler Carrutha6b25812012-11-21 23:40:23 +00002442 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola8af669f2012-06-19 01:26:10 +00002443
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002444 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2445 CmdArgs.push_back("-mlimit-float-precision");
Richard Smith1d489cf2012-11-01 04:30:05 +00002446 CmdArgs.push_back(A->getValue());
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002447 }
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002448
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002449 // FIXME: Handle -mtune=.
2450 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002451
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002452 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbarf219e7c2009-11-29 07:18:39 +00002453 CmdArgs.push_back("-mcode-model");
Richard Smith1d489cf2012-11-01 04:30:05 +00002454 CmdArgs.push_back(A->getValue());
Benjamin Kramer8e9ef0d2009-08-05 14:30:52 +00002455 }
2456
Rafael Espindolab330e402013-08-20 22:12:08 +00002457 // Add the target cpu
2458 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2459 llvm::Triple ETriple(ETripleStr);
2460 std::string CPU = getCPUName(Args, ETriple);
2461 if (!CPU.empty()) {
2462 CmdArgs.push_back("-target-cpu");
2463 CmdArgs.push_back(Args.MakeArgString(CPU));
2464 }
2465
Rafael Espindola5389b842013-08-21 21:59:03 +00002466 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2467 CmdArgs.push_back("-mfpmath");
2468 CmdArgs.push_back(A->getValue());
2469 }
2470
Rafael Espindola146dbbf2013-08-21 16:39:20 +00002471 // Add the target features
2472 getTargetFeatures(D, ETriple, Args, CmdArgs);
2473
Rafael Espindolab330e402013-08-20 22:12:08 +00002474 // Add target specific flags.
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002475 switch(getToolChain().getArch()) {
Daniel Dunbar6acda162009-09-09 22:33:08 +00002476 default:
2477 break;
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002478
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002479 case llvm::Triple::arm:
2480 case llvm::Triple::thumb:
Daniel Dunbarfa41d692011-03-17 17:10:06 +00002481 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbarb163ef72009-09-10 04:57:17 +00002482 break;
2483
Eric Christophered734732010-03-02 02:41:08 +00002484 case llvm::Triple::mips:
2485 case llvm::Triple::mipsel:
Akira Hatanaka7ec02582011-09-21 02:13:07 +00002486 case llvm::Triple::mips64:
2487 case llvm::Triple::mips64el:
Eric Christophered734732010-03-02 02:41:08 +00002488 AddMIPSTargetArgs(Args, CmdArgs);
2489 break;
2490
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002491 case llvm::Triple::sparc:
2492 AddSparcTargetArgs(Args, CmdArgs);
2493 break;
2494
Daniel Dunbar6acda162009-09-09 22:33:08 +00002495 case llvm::Triple::x86:
2496 case llvm::Triple::x86_64:
2497 AddX86TargetArgs(Args, CmdArgs);
2498 break;
Tony Linthicum96319392011-12-12 21:14:55 +00002499
2500 case llvm::Triple::hexagon:
2501 AddHexagonTargetArgs(Args, CmdArgs);
2502 break;
Daniel Dunbarbc85be82009-04-29 18:32:25 +00002503 }
2504
Hans Wennborgb3574792013-08-08 00:17:41 +00002505 // Add clang-cl arguments.
2506 if (getToolChain().getDriver().IsCLMode())
2507 AddClangCLArgs(Args, CmdArgs);
2508
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002509 // Pass the linker version in use.
2510 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2511 CmdArgs.push_back("-target-linker-version");
Richard Smith1d489cf2012-11-01 04:30:05 +00002512 CmdArgs.push_back(A->getValue());
Daniel Dunbarc176bc62010-08-11 23:07:47 +00002513 }
2514
Eric Christopherd3e22df2013-04-03 01:58:53 +00002515 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbar1ad66482010-07-01 01:31:45 +00002516 CmdArgs.push_back("-momit-leaf-frame-pointer");
2517
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002518 // Explicitly error on some things we know we don't support and can't just
2519 // ignore.
2520 types::ID InputType = Inputs[0].getType();
Daniel Dunbare94db472010-09-24 19:39:37 +00002521 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2522 Arg *Unsupported;
Daniel Dunbare94db472010-09-24 19:39:37 +00002523 if (types::isCXX(InputType) &&
Bob Wilson905c45f2011-10-14 05:03:44 +00002524 getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002525 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilsona544aee2011-08-13 23:48:55 +00002526 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2527 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00002528 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbare94db472010-09-24 19:39:37 +00002529 << Unsupported->getOption().getName();
2530 }
Daniel Dunbarb30575c2010-05-12 18:19:58 +00002531 }
2532
Daniel Dunbar1d460332009-03-18 10:01:51 +00002533 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbarf7c16d92010-08-24 22:44:13 +00002534 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosier2b819102011-08-02 17:58:04 +00002535 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbar322c29f2011-02-02 21:11:35 +00002536 CmdArgs.push_back("-header-include-file");
2537 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2538 D.CCPrintHeadersFilename : "-");
2539 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002540 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump1eb44332009-09-09 15:08:12 +00002541 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002542
Chad Rosier2b819102011-08-02 17:58:04 +00002543 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbarc8a22b02011-04-07 18:01:20 +00002544 CmdArgs.push_back("-diagnostic-log-file");
2545 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2546 D.CCLogDiagnosticsFilename : "-");
2547 }
2548
Eric Christopherc706c8e2013-02-05 07:29:57 +00002549 // Use the last option from "-g" group. "-gline-tables-only"
2550 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola18f36d92010-03-07 04:46:18 +00002551 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002552 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopherc706c8e2013-02-05 07:29:57 +00002553 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002554 CmdArgs.push_back("-gline-tables-only");
Manman Renfc0f91c2013-06-19 01:46:49 +00002555 else if (A->getOption().matches(options::OPT_gdwarf_2))
2556 CmdArgs.push_back("-gdwarf-2");
2557 else if (A->getOption().matches(options::OPT_gdwarf_3))
2558 CmdArgs.push_back("-gdwarf-3");
2559 else if (A->getOption().matches(options::OPT_gdwarf_4))
2560 CmdArgs.push_back("-gdwarf-4");
Eric Christopherc706c8e2013-02-05 07:29:57 +00002561 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren8ed38d82013-07-02 23:15:25 +00002562 !A->getOption().matches(options::OPT_ggdb0)) {
2563 // Default is dwarf-2 for darwin.
2564 if (getToolChain().getTriple().isOSDarwin())
2565 CmdArgs.push_back("-gdwarf-2");
2566 else
2567 CmdArgs.push_back("-g");
2568 }
Alexey Samsonova9cd83b2012-05-29 08:10:34 +00002569 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002570
Alexey Samsonov7f326072012-06-21 08:22:39 +00002571 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2572 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christopherda3301e2012-10-18 21:52:18 +00002573 if (Args.hasArg(options::OPT_gcolumn_info))
2574 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonov7f326072012-06-21 08:22:39 +00002575
Eric Christopher0f43a6d2013-09-13 22:37:55 +00002576 // FIXME: Move backend command line options to the module.
Eric Christopherc706c8e2013-02-05 07:29:57 +00002577 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2578 // splitting and extraction.
Eric Christopherf870e122013-02-21 22:35:05 +00002579 // FIXME: Currently only works on Linux.
Cameron Esfahani57b1da12013-09-14 01:09:11 +00002580 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherf870e122013-02-21 22:35:05 +00002581 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopherc706c8e2013-02-05 07:29:57 +00002582 CmdArgs.push_back("-g");
2583 CmdArgs.push_back("-backend-option");
2584 CmdArgs.push_back("-split-dwarf=Enable");
2585 }
2586
Eric Christopher0f43a6d2013-09-13 22:37:55 +00002587 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2588 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2589 CmdArgs.push_back("-backend-option");
2590 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2591 }
Eric Christopher3e8ac1b2013-06-18 00:03:50 +00002592
2593 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2594
Rafael Espindola9cf933a2010-05-06 21:06:04 +00002595 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2596 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2597
Chris Lattner7255a2d2010-06-22 00:03:40 +00002598 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2599
Nick Lewyckye8ba8d72011-04-21 23:44:07 +00002600 if (Args.hasArg(options::OPT_ftest_coverage) ||
2601 Args.hasArg(options::OPT_coverage))
2602 CmdArgs.push_back("-femit-coverage-notes");
2603 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2604 Args.hasArg(options::OPT_coverage))
2605 CmdArgs.push_back("-femit-coverage-data");
2606
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002607 if (C.getArgs().hasArg(options::OPT_c) ||
2608 C.getArgs().hasArg(options::OPT_S)) {
2609 if (Output.isFilename()) {
Nick Lewycky3dc05412011-05-05 00:08:20 +00002610 CmdArgs.push_back("-coverage-file");
Eric Christopher025b3d42013-02-22 00:24:40 +00002611 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky0f815f12013-03-07 08:28:53 +00002612 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolaa2148242013-08-10 01:40:10 +00002613 SmallString<128> Pwd;
2614 if (!llvm::sys::fs::current_path(Pwd)) {
2615 llvm::sys::path::append(Pwd, CoverageFilename.str());
2616 CoverageFilename.swap(Pwd);
Nick Lewycky0f815f12013-03-07 08:28:53 +00002617 }
2618 }
Eric Christopher025b3d42013-02-22 00:24:40 +00002619 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky5ea4f442011-05-04 20:46:58 +00002620 }
2621 }
2622
Daniel Dunbara268fc02011-10-11 18:20:10 +00002623 // Pass options for controlling the default header search paths.
2624 if (Args.hasArg(options::OPT_nostdinc)) {
2625 CmdArgs.push_back("-nostdsysteminc");
2626 CmdArgs.push_back("-nobuiltininc");
2627 } else {
Daniel Dunbar92d6d402011-10-11 18:20:16 +00002628 if (Args.hasArg(options::OPT_nostdlibinc))
2629 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbara268fc02011-10-11 18:20:10 +00002630 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2631 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2632 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002633
Daniel Dunbar5f122322009-12-15 01:02:52 +00002634 // Pass the path to compiler resource files.
Daniel Dunbar5f122322009-12-15 01:02:52 +00002635 CmdArgs.push_back("-resource-dir");
Daniel Dunbar225c4172010-01-20 02:35:16 +00002636 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar2ac9fc22009-04-07 21:42:00 +00002637
Argyrios Kyrtzidis389db162010-11-03 22:45:23 +00002638 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2639
Ted Kremenek30660a82012-03-06 20:06:33 +00002640 bool ARCMTEnabled = false;
Argyrios Kyrtzidisdce3ce32013-09-17 19:14:29 +00002641 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002642 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002643 options::OPT_ccc_arcmt_modify,
2644 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002645 ARCMTEnabled = true;
John McCall8f0e8d22011-06-15 23:25:17 +00002646 switch (A->getOption().getID()) {
2647 default:
2648 llvm_unreachable("missed a case");
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002649 case options::OPT_ccc_arcmt_check:
John McCall8f0e8d22011-06-15 23:25:17 +00002650 CmdArgs.push_back("-arcmt-check");
2651 break;
Argyrios Kyrtzidis72ac1202011-07-07 04:00:39 +00002652 case options::OPT_ccc_arcmt_modify:
John McCall8f0e8d22011-06-15 23:25:17 +00002653 CmdArgs.push_back("-arcmt-modify");
2654 break;
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002655 case options::OPT_ccc_arcmt_migrate:
2656 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenek30660a82012-03-06 20:06:33 +00002657 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002658 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidis7ee20492011-07-19 17:20:03 +00002659
2660 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2661 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +00002662 break;
John McCall8f0e8d22011-06-15 23:25:17 +00002663 }
2664 }
Argyrios Kyrtzidisf75ece42013-06-24 19:01:18 +00002665 } else {
2666 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2667 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2668 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCall8f0e8d22011-06-15 23:25:17 +00002669 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00002670
Ted Kremenek30660a82012-03-06 20:06:33 +00002671 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2672 if (ARCMTEnabled) {
2673 D.Diag(diag::err_drv_argument_not_allowed_with)
2674 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2675 }
2676 CmdArgs.push_back("-mt-migrate-directory");
Richard Smith1d489cf2012-11-01 04:30:05 +00002677 CmdArgs.push_back(A->getValue());
Ted Kremenek30660a82012-03-06 20:06:33 +00002678
2679 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand4129992013-07-09 16:59:14 +00002680 options::OPT_objcmt_migrate_subscripting,
2681 options::OPT_objcmt_migrate_property)) {
Ted Kremenek30660a82012-03-06 20:06:33 +00002682 // None specified, means enable them all.
2683 CmdArgs.push_back("-objcmt-migrate-literals");
2684 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand4129992013-07-09 16:59:14 +00002685 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenek30660a82012-03-06 20:06:33 +00002686 } else {
2687 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2688 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand4129992013-07-09 16:59:14 +00002689 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenek30660a82012-03-06 20:06:33 +00002690 }
2691 }
2692
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002693 // Add preprocessing options like -I, -D, etc. if we are using the
2694 // preprocessor.
2695 //
2696 // FIXME: Support -fpreprocessed
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002697 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier9d718632013-01-24 19:14:47 +00002698 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002699
Rafael Espindola19d9d2e2011-07-21 23:40:37 +00002700 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2701 // that "The compiler can only warn and ignore the option if not recognized".
2702 // When building with ccache, it will pass -D options to clang even on
2703 // preprocessed inputs and configure concludes that -fPIC is not supported.
2704 Args.ClaimAllArgs(options::OPT_D);
2705
Rafael Espindola55ee1eb2013-08-27 16:58:15 +00002706 // Manually translate -O4 to -O3; let clang reject others.
2707 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2708 if (A->getOption().matches(options::OPT_O4)) {
2709 CmdArgs.push_back("-O3");
2710 D.Diag(diag::warn_O4_is_O3);
2711 } else {
2712 A->render(Args, CmdArgs);
2713 }
2714 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00002715
Chad Rosierb2c08872012-12-12 20:06:31 +00002716 // Don't warn about unused -flto. This can happen when we're preprocessing or
2717 // precompiling.
2718 Args.ClaimAllArgs(options::OPT_flto);
2719
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002720 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremeneke8cf7d12012-07-07 05:53:30 +00002721 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2722 CmdArgs.push_back("-pedantic");
Daniel Dunbar6e8371e2009-10-29 02:24:45 +00002723 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002724 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard573d262009-04-07 22:13:21 +00002725
2726 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgadbb4552013-07-31 16:57:56 +00002727 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbard573d262009-04-07 22:13:21 +00002728 //
2729 // If a std is supplied, only add -trigraphs if it follows the
2730 // option.
2731 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2732 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes528365d2009-10-16 14:28:06 +00002733 if (types::isCXX(InputType))
Daniel Dunbar294691e2009-11-04 06:24:38 +00002734 CmdArgs.push_back("-std=c++98");
Nuno Lopes528365d2009-10-16 14:28:06 +00002735 else
Daniel Dunbar294691e2009-11-04 06:24:38 +00002736 CmdArgs.push_back("-std=c89");
Daniel Dunbard573d262009-04-07 22:13:21 +00002737 else
2738 Std->render(Args, CmdArgs);
2739
Daniel Dunbar0e100312010-06-14 21:23:08 +00002740 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2741 options::OPT_trigraphs))
2742 if (A != Std)
Daniel Dunbard573d262009-04-07 22:13:21 +00002743 A->render(Args, CmdArgs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002744 } else {
2745 // Honor -std-default.
Daniel Dunbar4a5290e2010-01-29 21:03:02 +00002746 //
2747 // FIXME: Clang doesn't correctly handle -std= when the input language
2748 // doesn't match. For the time being just ignore this for C++ inputs;
2749 // eventually we want to do all the standard defaulting here instead of
2750 // splitting it between the driver and clang -cc1.
2751 if (!types::isCXX(InputType))
Nico Weber50f88b92012-08-30 02:08:31 +00002752 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2753 "-std=", /*Joined=*/true);
2754 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2755 CmdArgs.push_back("-std=c++11");
2756
Daniel Dunbard573d262009-04-07 22:13:21 +00002757 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbara3ff2022009-04-26 01:10:38 +00002758 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00002759
Richard Smithe9813b32013-09-04 22:50:31 +00002760 // GCC's behavior for -Wwrite-strings is a bit strange:
2761 // * In C, this "warning flag" changes the types of string literals from
2762 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
2763 // for the discarded qualifier.
2764 // * In C++, this is just a normal warning flag.
2765 //
2766 // Implementing this warning correctly in C is hard, so we follow GCC's
2767 // behavior for now. FIXME: Directly diagnose uses of a string literal as
2768 // a non-const char* in C, rather than using this crude hack.
2769 if (!types::isCXX(InputType)) {
2770 // FIXME: This should behave just like a warning flag, and thus should also
2771 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
2772 Arg *WriteStrings =
2773 Args.getLastArg(options::OPT_Wwrite_strings,
2774 options::OPT_Wno_write_strings, options::OPT_w);
2775 if (WriteStrings &&
2776 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
2777 CmdArgs.push_back("-fconst-strings");
Chandler Carruth50465d12011-04-23 06:30:43 +00002778 }
2779
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002780 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruthf8c247d2011-04-23 19:48:40 +00002781 // during C++ compilation, which it is by default. GCC keeps this define even
2782 // in the presence of '-w', match this behavior bug-for-bug.
2783 if (types::isCXX(InputType) &&
2784 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2785 true)) {
2786 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth1cfe3c32011-04-23 09:27:53 +00002787 }
2788
Chandler Carruthc304ba32010-05-22 02:21:53 +00002789 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2790 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2791 if (Asm->getOption().matches(options::OPT_fasm))
2792 CmdArgs.push_back("-fgnu-keywords");
2793 else
2794 CmdArgs.push_back("-fno-gnu-keywords");
2795 }
2796
Rafael Espindola61b1efe2011-05-02 17:43:32 +00002797 if (ShouldDisableCFI(Args, getToolChain()))
2798 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolaf24a1512011-04-30 18:35:43 +00002799
Nick Lewyckyea523d72011-10-17 23:05:52 +00002800 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2801 CmdArgs.push_back("-fno-dwarf-directory-asm");
2802
Daniel Dunbarf4910132013-04-16 18:21:19 +00002803 if (ShouldDisableAutolink(Args, getToolChain()))
2804 CmdArgs.push_back("-fno-autolink");
2805
Chandler Carruthd566df62012-12-17 21:40:04 +00002806 // Add in -fdebug-compilation-dir if necessary.
2807 addDebugCompDirArg(Args, CmdArgs);
Nick Lewycky7c4fd912011-10-21 02:32:14 +00002808
Richard Smithc18c4232011-11-21 19:36:32 +00002809 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2810 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbar1d460332009-03-18 10:01:51 +00002811 CmdArgs.push_back("-ftemplate-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002812 CmdArgs.push_back(A->getValue());
Daniel Dunbar1d460332009-03-18 10:01:51 +00002813 }
2814
Richard Smithc18c4232011-11-21 19:36:32 +00002815 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2816 CmdArgs.push_back("-fconstexpr-depth");
Richard Smith1d489cf2012-11-01 04:30:05 +00002817 CmdArgs.push_back(A->getValue());
Richard Smithc18c4232011-11-21 19:36:32 +00002818 }
2819
Richard Smithe7565632013-05-08 02:12:03 +00002820 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2821 CmdArgs.push_back("-fconstexpr-steps");
2822 CmdArgs.push_back(A->getValue());
2823 }
2824
Richard Smith9e738cc2013-02-22 01:59:51 +00002825 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2826 CmdArgs.push_back("-fbracket-depth");
2827 CmdArgs.push_back(A->getValue());
2828 }
2829
Argyrios Kyrtzidis1380a142010-11-18 00:20:36 +00002830 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2831 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002832 if (A->getNumValues()) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002833 StringRef bytes = A->getValue();
Jean-Daniel Dupas2e4fd6d2012-05-04 08:08:37 +00002834 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2835 } else
2836 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidis3532fdd2010-11-17 23:11:54 +00002837 }
2838
Nuno Lopesb3198a82012-05-08 22:10:46 +00002839
Michael J. Spencerc6357102012-10-22 22:13:48 +00002840 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar66861e02009-11-20 22:21:36 +00002841 CmdArgs.push_back("-relocatable-pch");
Mike Stump1eb44332009-09-09 15:08:12 +00002842
Daniel Dunbar294691e2009-11-04 06:24:38 +00002843 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2844 CmdArgs.push_back("-fconstant-string-class");
Richard Smith1d489cf2012-11-01 04:30:05 +00002845 CmdArgs.push_back(A->getValue());
Daniel Dunbar294691e2009-11-04 06:24:38 +00002846 }
David Chisnall8a5a9aa2009-08-31 16:41:57 +00002847
Chris Lattner124fca52010-01-09 21:54:33 +00002848 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2849 CmdArgs.push_back("-ftabstop");
Richard Smith1d489cf2012-11-01 04:30:05 +00002850 CmdArgs.push_back(A->getValue());
Chris Lattner124fca52010-01-09 21:54:33 +00002851 }
2852
Chris Lattner0f0c9632010-04-07 20:49:23 +00002853 CmdArgs.push_back("-ferror-limit");
2854 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smith1d489cf2012-11-01 04:30:05 +00002855 CmdArgs.push_back(A->getValue());
Chris Lattner0f0c9632010-04-07 20:49:23 +00002856 else
2857 CmdArgs.push_back("19");
Douglas Gregor575cf372010-04-20 07:18:24 +00002858
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002859 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2860 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002861 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002862 }
2863
2864 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2865 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002866 CmdArgs.push_back(A->getValue());
Chandler Carruthc40f73c2010-05-06 04:55:18 +00002867 }
2868
Richard Smith08d6e032011-12-16 19:06:07 +00002869 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2870 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smith1d489cf2012-11-01 04:30:05 +00002871 CmdArgs.push_back(A->getValue());
Richard Smith08d6e032011-12-16 19:06:07 +00002872 }
2873
Daniel Dunbar55efe142009-11-04 06:24:47 +00002874 // Pass -fmessage-length=.
Daniel Dunbara28690e2009-11-30 08:40:54 +00002875 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar55efe142009-11-04 06:24:47 +00002876 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00002877 CmdArgs.push_back(A->getValue());
Daniel Dunbar55efe142009-11-04 06:24:47 +00002878 } else {
2879 // If -fmessage-length=N was not specified, determine whether this is a
2880 // terminal and, if so, implicitly define -fmessage-length appropriately.
2881 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner5f9e2722011-07-23 10:55:15 +00002882 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar55efe142009-11-04 06:24:47 +00002883 }
2884
John McCalla880b192013-02-19 01:57:35 +00002885 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2886 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2887 options::OPT_fvisibility_ms_compat)) {
2888 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2889 CmdArgs.push_back("-fvisibility");
2890 CmdArgs.push_back(A->getValue());
2891 } else {
2892 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2893 CmdArgs.push_back("-fvisibility");
2894 CmdArgs.push_back("hidden");
2895 CmdArgs.push_back("-ftype-visibility");
2896 CmdArgs.push_back("default");
2897 }
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002898 }
2899
Douglas Gregor7cf84d62010-06-15 17:05:35 +00002900 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002901
Hans Wennborgde981f32012-06-28 08:01:44 +00002902 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2903
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002904 // -fhosted is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00002905 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2906 KernelOrKext)
Daniel Dunbar0a80ba72010-03-20 04:52:14 +00002907 CmdArgs.push_back("-ffreestanding");
2908
Daniel Dunbarba8d8612009-12-03 18:42:11 +00002909 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002910 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002911 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patelc69e1cf2010-09-30 19:05:55 +00002912 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel033be8b2011-11-04 20:05:58 +00002913 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christophere88c4512011-10-25 07:13:06 +00002914 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidt9e0b6472013-07-03 15:36:02 +00002915 // AltiVec language extensions aren't relevant for assembling.
2916 if (!isa<PreprocessJobAction>(JA) ||
2917 Output.getType() != types::TY_PP_Asm)
2918 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu246b6aa2012-06-26 18:18:47 +00002919 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2920 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier4574c3d2012-03-13 23:45:51 +00002921
Alexey Samsonov1b8f12d2013-08-19 09:14:21 +00002922 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Alexey Samsonov8bdc92c2013-08-09 07:42:13 +00002923 Sanitize.addArgs(getToolChain(), Args, CmdArgs);
Richard Smithc4dabad2012-11-05 22:04:41 +00002924
Will Dietz2d382d12012-12-30 20:53:28 +00002925 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2926 options::OPT_fno_sanitize_recover,
2927 true))
2928 CmdArgs.push_back("-fno-sanitize-recover");
2929
Chad Rosier78d85b12013-01-29 23:31:22 +00002930 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2931 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2932 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2933 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2934
Eric Christopher98654c92013-02-19 06:16:53 +00002935 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier4574c3d2012-03-13 23:45:51 +00002936 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Bendersky8f4269a2013-07-24 22:20:49 +00002937 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00002938 getToolChain().getArch() == llvm::Triple::ppc64 ||
2939 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier4574c3d2012-03-13 23:45:51 +00002940 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00002941 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier4574c3d2012-03-13 23:45:51 +00002942
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00002943 if (getToolChain().SupportsProfiling())
2944 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar8c6fa842010-03-16 16:57:46 +00002945
2946 // -flax-vector-conversions is default.
2947 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2948 options::OPT_fno_lax_vector_conversions))
2949 CmdArgs.push_back("-fno-lax-vector-conversions");
2950
Fariborz Jahanianb466d012011-01-07 01:05:02 +00002951 if (Args.getLastArg(options::OPT_fapple_kext))
2952 CmdArgs.push_back("-fapple-kext");
2953
David Blaikie940152f2012-06-14 18:55:27 +00002954 if (Args.hasFlag(options::OPT_frewrite_includes,
2955 options::OPT_fno_rewrite_includes, false))
2956 CmdArgs.push_back("-frewrite-includes");
2957
Fariborz Jahanian34e65772009-05-22 20:17:16 +00002958 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner182e0922009-04-21 05:34:31 +00002959 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregor4786c152010-08-19 20:24:43 +00002960 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002961 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2962 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnall7f18e672010-09-17 18:29:54 +00002963
2964 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2965 CmdArgs.push_back("-ftrapv-handler");
Richard Smith1d489cf2012-11-01 04:30:05 +00002966 CmdArgs.push_back(A->getValue());
David Chisnall7f18e672010-09-17 18:29:54 +00002967 }
2968
Bob Wilson71fd6cc2012-02-03 06:27:22 +00002969 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng49af1f32011-04-08 21:37:45 +00002970
Chandler Carruth5adb5a82011-03-27 00:04:55 +00002971 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2972 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2973 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2974 options::OPT_fno_wrapv)) {
2975 if (A->getOption().matches(options::OPT_fwrapv))
2976 CmdArgs.push_back("-fwrapv");
2977 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2978 options::OPT_fno_strict_overflow)) {
2979 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2980 CmdArgs.push_back("-fwrapv");
2981 }
Daniel Dunbar3aaf0822009-04-07 21:51:40 +00002982 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruthb26404a2013-08-08 08:34:35 +00002983 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
2984 options::OPT_fno_unroll_loops);
Daniel Dunbar1d460332009-03-18 10:01:51 +00002985
Daniel Dunbar5345c392009-09-03 04:54:28 +00002986 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2987
Mahesha Sf3b52312012-10-27 07:47:56 +00002988
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002989 // -stack-protector=0 is default.
2990 unsigned StackProtectorLevel = 0;
Bill Wendling45483f72009-06-28 07:36:13 +00002991 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2992 options::OPT_fstack_protector_all,
2993 options::OPT_fstack_protector)) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00002994 if (A->getOption().matches(options::OPT_fstack_protector))
2995 StackProtectorLevel = 1;
2996 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2997 StackProtectorLevel = 2;
Nico Weber2fef1112011-08-23 07:38:27 +00002998 } else {
2999 StackProtectorLevel =
3000 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3001 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003002 if (StackProtectorLevel) {
3003 CmdArgs.push_back("-stack-protector");
Chris Lattner5f9e2722011-07-23 10:55:15 +00003004 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003005 }
Chad Rosiera7afeb02012-08-21 16:16:06 +00003006
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003007 // --param ssp-buffer-size=
3008 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3009 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003010 StringRef Str((*it)->getValue());
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003011 if (Str.startswith("ssp-buffer-size=")) {
3012 if (StackProtectorLevel) {
Chad Rosiera7afeb02012-08-21 16:16:06 +00003013 CmdArgs.push_back("-stack-protector-buffer-size");
3014 // FIXME: Verify the argument is a valid integer.
3015 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosiera7afeb02012-08-21 16:16:06 +00003016 }
Joerg Sonnenberger53b43a72012-09-12 13:51:14 +00003017 (*it)->claim();
Chad Rosiera7afeb02012-08-21 16:16:06 +00003018 }
Bill Wendling45483f72009-06-28 07:36:13 +00003019 }
3020
Nick Lewycky4e785c92011-12-06 03:33:03 +00003021 // Translate -mstackrealign
3022 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3023 false)) {
3024 CmdArgs.push_back("-backend-option");
3025 CmdArgs.push_back("-force-align-stack");
3026 }
3027 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3028 false)) {
3029 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3030 }
3031
Joerg Sonnenbergere9d11db2011-12-05 23:05:23 +00003032 if (Args.hasArg(options::OPT_mstack_alignment)) {
3033 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3034 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopher1a584022011-05-02 21:18:22 +00003035 }
Chad Rosier586a0612012-11-29 00:42:06 +00003036 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golin02ab7d32013-08-24 14:44:41 +00003037 if (!KernelOrKext) {
Renato Golinb69f9e02013-08-28 23:56:07 +00003038 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3039 options::OPT_munaligned_access)) {
3040 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3041 CmdArgs.push_back("-backend-option");
3042 CmdArgs.push_back("-arm-strict-align");
3043 } else {
3044 CmdArgs.push_back("-backend-option");
3045 CmdArgs.push_back("-arm-no-strict-align");
3046 }
Renato Golin02ab7d32013-08-24 14:44:41 +00003047 }
Chad Rosier7e293272012-11-09 17:29:19 +00003048 }
Eric Christopher88b7cf02011-08-19 00:30:14 +00003049
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003050 // Forward -f options with positive and negative forms; we translate
3051 // these by hand.
3052
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003053 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar2843c192011-02-04 17:24:47 +00003054 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003055 CmdArgs.push_back("-fapple-kext");
3056 if (!Args.hasArg(options::OPT_fbuiltin))
3057 CmdArgs.push_back("-fno-builtin");
Chad Rosier3d265502012-03-26 21:29:17 +00003058 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003059 }
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003060 // -fbuiltin is default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003061 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar53e84842009-11-19 04:55:23 +00003062 CmdArgs.push_back("-fno-builtin");
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003063
Nuno Lopesfc284482009-12-16 16:59:22 +00003064 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3065 options::OPT_fno_assume_sane_operator_new))
3066 CmdArgs.push_back("-fno-assume-sane-operator-new");
3067
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003068 // -fblocks=0 is default.
3069 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnalle6533ff2011-02-28 17:11:43 +00003070 getToolChain().IsBlocksDefault()) ||
3071 (Args.hasArg(options::OPT_fgnu_runtime) &&
3072 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3073 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar9e5cc6b2009-11-17 08:07:36 +00003074 CmdArgs.push_back("-fblocks");
John McCall13db5cf2011-09-09 20:41:01 +00003075
3076 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3077 !getToolChain().hasBlocksRuntime())
3078 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall5e530af2009-11-17 19:33:30 +00003079 }
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003080
Douglas Gregor64554ba2012-01-18 15:19:58 +00003081 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3082 // users must also pass -fcxx-modules. The latter flag will disappear once the
3083 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorf43b7212013-01-16 01:23:41 +00003084 bool HaveModules = false;
Douglas Gregor64554ba2012-01-18 15:19:58 +00003085 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3086 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3087 options::OPT_fno_cxx_modules,
3088 false);
Douglas Gregorf43b7212013-01-16 01:23:41 +00003089 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor64554ba2012-01-18 15:19:58 +00003090 CmdArgs.push_back("-fmodules");
Douglas Gregorf43b7212013-01-16 01:23:41 +00003091 HaveModules = true;
3092 }
3093 }
3094
Daniel Jasper056ec122013-08-05 20:26:17 +00003095 // -fmodule-maps enables module map processing (off by default) for header
3096 // checking. It is implied by -fmodules.
3097 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3098 false)) {
3099 CmdArgs.push_back("-fmodule-maps");
3100 }
3101
Daniel Jasper95411412013-10-21 06:34:34 +00003102 // -fmodules-decluse checks that modules used are declared so (off by
3103 // default).
Daniel Jasperddd2dfc2013-09-24 09:14:14 +00003104 if (Args.hasFlag(options::OPT_fmodules_decluse,
3105 options::OPT_fno_modules_decluse,
3106 false)) {
Daniel Jasper097595a2013-09-29 12:40:54 +00003107 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperddd2dfc2013-09-24 09:14:14 +00003108 }
3109
Daniel Jasper95411412013-10-21 06:34:34 +00003110 // -fmodule-name specifies the module that is currently being built (or
3111 // used for header checking by -fmodule-maps).
3112 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3113 A->claim();
3114 A->render(Args, CmdArgs);
3115 }
3116
3117 // -fmodule-map-file can be used to specify a file containing module
3118 // definitions.
3119 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3120 A->claim();
3121 A->render(Args, CmdArgs);
3122 }
3123
Douglas Gregor953a61f2013-02-07 19:01:24 +00003124 // If a module path was provided, pass it along. Otherwise, use a temporary
3125 // directory.
3126 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3127 A->claim();
3128 if (HaveModules) {
3129 A->render(Args, CmdArgs);
3130 }
3131 } else if (HaveModules) {
3132 SmallString<128> DefaultModuleCache;
3133 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3134 DefaultModuleCache);
Douglas Gregor892b6fb2013-03-21 21:48:48 +00003135 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3136 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor250172a2013-02-07 22:59:12 +00003137 const char Arg[] = "-fmodules-cache-path=";
3138 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3139 Arg, Arg + strlen(Arg));
Douglas Gregor953a61f2013-02-07 19:01:24 +00003140 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3141 }
3142
3143 // Pass through all -fmodules-ignore-macro arguments.
3144 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregord44d2872013-03-25 21:19:16 +00003145 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3146 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor953a61f2013-02-07 19:01:24 +00003147
John McCall32579cf2010-04-09 19:12:06 +00003148 // -faccess-control is default.
John McCall7002f4c2010-04-09 19:03:51 +00003149 if (Args.hasFlag(options::OPT_fno_access_control,
3150 options::OPT_faccess_control,
John McCall32579cf2010-04-09 19:12:06 +00003151 false))
John McCall7002f4c2010-04-09 19:03:51 +00003152 CmdArgs.push_back("-fno-access-control");
John McCall3ddd6e02010-03-17 01:32:13 +00003153
Anders Carlssona4c24752010-11-21 00:09:52 +00003154 // -felide-constructors is the default.
3155 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3156 options::OPT_felide_constructors,
3157 false))
3158 CmdArgs.push_back("-fno-elide-constructors");
3159
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003160 // -frtti is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00003161 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smithc4dabad2012-11-05 22:04:41 +00003162 KernelOrKext) {
Daniel Dunbar53e84842009-11-19 04:55:23 +00003163 CmdArgs.push_back("-fno-rtti");
Mike Stump738f8c22009-07-31 23:15:31 +00003164
Richard Smithc4dabad2012-11-05 22:04:41 +00003165 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonovbb1071c2012-11-06 15:09:03 +00003166 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumi03c60762012-11-06 22:02:00 +00003167 std::string NoRttiArg =
Richard Smithc4dabad2012-11-05 22:04:41 +00003168 Args.getLastArg(options::OPT_mkernel,
3169 options::OPT_fapple_kext,
Richard Smith04fd3822012-11-06 01:12:02 +00003170 options::OPT_fno_rtti)->getAsString(Args);
Richard Smithc4dabad2012-11-05 22:04:41 +00003171 D.Diag(diag::err_drv_argument_not_allowed_with)
3172 << "-fsanitize=vptr" << NoRttiArg;
3173 }
3174 }
3175
Tony Linthicum96319392011-12-12 21:14:55 +00003176 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00003177 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum96319392011-12-12 21:14:55 +00003178 options::OPT_fno_short_enums,
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003179 getToolChain().getArch() ==
Tony Linthicum96319392011-12-12 21:14:55 +00003180 llvm::Triple::hexagon))
Argyrios Kyrtzidis9a2b9d72010-10-08 00:25:19 +00003181 CmdArgs.push_back("-fshort-enums");
3182
Daniel Dunbar1f95e652009-11-17 06:37:03 +00003183 // -fsigned-char is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00003184 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbar1f95e652009-11-17 06:37:03 +00003185 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar76743522009-11-29 02:39:08 +00003186 CmdArgs.push_back("-fno-signed-char");
Eli Friedman5a779732009-06-05 07:21:14 +00003187
Anders Carlssona508b7d2010-02-06 23:23:06 +00003188 // -fthreadsafe-static is default.
Michael J. Spencer20249a12010-10-21 03:16:25 +00003189 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssona508b7d2010-02-06 23:23:06 +00003190 options::OPT_fno_threadsafe_statics))
3191 CmdArgs.push_back("-fno-threadsafe-statics");
3192
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00003193 // -fuse-cxa-atexit is default.
Chad Rosierafc4baa2012-03-26 22:04:46 +00003194 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3195 options::OPT_fno_use_cxa_atexit,
3196 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum96319392011-12-12 21:14:55 +00003197 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003198 getToolChain().getArch() != llvm::Triple::hexagon) ||
Chad Rosierafc4baa2012-03-26 22:04:46 +00003199 KernelOrKext)
Daniel Dunbarefb0fa92010-03-20 04:15:41 +00003200 CmdArgs.push_back("-fno-use-cxa-atexit");
3201
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003202 // -fms-extensions=0 is default.
Daniel Dunbar6d2eb4d2009-11-25 10:14:30 +00003203 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0be42c42009-11-17 07:06:20 +00003204 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3205 CmdArgs.push_back("-fms-extensions");
3206
Francois Pichetae556082011-09-17 04:32:15 +00003207 // -fms-compatibility=0 is default.
Douglas Gregorba97b6e2011-10-24 15:49:38 +00003208 if (Args.hasFlag(options::OPT_fms_compatibility,
3209 options::OPT_fno_ms_compatibility,
3210 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3211 Args.hasFlag(options::OPT_fms_extensions,
3212 options::OPT_fno_ms_extensions,
3213 true))))
Francois Pichetae556082011-09-17 04:32:15 +00003214 CmdArgs.push_back("-fms-compatibility");
3215
Reid Kleckner8c64c182013-09-18 00:33:59 +00003216 // -fmsc-version=1700 is default.
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003217 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3218 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3219 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00003220 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003221 if (msc_ver.empty())
Reid Kleckner8c64c182013-09-18 00:33:59 +00003222 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003223 else
3224 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3225 }
3226
3227
Eric Christophercfc01e42013-02-18 00:38:31 +00003228 // -fno-borland-extensions is default.
Dawn Perchik400b6072010-09-02 23:59:25 +00003229 if (Args.hasFlag(options::OPT_fborland_extensions,
3230 options::OPT_fno_borland_extensions, false))
3231 CmdArgs.push_back("-fborland-extensions");
3232
Francois Pichet8efcc012011-09-01 16:38:08 +00003233 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3234 // needs it.
Francois Pichet8387e2a2011-04-22 22:18:13 +00003235 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3236 options::OPT_fno_delayed_template_parsing,
Francois Pichet8efcc012011-09-01 16:38:08 +00003237 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet805bc1f2011-08-26 00:22:34 +00003238 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet8387e2a2011-04-22 22:18:13 +00003239
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00003240 // -fgnu-keywords default varies depending on language; only pass if
3241 // specified.
3242 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbar40788d92010-04-24 17:56:39 +00003243 options::OPT_fno_gnu_keywords))
3244 A->render(Args, CmdArgs);
Chandler Carrutheb5d7b72010-04-17 20:17:31 +00003245
Rafael Espindola01ba8542011-06-02 17:30:53 +00003246 if (Args.hasFlag(options::OPT_fgnu89_inline,
3247 options::OPT_fno_gnu89_inline,
3248 false))
Rafael Espindolafb3f4aa2011-06-02 16:13:27 +00003249 CmdArgs.push_back("-fgnu89-inline");
3250
Chad Rosierfc055f92012-03-15 22:31:42 +00003251 if (Args.hasArg(options::OPT_fno_inline))
3252 CmdArgs.push_back("-fno-inline");
3253
Chad Rosier634a4b12012-03-06 21:17:19 +00003254 if (Args.hasArg(options::OPT_fno_inline_functions))
3255 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier250008b2012-03-06 18:49:20 +00003256
John McCall260611a2012-06-20 06:18:46 +00003257 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall9f084a32011-07-06 00:26:06 +00003258
John McCall260611a2012-06-20 06:18:46 +00003259 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahaniana6f5cc32013-10-15 17:16:30 +00003260 // legacy is the default. Next runtime is always legacy dispatch and
3261 // -fno-objc-legacy-dispatch gets ignored silently.
3262 if (objcRuntime.isNonFragile() && !objcRuntime.isNeXTFamily()) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003263 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3264 options::OPT_fno_objc_legacy_dispatch,
David Chisnall2c7886d2012-07-04 11:52:24 +00003265 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003266 getToolChain().getArch()))) {
David Chisnall3c3ccd22011-09-30 13:32:35 +00003267 if (getToolChain().UseObjCMixedDispatch())
3268 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3269 else
3270 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3271 }
3272 }
3273
Fariborz Jahanian3d145f62012-11-15 19:02:45 +00003274 // -fencode-extended-block-signature=1 is default.
3275 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3276 CmdArgs.push_back("-fencode-extended-block-signature");
3277 }
3278
John McCall9f084a32011-07-06 00:26:06 +00003279 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3280 // NOTE: This logic is duplicated in ToolChains.cpp.
3281 bool ARC = isObjCAutoRefCount(Args);
3282 if (ARC) {
John McCall0a7dd782012-08-21 02:47:43 +00003283 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis5840dd92012-02-29 03:43:52 +00003284
John McCall9f084a32011-07-06 00:26:06 +00003285 CmdArgs.push_back("-fobjc-arc");
3286
Chandler Carruth7ffa0322011-11-04 07:34:47 +00003287 // FIXME: It seems like this entire block, and several around it should be
3288 // wrapped in isObjC, but for now we just use it here as this is where it
3289 // was being used previously.
3290 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3291 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3292 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3293 else
3294 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3295 }
3296
John McCall9f084a32011-07-06 00:26:06 +00003297 // Allow the user to enable full exceptions code emission.
3298 // We define off for Objective-CC, on for Objective-C++.
3299 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3300 options::OPT_fno_objc_arc_exceptions,
3301 /*default*/ types::isCXX(InputType)))
3302 CmdArgs.push_back("-fobjc-arc-exceptions");
3303 }
3304
3305 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3306 // rewriter.
John McCall260611a2012-06-20 06:18:46 +00003307 if (rewriteKind != RK_None)
John McCall9f084a32011-07-06 00:26:06 +00003308 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003309
John McCall9f084a32011-07-06 00:26:06 +00003310 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3311 // takes precedence.
3312 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3313 if (!GCArg)
3314 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3315 if (GCArg) {
3316 if (ARC) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00003317 D.Diag(diag::err_drv_objc_gc_arr)
John McCall9f084a32011-07-06 00:26:06 +00003318 << GCArg->getAsString(Args);
3319 } else if (getToolChain().SupportsObjCGC()) {
3320 GCArg->render(Args, CmdArgs);
3321 } else {
3322 // FIXME: We should move this to a hard error.
Chris Lattner5f9e2722011-07-23 10:55:15 +00003323 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall9f084a32011-07-06 00:26:06 +00003324 << GCArg->getAsString(Args);
3325 }
3326 }
3327
John McCalld71315c2011-06-22 00:53:57 +00003328 // Add exception args.
3329 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall260611a2012-06-20 06:18:46 +00003330 KernelOrKext, objcRuntime, CmdArgs);
John McCalld71315c2011-06-22 00:53:57 +00003331
3332 if (getToolChain().UseSjLjExceptions())
3333 CmdArgs.push_back("-fsjlj-exceptions");
3334
3335 // C++ "sane" operator new.
Daniel Dunbar984eb862010-02-01 21:07:25 +00003336 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3337 options::OPT_fno_assume_sane_operator_new))
3338 CmdArgs.push_back("-fno-assume-sane-operator-new");
3339
Daniel Dunbarf35f14d2010-04-27 15:34:57 +00003340 // -fconstant-cfstrings is default, and may be subject to argument translation
3341 // on Darwin.
3342 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3343 options::OPT_fno_constant_cfstrings) ||
3344 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3345 options::OPT_mno_constant_cfstrings))
3346 CmdArgs.push_back("-fno-constant-cfstrings");
3347
John Thompsona6fda122009-11-05 20:14:16 +00003348 // -fshort-wchar default varies depending on platform; only
3349 // pass if specified.
Daniel Dunbar1744a352010-04-27 15:35:03 +00003350 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3351 A->render(Args, CmdArgs);
John Thompsona6fda122009-11-05 20:14:16 +00003352
Hans Wennborgb087a5d2013-07-31 23:39:13 +00003353 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003354 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00003355 options::OPT_fno_pascal_strings,
Daniel Dunbar82d00682009-04-07 23:51:44 +00003356 false))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003357 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00003358
Daniel Dunbar88934e82011-10-05 21:04:55 +00003359 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3360 // -fno-pack-struct doesn't apply to -fpack-struct=.
3361 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloy8049c442012-05-02 07:56:14 +00003362 std::string PackStructStr = "-fpack-struct=";
Richard Smith1d489cf2012-11-01 04:30:05 +00003363 PackStructStr += A->getValue();
James Molloy8049c442012-05-02 07:56:14 +00003364 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar88934e82011-10-05 21:04:55 +00003365 } else if (Args.hasFlag(options::OPT_fpack_struct,
3366 options::OPT_fno_pack_struct, false)) {
James Molloy8049c442012-05-02 07:56:14 +00003367 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar88934e82011-10-05 21:04:55 +00003368 }
3369
Robert Lytton5f15f4d2013-08-13 09:43:10 +00003370 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003371 if (!Args.hasArg(options::OPT_fcommon))
3372 CmdArgs.push_back("-fno-common");
Chad Rosierec09b3e2012-03-26 21:35:40 +00003373 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003374 }
Daniel Dunbar88934e82011-10-05 21:04:55 +00003375
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003376 // -fcommon is default, only pass non-default.
Fariborz Jahanianb466d012011-01-07 01:05:02 +00003377 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbar48d1ef72009-04-07 21:16:11 +00003378 CmdArgs.push_back("-fno-common");
3379
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003380 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003381 // -funsigned-bitfields.
Mike Stump1eb44332009-09-09 15:08:12 +00003382 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003383 options::OPT_funsigned_bitfields))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003384 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar70d3c922009-04-15 02:37:43 +00003385 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3386
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003387 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3388 if (!Args.hasFlag(options::OPT_ffor_scope,
3389 options::OPT_fno_for_scope))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003390 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar06205ca2010-10-15 22:30:42 +00003391 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3392
Jeffrey Yasskin0ea22fd2010-06-08 04:56:20 +00003393 // -fcaret-diagnostics is default.
3394 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3395 options::OPT_fno_caret_diagnostics, true))
3396 CmdArgs.push_back("-fno-caret-diagnostics");
3397
Daniel Dunbar49138fc2009-04-19 21:09:34 +00003398 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump1eb44332009-09-09 15:08:12 +00003399 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar49138fc2009-04-19 21:09:34 +00003400 options::OPT_fno_diagnostics_fixit_info))
3401 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003402
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003403 // Enable -fdiagnostics-show-option by default.
Mike Stump1eb44332009-09-09 15:08:12 +00003404 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003405 options::OPT_fno_diagnostics_show_option))
3406 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar838be482009-11-04 06:24:57 +00003407
Chris Lattner6fbe8392010-05-04 21:55:25 +00003408 if (const Arg *A =
3409 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3410 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smith1d489cf2012-11-01 04:30:05 +00003411 CmdArgs.push_back(A->getValue());
Chris Lattner6fbe8392010-05-04 21:55:25 +00003412 }
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003413
Douglas Gregorc9471b02011-05-21 17:07:29 +00003414 if (const Arg *A =
3415 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3416 CmdArgs.push_back("-fdiagnostics-format");
Richard Smith1d489cf2012-11-01 04:30:05 +00003417 CmdArgs.push_back(A->getValue());
Douglas Gregorc9471b02011-05-21 17:07:29 +00003418 }
3419
Chandler Carruthabaca7a2011-03-27 01:50:55 +00003420 if (Arg *A = Args.getLastArg(
3421 options::OPT_fdiagnostics_show_note_include_stack,
3422 options::OPT_fno_diagnostics_show_note_include_stack)) {
3423 if (A->getOption().matches(
3424 options::OPT_fdiagnostics_show_note_include_stack))
3425 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3426 else
3427 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3428 }
3429
Daniel Dunbar838be482009-11-04 06:24:57 +00003430 // Color diagnostics are the default, unless the terminal doesn't support
3431 // them.
Nico Weber9753d462013-04-17 21:52:44 +00003432 // Support both clang's -f[no-]color-diagnostics and gcc's
3433 // -f[no-]diagnostics-colors[=never|always|auto].
3434 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3435 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3436 it != ie; ++it) {
3437 const Option &O = (*it)->getOption();
3438 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3439 !O.matches(options::OPT_fdiagnostics_color) &&
3440 !O.matches(options::OPT_fno_color_diagnostics) &&
3441 !O.matches(options::OPT_fno_diagnostics_color) &&
3442 !O.matches(options::OPT_fdiagnostics_color_EQ))
3443 continue;
3444
3445 (*it)->claim();
3446 if (O.matches(options::OPT_fcolor_diagnostics) ||
3447 O.matches(options::OPT_fdiagnostics_color)) {
3448 ShowColors = Colors_On;
3449 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3450 O.matches(options::OPT_fno_diagnostics_color)) {
3451 ShowColors = Colors_Off;
3452 } else {
3453 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3454 StringRef value((*it)->getValue());
3455 if (value == "always")
3456 ShowColors = Colors_On;
3457 else if (value == "never")
3458 ShowColors = Colors_Off;
3459 else if (value == "auto")
3460 ShowColors = Colors_Auto;
3461 else
3462 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3463 << ("-fdiagnostics-color=" + value).str();
3464 }
3465 }
3466 if (ShowColors == Colors_On ||
3467 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar838be482009-11-04 06:24:57 +00003468 CmdArgs.push_back("-fcolor-diagnostics");
3469
Nico Rieck2956ef42013-09-11 00:38:02 +00003470 if (Args.hasArg(options::OPT_fansi_escape_codes))
3471 CmdArgs.push_back("-fansi-escape-codes");
3472
Daniel Dunbar75eb1d62009-06-08 21:13:54 +00003473 if (!Args.hasFlag(options::OPT_fshow_source_location,
3474 options::OPT_fno_show_source_location))
3475 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar9e820ee2009-04-16 06:32:38 +00003476
Douglas Gregorc9471b02011-05-21 17:07:29 +00003477 if (!Args.hasFlag(options::OPT_fshow_column,
3478 options::OPT_fno_show_column,
3479 true))
3480 CmdArgs.push_back("-fno-show-column");
3481
Douglas Gregora0068fc2010-07-09 17:35:33 +00003482 if (!Args.hasFlag(options::OPT_fspell_checking,
3483 options::OPT_fno_spell_checking))
3484 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003485
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00003486
Chad Rosier15490fd2012-12-05 21:08:21 +00003487 // -fno-asm-blocks is default.
3488 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3489 false))
3490 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar25b26eb2010-10-18 22:49:46 +00003491
Arnold Schwaighofer99662a12013-08-13 15:46:23 +00003492 // Enable vectorization per default according to the optimization level
3493 // selected. For optimization levels that want vectorization we use the alias
3494 // option to simplify the hasFlag logic.
3495 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3496 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier31422792013-04-24 18:29:59 +00003497 options::OPT_fvectorize;
Chad Rosier31422792013-04-24 18:29:59 +00003498 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkelcf5691e2013-08-28 05:21:45 +00003499 options::OPT_fno_vectorize, EnableVec))
Chad Rosierc04d0932012-12-11 17:12:28 +00003500 CmdArgs.push_back("-vectorize-loops");
Chad Rosierc04d0932012-12-11 17:12:28 +00003501
Rafael Espindolad8360612013-08-01 23:56:42 +00003502 // -fslp-vectorize is default.
3503 if (Args.hasFlag(options::OPT_fslp_vectorize,
3504 options::OPT_fno_slp_vectorize, true))
Nadav Rotem50ea9632013-04-15 04:57:18 +00003505 CmdArgs.push_back("-vectorize-slp");
Hal Finkel443c9992012-12-11 19:59:32 +00003506
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003507 // -fno-slp-vectorize-aggressive is default.
3508 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyfdf137b2013-06-25 01:49:44 +00003509 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003510 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem3c6a9b02013-04-15 05:38:41 +00003511
Jeffrey Yasskin5edbdcc2010-06-11 05:57:47 +00003512 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3513 A->render(Args, CmdArgs);
3514
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003515 // -fdollars-in-identifiers default varies depending on platform and
3516 // language; only pass if specified.
Mike Stump1eb44332009-09-09 15:08:12 +00003517 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003518 options::OPT_fno_dollars_in_identifiers)) {
3519 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar8663b182009-12-16 20:10:18 +00003520 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003521 else
Daniel Dunbar8663b182009-12-16 20:10:18 +00003522 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbar7695fba2009-04-19 21:20:32 +00003523 }
3524
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003525 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3526 // practical purposes.
Mike Stump1eb44332009-09-09 15:08:12 +00003527 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003528 options::OPT_fno_unit_at_a_time)) {
3529 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003530 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbare027a4b2009-05-22 19:02:20 +00003531 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00003532
Eli Friedman19bda3a2011-11-02 01:53:16 +00003533 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3534 options::OPT_fno_apple_pragma_pack, false))
3535 CmdArgs.push_back("-fapple-pragma-pack");
3536
Eli Benderskyf3ecf892013-07-24 18:20:14 +00003537 // le32-specific flags:
3538 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3539 // by default.
3540 if (getToolChain().getArch() == llvm::Triple::le32) {
3541 CmdArgs.push_back("-fno-math-builtin");
3542 }
3543
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003544 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003545 //
Daniel Dunbar8ff5b282009-12-11 23:00:49 +00003546 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003547#if 0
Bob Wilson905c45f2011-10-14 05:03:44 +00003548 if (getToolChain().getTriple().isOSDarwin() &&
Eli Bendersky8f4269a2013-07-24 22:20:49 +00003549 (getToolChain().getArch() == llvm::Triple::arm ||
3550 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003551 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3552 CmdArgs.push_back("-fno-builtin-strcat");
3553 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3554 CmdArgs.push_back("-fno-builtin-strcpy");
3555 }
Daniel Dunbarf84a4a42009-09-10 04:57:27 +00003556#endif
Daniel Dunbar2ba91572009-09-10 03:37:02 +00003557
Daniel Dunbard98750f2011-03-18 21:23:40 +00003558 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump1eb44332009-09-09 15:08:12 +00003559 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbard98750f2011-03-18 21:23:40 +00003560 options::OPT_traditional_cpp)) {
3561 if (isa<PreprocessJobAction>(JA))
3562 CmdArgs.push_back("-traditional-cpp");
Eric Christopher88b7cf02011-08-19 00:30:14 +00003563 else
Chris Lattner5f9e2722011-07-23 10:55:15 +00003564 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbard98750f2011-03-18 21:23:40 +00003565 }
Eli Friedmanceb5c5b2009-07-14 21:58:17 +00003566
Daniel Dunbar1d460332009-03-18 10:01:51 +00003567 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnerd82df3a2009-04-12 01:56:53 +00003568 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremenek36f6e302011-11-11 00:07:43 +00003569
3570 // Handle serialized diagnostics.
3571 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3572 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smith1d489cf2012-11-01 04:30:05 +00003573 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremenek36f6e302011-11-11 00:07:43 +00003574 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003575
Ted Kremenek127ff2e2012-09-13 06:41:18 +00003576 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3577 CmdArgs.push_back("-fretain-comments-from-system-headers");
3578
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00003579 // Forward -fcomment-block-commands to -cc1.
3580 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenko6fd7d302013-04-10 15:35:17 +00003581 // Forward -fparse-all-comments to -cc1.
3582 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenko6ebf0912013-02-22 14:21:27 +00003583
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003584 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3585 // parser.
Daniel Dunbar1d460332009-03-18 10:01:51 +00003586 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003587 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3588 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003589 (*it)->claim();
Daniel Dunbarfb36d212010-04-17 06:10:00 +00003590
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003591 // We translate this by hand to the -cc1 argument, since nightly test uses
3592 // it and developers have been trained to spell it with -mllvm.
Richard Smith1d489cf2012-11-01 04:30:05 +00003593 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003594 CmdArgs.push_back("-disable-llvm-optzns");
3595 else
Daniel Dunbar7e4953e2010-06-11 22:00:13 +00003596 (*it)->render(Args, CmdArgs);
Daniel Dunbar3f87fb02010-04-15 06:09:03 +00003597 }
Daniel Dunbar1d460332009-03-18 10:01:51 +00003598
Daniel Dunbarcd8e4c42009-03-30 06:36:42 +00003599 if (Output.getType() == types::TY_Dependencies) {
3600 // Handled with other dependency code.
Daniel Dunbar115a7922009-03-19 07:29:38 +00003601 } else if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003602 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00003603 CmdArgs.push_back(Output.getFilename());
3604 } else {
3605 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00003606 }
3607
Daniel Dunbar1d460332009-03-18 10:01:51 +00003608 for (InputInfoList::const_iterator
3609 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3610 const InputInfo &II = *it;
3611 CmdArgs.push_back("-x");
Fariborz Jahaniana5ee0892012-09-28 19:05:17 +00003612 if (Args.hasArg(options::OPT_rewrite_objc))
3613 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3614 else
3615 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003616 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00003617 CmdArgs.push_back(II.getFilename());
Daniel Dunbar1d460332009-03-18 10:01:51 +00003618 else
Daniel Dunbar115a7922009-03-19 07:29:38 +00003619 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbar1d460332009-03-18 10:01:51 +00003620 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003621
Chris Lattnere6113de2009-11-03 19:50:27 +00003622 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3623
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003624 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003625
3626 // Optionally embed the -cc1 level arguments into the debug info, for build
3627 // analysis.
3628 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar6e900472010-06-04 18:47:06 +00003629 ArgStringList OriginalArgs;
3630 for (ArgList::const_iterator it = Args.begin(),
3631 ie = Args.end(); it != ie; ++it)
3632 (*it)->render(Args, OriginalArgs);
Daniel Dunbarca0e0542010-08-24 16:47:49 +00003633
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003634 SmallString<256> Flags;
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003635 Flags += Exec;
Daniel Dunbar6e900472010-06-04 18:47:06 +00003636 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003637 Flags += " ";
Daniel Dunbar6e900472010-06-04 18:47:06 +00003638 Flags += OriginalArgs[i];
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +00003639 }
3640 CmdArgs.push_back("-dwarf-debug-flags");
3641 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3642 }
3643
Eric Christopher80190392013-02-22 20:12:52 +00003644 // Add the split debug info name to the command lines here so we
3645 // can propagate it to the backend.
3646 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00003647 getToolChain().getTriple().isOSLinux() &&
Eric Christopherff971d72013-02-22 23:50:16 +00003648 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopher80190392013-02-22 20:12:52 +00003649 const char *SplitDwarfOut;
3650 if (SplitDwarf) {
3651 CmdArgs.push_back("-split-dwarf-file");
3652 SplitDwarfOut = SplitDebugName(Args, Inputs);
3653 CmdArgs.push_back(SplitDwarfOut);
3654 }
3655
3656 // Finally add the compile command to the compilation.
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00003657 if (Args.hasArg(options::OPT__SLASH_fallback)) {
3658 tools::visualstudio::Compile CL(getToolChain());
3659 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3660 LinkingOutput);
3661 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3662 } else {
3663 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3664 }
3665
Daniel Dunbara880db02009-03-23 19:03:36 +00003666
Eric Christopherff971d72013-02-22 23:50:16 +00003667 // Handle the debug info splitting at object creation time if we're
3668 // creating an object.
Eric Christopher59320e72013-02-21 22:35:01 +00003669 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherff971d72013-02-22 23:50:16 +00003670 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopher80190392013-02-22 20:12:52 +00003671 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher59320e72013-02-21 22:35:01 +00003672
Roman Divackybe4c8702011-02-10 16:52:03 +00003673 if (Arg *A = Args.getLastArg(options::OPT_pg))
3674 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner5f9e2722011-07-23 10:55:15 +00003675 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divackybe4c8702011-02-10 16:52:03 +00003676 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer20249a12010-10-21 03:16:25 +00003677
Daniel Dunbar68fb4692009-04-03 20:51:31 +00003678 // Claim some arguments which clang supports automatically.
3679
Daniel Dunbarf4046862010-04-15 06:18:42 +00003680 // -fpch-preprocess is used with gcc to add a special marker in the output to
3681 // include the PCH file. Clang's PTH solution is completely transparent, so we
3682 // do not need to deal with it at all.
Daniel Dunbar68fb4692009-04-03 20:51:31 +00003683 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00003684
Daniel Dunbara880db02009-03-23 19:03:36 +00003685 // Claim some arguments which clang doesn't support, but we don't
3686 // care to warn the user about.
Daniel Dunbarcdd96862009-11-25 11:53:23 +00003687 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3688 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola035ff0c2011-02-28 23:29:45 +00003689
Rafael Espindola6155fbe2013-09-04 19:37:35 +00003690 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003691 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00003692}
3693
John McCall260611a2012-06-20 06:18:46 +00003694/// Add options related to the Objective-C runtime/ABI.
3695///
3696/// Returns true if the runtime is non-fragile.
3697ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3698 ArgStringList &cmdArgs,
3699 RewriteKind rewriteKind) const {
3700 // Look for the controlling runtime option.
3701 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3702 options::OPT_fgnu_runtime,
3703 options::OPT_fobjc_runtime_EQ);
3704
3705 // Just forward -fobjc-runtime= to the frontend. This supercedes
3706 // options about fragility.
3707 if (runtimeArg &&
3708 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3709 ObjCRuntime runtime;
Richard Smith1d489cf2012-11-01 04:30:05 +00003710 StringRef value = runtimeArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003711 if (runtime.tryParse(value)) {
3712 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3713 << value;
3714 }
3715
3716 runtimeArg->render(args, cmdArgs);
3717 return runtime;
3718 }
3719
3720 // Otherwise, we'll need the ABI "version". Version numbers are
3721 // slightly confusing for historical reasons:
3722 // 1 - Traditional "fragile" ABI
3723 // 2 - Non-fragile ABI, version 1
3724 // 3 - Non-fragile ABI, version 2
3725 unsigned objcABIVersion = 1;
3726 // If -fobjc-abi-version= is present, use that to set the version.
3727 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003728 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003729 if (value == "1")
3730 objcABIVersion = 1;
3731 else if (value == "2")
3732 objcABIVersion = 2;
3733 else if (value == "3")
3734 objcABIVersion = 3;
3735 else
3736 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3737 << value;
3738 } else {
3739 // Otherwise, determine if we are using the non-fragile ABI.
3740 bool nonFragileABIIsDefault =
3741 (rewriteKind == RK_NonFragile ||
3742 (rewriteKind == RK_None &&
3743 getToolChain().IsObjCNonFragileABIDefault()));
3744 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3745 options::OPT_fno_objc_nonfragile_abi,
3746 nonFragileABIIsDefault)) {
3747 // Determine the non-fragile ABI version to use.
3748#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3749 unsigned nonFragileABIVersion = 1;
3750#else
3751 unsigned nonFragileABIVersion = 2;
3752#endif
3753
3754 if (Arg *abiArg = args.getLastArg(
3755 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00003756 StringRef value = abiArg->getValue();
John McCall260611a2012-06-20 06:18:46 +00003757 if (value == "1")
3758 nonFragileABIVersion = 1;
3759 else if (value == "2")
3760 nonFragileABIVersion = 2;
3761 else
3762 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3763 << value;
3764 }
3765
3766 objcABIVersion = 1 + nonFragileABIVersion;
3767 } else {
3768 objcABIVersion = 1;
3769 }
3770 }
3771
3772 // We don't actually care about the ABI version other than whether
3773 // it's non-fragile.
3774 bool isNonFragile = objcABIVersion != 1;
3775
3776 // If we have no runtime argument, ask the toolchain for its default runtime.
3777 // However, the rewriter only really supports the Mac runtime, so assume that.
3778 ObjCRuntime runtime;
3779 if (!runtimeArg) {
3780 switch (rewriteKind) {
3781 case RK_None:
3782 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3783 break;
3784 case RK_Fragile:
3785 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3786 break;
3787 case RK_NonFragile:
3788 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3789 break;
3790 }
3791
3792 // -fnext-runtime
3793 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3794 // On Darwin, make this use the default behavior for the toolchain.
3795 if (getToolChain().getTriple().isOSDarwin()) {
3796 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3797
3798 // Otherwise, build for a generic macosx port.
3799 } else {
3800 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3801 }
3802
3803 // -fgnu-runtime
3804 } else {
3805 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnalla422cd02012-07-04 10:37:03 +00003806 // Legacy behaviour is to target the gnustep runtime if we are i
3807 // non-fragile mode or the GCC runtime in fragile mode.
3808 if (isNonFragile)
David Chisnall891dac72012-10-16 15:11:55 +00003809 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnalla422cd02012-07-04 10:37:03 +00003810 else
3811 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall260611a2012-06-20 06:18:46 +00003812 }
3813
3814 cmdArgs.push_back(args.MakeArgString(
3815 "-fobjc-runtime=" + runtime.getAsString()));
3816 return runtime;
3817}
3818
Hans Wennborgb3574792013-08-08 00:17:41 +00003819void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
3820 unsigned RTOptionID = options::OPT__SLASH_MT;
3821
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00003822 if (Args.hasArg(options::OPT__SLASH_LDd))
3823 // The /LDd option implies /MTd. The dependent lib part can be overridden,
3824 // but defining _DEBUG is sticky.
3825 RTOptionID = options::OPT__SLASH_MTd;
3826
Hans Wennborg76da1782013-09-18 22:26:39 +00003827 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborgb3574792013-08-08 00:17:41 +00003828 RTOptionID = A->getOption().getID();
Hans Wennborg42ade492013-09-11 16:38:41 +00003829
Hans Wennborgb3574792013-08-08 00:17:41 +00003830 switch(RTOptionID) {
3831 case options::OPT__SLASH_MD:
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00003832 if (Args.hasArg(options::OPT__SLASH_LDd))
3833 CmdArgs.push_back("-D_DEBUG");
Hans Wennborgb3574792013-08-08 00:17:41 +00003834 CmdArgs.push_back("-D_MT");
3835 CmdArgs.push_back("-D_DLL");
3836 CmdArgs.push_back("--dependent-lib=msvcrt");
3837 break;
3838 case options::OPT__SLASH_MDd:
3839 CmdArgs.push_back("-D_DEBUG");
3840 CmdArgs.push_back("-D_MT");
3841 CmdArgs.push_back("-D_DLL");
3842 CmdArgs.push_back("--dependent-lib=msvcrtd");
3843 break;
3844 case options::OPT__SLASH_MT:
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00003845 if (Args.hasArg(options::OPT__SLASH_LDd))
3846 CmdArgs.push_back("-D_DEBUG");
Hans Wennborgb3574792013-08-08 00:17:41 +00003847 CmdArgs.push_back("-D_MT");
3848 CmdArgs.push_back("--dependent-lib=libcmt");
3849 break;
3850 case options::OPT__SLASH_MTd:
3851 CmdArgs.push_back("-D_DEBUG");
3852 CmdArgs.push_back("-D_MT");
3853 CmdArgs.push_back("--dependent-lib=libcmtd");
3854 break;
3855 default:
3856 llvm_unreachable("Unexpected option ID.");
3857 }
3858
Reid Klecknera32c5232013-08-08 19:33:10 +00003859 // This provides POSIX compatibility (maps 'open' to '_open'), which most
3860 // users want. The /Za flag to cl.exe turns this off, but it's not
3861 // implemented in clang.
3862 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborgf0f98912013-08-08 19:54:30 +00003863
3864 // FIXME: Make this default for the win32 triple.
3865 CmdArgs.push_back("-cxx-abi");
3866 CmdArgs.push_back("microsoft");
Hans Wennborg708002e2013-08-09 00:32:23 +00003867
3868 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
3869 A->render(Args, CmdArgs);
Hans Wennborgb6475522013-09-10 01:07:07 +00003870
3871 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
3872 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborg89e32742013-09-24 00:08:55 +00003873 if (Args.hasArg(options::OPT__SLASH_fallback))
3874 CmdArgs.push_back("msvc-fallback");
3875 else
3876 CmdArgs.push_back("msvc");
Hans Wennborgb6475522013-09-10 01:07:07 +00003877 }
Hans Wennborgb3574792013-08-08 00:17:41 +00003878}
3879
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003880void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003881 const InputInfo &Output,
3882 const InputInfoList &Inputs,
3883 const ArgList &Args,
3884 const char *LinkingOutput) const {
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003885 ArgStringList CmdArgs;
3886
3887 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3888 const InputInfo &Input = Inputs[0];
3889
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003890 // Don't warn about "clang -w -c foo.s"
3891 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00003892 // and "clang -emit-llvm -c foo.s"
3893 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindoladbe80d92010-11-17 22:13:25 +00003894
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003895 // Invoke ourselves in -cc1as mode.
3896 //
3897 // FIXME: Implement custom jobs for internal actions.
3898 CmdArgs.push_back("-cc1as");
3899
3900 // Add the "effective" target triple.
3901 CmdArgs.push_back("-triple");
Chad Rosier61ab80a2011-09-20 20:44:06 +00003902 std::string TripleStr =
3903 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003904 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3905
3906 // Set the output mode, we currently only expect to be used as a real
3907 // assembler.
3908 CmdArgs.push_back("-filetype");
3909 CmdArgs.push_back("obj");
3910
Eric Christopher27e2b982012-12-18 00:31:10 +00003911 // Set the main file name, so that debug info works even with
3912 // -save-temps or preprocessed assembly.
3913 CmdArgs.push_back("-main-file-name");
3914 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3915
Rafael Espindolab330e402013-08-20 22:12:08 +00003916 // Add the target cpu
Rafael Espindola146dbbf2013-08-21 16:39:20 +00003917 const llvm::Triple &Triple = getToolChain().getTriple();
3918 std::string CPU = getCPUName(Args, Triple);
Rafael Espindolab330e402013-08-20 22:12:08 +00003919 if (!CPU.empty()) {
3920 CmdArgs.push_back("-target-cpu");
3921 CmdArgs.push_back(Args.MakeArgString(CPU));
3922 }
3923
Rafael Espindola146dbbf2013-08-21 16:39:20 +00003924 // Add the target features
3925 const Driver &D = getToolChain().getDriver();
3926 getTargetFeatures(D, Triple, Args, CmdArgs);
Jim Grosbachfc308292012-02-10 20:37:10 +00003927
Daniel Dunbar7f6f8c82011-03-17 17:37:29 +00003928 // Ignore explicit -force_cpusubtype_ALL option.
3929 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003930
Eric Christopher8f0a4032012-01-10 00:38:01 +00003931 // Determine the original source input.
3932 const Action *SourceAction = &JA;
3933 while (SourceAction->getKind() != Action::InputClass) {
3934 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3935 SourceAction = SourceAction->getInputs()[0];
3936 }
3937
Chandler Carruthd566df62012-12-17 21:40:04 +00003938 // Forward -g and handle debug info related flags, assuming we are dealing
3939 // with an actual assembly file.
Eric Christopher8f0a4032012-01-10 00:38:01 +00003940 if (SourceAction->getType() == types::TY_Asm ||
3941 SourceAction->getType() == types::TY_PP_Asm) {
3942 Args.ClaimAllArgs(options::OPT_g_Group);
3943 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3944 if (!A->getOption().matches(options::OPT_g0))
3945 CmdArgs.push_back("-g");
Chandler Carruthd566df62012-12-17 21:40:04 +00003946
3947 // Add the -fdebug-compilation-dir flag if needed.
3948 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderby02341792013-01-17 21:38:06 +00003949
3950 // Set the AT_producer to the clang version when using the integrated
3951 // assembler on assembly source files.
3952 CmdArgs.push_back("-dwarf-debug-producer");
3953 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopher8f0a4032012-01-10 00:38:01 +00003954 }
Kevin Enderby567003e2011-12-22 19:31:58 +00003955
3956 // Optionally embed the -cc1as level arguments into the debug info, for build
3957 // analysis.
3958 if (getToolChain().UseDwarfDebugFlags()) {
3959 ArgStringList OriginalArgs;
3960 for (ArgList::const_iterator it = Args.begin(),
3961 ie = Args.end(); it != ie; ++it)
3962 (*it)->render(Args, OriginalArgs);
3963
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +00003964 SmallString<256> Flags;
Kevin Enderby567003e2011-12-22 19:31:58 +00003965 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3966 Flags += Exec;
3967 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3968 Flags += " ";
3969 Flags += OriginalArgs[i];
3970 }
3971 CmdArgs.push_back("-dwarf-debug-flags");
3972 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3973 }
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003974
3975 // FIXME: Add -static support, once we have it.
3976
David Blaikie73168db2013-07-25 21:19:01 +00003977 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
3978 getToolChain().getDriver());
3979
Daniel Dunbar3df23252011-04-29 17:53:18 +00003980 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003981
3982 assert(Output.isFilename() && "Unexpected lipo output.");
3983 CmdArgs.push_back("-o");
3984 CmdArgs.push_back(Output.getFilename());
3985
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00003986 assert(Input.isFilename() && "Invalid input.");
3987 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003988
Daniel Dunbara001c1c2010-07-18 21:16:15 +00003989 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00003990 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher708d72a2013-04-10 21:30:40 +00003991
3992 // Handle the debug info splitting at object creation time if we're
3993 // creating an object.
3994 // TODO: Currently only works on linux with newer objcopy.
3995 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00003996 getToolChain().getTriple().isOSLinux())
Eric Christopher708d72a2013-04-10 21:30:40 +00003997 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
3998 SplitDebugName(Args, Inputs));
Daniel Dunbar20a9aa52010-05-20 21:30:13 +00003999}
4000
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004001void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004002 const InputInfo &Output,
4003 const InputInfoList &Inputs,
Daniel Dunbar1d460332009-03-18 10:01:51 +00004004 const ArgList &Args,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004005 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004006 const Driver &D = getToolChain().getDriver();
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004007 ArgStringList CmdArgs;
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004008
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004009 for (ArgList::const_iterator
Daniel Dunbar1d460332009-03-18 10:01:51 +00004010 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004011 Arg *A = *it;
Michael J. Spencer91e06da2012-10-19 22:37:06 +00004012 if (forwardToGCC(A->getOption())) {
Daniel Dunbar2dffe2d2010-08-03 16:14:14 +00004013 // Don't forward any -g arguments to assembly steps.
4014 if (isa<AssembleJobAction>(JA) &&
4015 A->getOption().matches(options::OPT_g_Group))
4016 continue;
4017
NAKAMURA Takumi3c6c8222013-08-19 11:51:51 +00004018 // Don't forward any -W arguments to assembly and link steps.
4019 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4020 A->getOption().matches(options::OPT_W_Group))
4021 continue;
4022
Daniel Dunbar75877192009-03-19 07:55:12 +00004023 // It is unfortunate that we have to claim here, as this means
4024 // we will basically never report anything interesting for
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004025 // platforms using a generic gcc, even if we are just using gcc
4026 // to get to the assembler.
Daniel Dunbar75877192009-03-19 07:55:12 +00004027 A->claim();
Daniel Dunbar1d460332009-03-18 10:01:51 +00004028 A->render(Args, CmdArgs);
Daniel Dunbar75877192009-03-19 07:55:12 +00004029 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004030 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004031
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004032 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004033
4034 // If using a driver driver, force the arch.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004035 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson905c45f2011-10-14 05:03:44 +00004036 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004037 CmdArgs.push_back("-arch");
Daniel Dunbarbf54a062009-04-01 20:33:11 +00004038
4039 // FIXME: Remove these special cases.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004040 if (Arch == llvm::Triple::ppc)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004041 CmdArgs.push_back("ppc");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004042 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004043 CmdArgs.push_back("ppc64");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00004044 else if (Arch == llvm::Triple::ppc64le)
4045 CmdArgs.push_back("ppc64le");
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004046 else
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004047 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004048 }
4049
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004050 // Try to force gcc to match the tool chain we want, if we recognize
4051 // the arch.
Daniel Dunbar7cfe31a2009-05-22 02:21:04 +00004052 //
4053 // FIXME: The triple class should directly provide the information we want
4054 // here.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004055 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004056 CmdArgs.push_back("-m32");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00004057 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4058 Arch == llvm::Triple::ppc64le)
Daniel Dunbar6ecc7a92009-05-02 21:41:52 +00004059 CmdArgs.push_back("-m64");
4060
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004061 if (Output.isFilename()) {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004062 CmdArgs.push_back("-o");
Daniel Dunbar115a7922009-03-19 07:29:38 +00004063 CmdArgs.push_back(Output.getFilename());
4064 } else {
4065 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004066 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar115a7922009-03-19 07:29:38 +00004067 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004068
Tony Linthicum96319392011-12-12 21:14:55 +00004069 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4070 options::OPT_Xassembler);
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004071
4072 // Only pass -x if gcc will understand it; otherwise hope gcc
4073 // understands the suffix correctly. The main use case this would go
4074 // wrong in is for linker inputs if they happened to have an odd
4075 // suffix; really the only way to get this to happen is a command
4076 // like '-x foobar a.c' which will treat a.c like a linker input.
4077 //
4078 // FIXME: For the linker case specifically, can we safely convert
4079 // inputs into '-Wl,' options?
4080 for (InputInfoList::const_iterator
4081 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4082 const InputInfo &II = *it;
Daniel Dunbara8304f62009-05-02 20:14:53 +00004083
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004084 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00004085 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4086 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004087 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004088 << getToolChain().getTripleString();
Daniel Dunbar5915fbf2009-09-01 16:57:46 +00004089 else if (II.getType() == types::TY_AST)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004090 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar88137642009-09-09 22:32:48 +00004091 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00004092 else if (II.getType() == types::TY_ModuleFile)
4093 D.Diag(diag::err_drv_no_module_support)
4094 << getToolChain().getTripleString();
Daniel Dunbara8304f62009-05-02 20:14:53 +00004095
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004096 if (types::canTypeBeUserSpecified(II.getType())) {
4097 CmdArgs.push_back("-x");
4098 CmdArgs.push_back(types::getTypeName(II.getType()));
4099 }
4100
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004101 if (II.isFilename())
Daniel Dunbar115a7922009-03-19 07:29:38 +00004102 CmdArgs.push_back(II.getFilename());
Daniel Dunbar48f99942010-09-25 18:10:05 +00004103 else {
4104 const Arg &A = II.getInputArg();
4105
4106 // Reverse translate some rewritten options.
4107 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4108 CmdArgs.push_back("-lstdc++");
4109 continue;
4110 }
4111
Daniel Dunbar115a7922009-03-19 07:29:38 +00004112 // Don't render as input, we need gcc to do the translations.
Daniel Dunbar48f99942010-09-25 18:10:05 +00004113 A.render(Args, CmdArgs);
4114 }
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004115 }
4116
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00004117 const std::string customGCCName = D.getCCCGenericGCCName();
4118 const char *GCCName;
4119 if (!customGCCName.empty())
4120 GCCName = customGCCName.c_str();
Hans Wennborg76b86c22013-07-18 20:29:38 +00004121 else if (D.CCCIsCXX()) {
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00004122 GCCName = "g++";
Dylan Noblesmithb8a3e812011-04-09 13:31:59 +00004123 } else
4124 GCCName = "gcc";
4125
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004126 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004127 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004128 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004129}
4130
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004131void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4132 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004133 CmdArgs.push_back("-E");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004134}
4135
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004136void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
4137 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004138 // The type is good enough.
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004139}
4140
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004141void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4142 ArgStringList &CmdArgs) const {
Daniel Dunbar64952502010-02-11 03:16:21 +00004143 const Driver &D = getToolChain().getDriver();
4144
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004145 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar6c6424b2010-06-07 23:28:45 +00004146 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4147 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004148 CmdArgs.push_back("-c");
Daniel Dunbar64952502010-02-11 03:16:21 +00004149 else {
4150 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004151 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbar64952502010-02-11 03:16:21 +00004152 << getTypeName(JA.getType());
Michael J. Spencer20249a12010-10-21 03:16:25 +00004153
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004154 CmdArgs.push_back("-S");
Daniel Dunbar64952502010-02-11 03:16:21 +00004155 }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004156}
4157
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004158void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
4159 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004160 CmdArgs.push_back("-c");
Daniel Dunbar47ac7d22009-03-18 06:00:36 +00004161}
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004162
Daniel Dunbar82b51cc2010-01-25 22:35:08 +00004163void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4164 ArgStringList &CmdArgs) const {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +00004165 // The types are (hopefully) good enough.
4166}
4167
Tony Linthicum96319392011-12-12 21:14:55 +00004168// Hexagon tools start.
4169void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4170 ArgStringList &CmdArgs) const {
4171
4172}
4173void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4174 const InputInfo &Output,
4175 const InputInfoList &Inputs,
4176 const ArgList &Args,
4177 const char *LinkingOutput) const {
4178
4179 const Driver &D = getToolChain().getDriver();
4180 ArgStringList CmdArgs;
4181
4182 std::string MarchString = "-march=";
Matthew Curtis67814152012-12-06 14:16:43 +00004183 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum96319392011-12-12 21:14:55 +00004184 CmdArgs.push_back(Args.MakeArgString(MarchString));
4185
4186 RenderExtraToolArgs(JA, CmdArgs);
4187
4188 if (Output.isFilename()) {
4189 CmdArgs.push_back("-o");
4190 CmdArgs.push_back(Output.getFilename());
4191 } else {
4192 assert(Output.isNothing() && "Unexpected output");
4193 CmdArgs.push_back("-fsyntax-only");
4194 }
4195
Matthew Curtis33c95f12012-12-06 17:49:03 +00004196 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4197 if (!SmallDataThreshold.empty())
4198 CmdArgs.push_back(
4199 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum96319392011-12-12 21:14:55 +00004200
Matthew Curtis3d8d4222012-12-07 17:23:04 +00004201 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4202 options::OPT_Xassembler);
4203
Tony Linthicum96319392011-12-12 21:14:55 +00004204 // Only pass -x if gcc will understand it; otherwise hope gcc
4205 // understands the suffix correctly. The main use case this would go
4206 // wrong in is for linker inputs if they happened to have an odd
4207 // suffix; really the only way to get this to happen is a command
4208 // like '-x foobar a.c' which will treat a.c like a linker input.
4209 //
4210 // FIXME: For the linker case specifically, can we safely convert
4211 // inputs into '-Wl,' options?
4212 for (InputInfoList::const_iterator
4213 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4214 const InputInfo &II = *it;
4215
4216 // Don't try to pass LLVM or AST inputs to a generic gcc.
4217 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4218 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4219 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4220 << getToolChain().getTripleString();
4221 else if (II.getType() == types::TY_AST)
4222 D.Diag(clang::diag::err_drv_no_ast_support)
4223 << getToolChain().getTripleString();
Douglas Gregorc544ba02013-03-27 16:47:18 +00004224 else if (II.getType() == types::TY_ModuleFile)
4225 D.Diag(diag::err_drv_no_module_support)
4226 << getToolChain().getTripleString();
Tony Linthicum96319392011-12-12 21:14:55 +00004227
4228 if (II.isFilename())
4229 CmdArgs.push_back(II.getFilename());
4230 else
4231 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4232 II.getInputArg().render(Args, CmdArgs);
4233 }
4234
4235 const char *GCCName = "hexagon-as";
4236 const char *Exec =
4237 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4238 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4239
4240}
4241void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4242 ArgStringList &CmdArgs) const {
4243 // The types are (hopefully) good enough.
4244}
4245
4246void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4247 const InputInfo &Output,
4248 const InputInfoList &Inputs,
4249 const ArgList &Args,
4250 const char *LinkingOutput) const {
4251
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004252 const toolchains::Hexagon_TC& ToolChain =
4253 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4254 const Driver &D = ToolChain.getDriver();
4255
Tony Linthicum96319392011-12-12 21:14:55 +00004256 ArgStringList CmdArgs;
4257
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004258 //----------------------------------------------------------------------------
4259 //
4260 //----------------------------------------------------------------------------
4261 bool hasStaticArg = Args.hasArg(options::OPT_static);
4262 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtis33c95f12012-12-06 17:49:03 +00004263 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004264 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4265 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4266 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4267 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum96319392011-12-12 21:14:55 +00004268
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004269 //----------------------------------------------------------------------------
4270 // Silence warnings for various options
4271 //----------------------------------------------------------------------------
Tony Linthicum96319392011-12-12 21:14:55 +00004272
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004273 Args.ClaimAllArgs(options::OPT_g_Group);
4274 Args.ClaimAllArgs(options::OPT_emit_llvm);
4275 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4276 // handled somewhere else.
4277 Args.ClaimAllArgs(options::OPT_static_libgcc);
4278
4279 //----------------------------------------------------------------------------
4280 //
4281 //----------------------------------------------------------------------------
4282 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4283 e = ToolChain.ExtraOpts.end();
4284 i != e; ++i)
4285 CmdArgs.push_back(i->c_str());
Tony Linthicum96319392011-12-12 21:14:55 +00004286
Matthew Curtis67814152012-12-06 14:16:43 +00004287 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4288 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop43115d42012-01-13 20:37:10 +00004289
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004290 if (buildingLib) {
4291 CmdArgs.push_back("-shared");
4292 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4293 // hexagon-gcc does
Tony Linthicum96319392011-12-12 21:14:55 +00004294 }
4295
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004296 if (hasStaticArg)
4297 CmdArgs.push_back("-static");
Tony Linthicum96319392011-12-12 21:14:55 +00004298
Matthew Curtis33c95f12012-12-06 17:49:03 +00004299 if (buildPIE && !buildingLib)
4300 CmdArgs.push_back("-pie");
4301
4302 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4303 if (!SmallDataThreshold.empty()) {
4304 CmdArgs.push_back(
4305 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4306 }
4307
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004308 //----------------------------------------------------------------------------
4309 //
4310 //----------------------------------------------------------------------------
4311 CmdArgs.push_back("-o");
4312 CmdArgs.push_back(Output.getFilename());
Tony Linthicum96319392011-12-12 21:14:55 +00004313
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004314 const std::string MarchSuffix = "/" + MarchString;
4315 const std::string G0Suffix = "/G0";
4316 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4317 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4318 + "/";
4319 const std::string StartFilesDir = RootDir
4320 + "hexagon/lib"
4321 + (buildingLib
4322 ? MarchG0Suffix : MarchSuffix);
4323
4324 //----------------------------------------------------------------------------
4325 // moslib
4326 //----------------------------------------------------------------------------
4327 std::vector<std::string> oslibs;
4328 bool hasStandalone= false;
4329
4330 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4331 ie = Args.filtered_end(); it != ie; ++it) {
4332 (*it)->claim();
4333 oslibs.push_back((*it)->getValue());
4334 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum96319392011-12-12 21:14:55 +00004335 }
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004336 if (oslibs.empty()) {
4337 oslibs.push_back("standalone");
4338 hasStandalone = true;
4339 }
Tony Linthicum96319392011-12-12 21:14:55 +00004340
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004341 //----------------------------------------------------------------------------
4342 // Start Files
4343 //----------------------------------------------------------------------------
4344 if (incStdLib && incStartFiles) {
4345
4346 if (!buildingLib) {
4347 if (hasStandalone) {
4348 CmdArgs.push_back(
4349 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4350 }
4351 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4352 }
4353 std::string initObj = useShared ? "/initS.o" : "/init.o";
4354 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4355 }
4356
4357 //----------------------------------------------------------------------------
4358 // Library Search Paths
4359 //----------------------------------------------------------------------------
4360 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4361 for (ToolChain::path_list::const_iterator
4362 i = LibPaths.begin(),
4363 e = LibPaths.end();
4364 i != e;
4365 ++i)
4366 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4367
4368 //----------------------------------------------------------------------------
4369 //
4370 //----------------------------------------------------------------------------
4371 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4372 Args.AddAllArgs(CmdArgs, options::OPT_e);
4373 Args.AddAllArgs(CmdArgs, options::OPT_s);
4374 Args.AddAllArgs(CmdArgs, options::OPT_t);
4375 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4376
4377 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4378
4379 //----------------------------------------------------------------------------
4380 // Libraries
4381 //----------------------------------------------------------------------------
4382 if (incStdLib && incDefLibs) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00004383 if (D.CCCIsCXX()) {
Matthew Curtis5fdf3502012-12-06 15:46:07 +00004384 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4385 CmdArgs.push_back("-lm");
4386 }
4387
4388 CmdArgs.push_back("--start-group");
4389
4390 if (!buildingLib) {
4391 for(std::vector<std::string>::iterator i = oslibs.begin(),
4392 e = oslibs.end(); i != e; ++i)
4393 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4394 CmdArgs.push_back("-lc");
4395 }
4396 CmdArgs.push_back("-lgcc");
4397
4398 CmdArgs.push_back("--end-group");
4399 }
4400
4401 //----------------------------------------------------------------------------
4402 // End files
4403 //----------------------------------------------------------------------------
4404 if (incStdLib && incStartFiles) {
4405 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4406 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4407 }
4408
4409 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00004410 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum96319392011-12-12 21:14:55 +00004411}
4412// Hexagon tools end.
4413
Rafael Espindolacfed8282012-10-31 18:51:07 +00004414llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4415 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4416 // archs which Darwin doesn't use.
4417
4418 // The matching this routine does is fairly pointless, since it is neither the
4419 // complete architecture list, nor a reasonable subset. The problem is that
4420 // historically the driver driver accepts this and also ties its -march=
4421 // handling to the architecture name, so we need to be careful before removing
4422 // support for it.
4423
4424 // This code must be kept in sync with Clang's Darwin specific argument
4425 // translation.
4426
4427 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4428 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4429 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4430 .Case("ppc64", llvm::Triple::ppc64)
4431 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4432 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4433 llvm::Triple::x86)
4434 .Case("x86_64", llvm::Triple::x86_64)
4435 // This is derived from the driver driver.
Bob Wilson2503ebd2013-03-04 22:37:49 +00004436 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4437 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4438 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindolacfed8282012-10-31 18:51:07 +00004439 .Case("r600", llvm::Triple::r600)
4440 .Case("nvptx", llvm::Triple::nvptx)
4441 .Case("nvptx64", llvm::Triple::nvptx64)
4442 .Case("amdil", llvm::Triple::amdil)
4443 .Case("spir", llvm::Triple::spir)
4444 .Default(llvm::Triple::UnknownArch);
4445}
Tony Linthicum96319392011-12-12 21:14:55 +00004446
Bob Wilson66b8a662012-11-23 06:14:39 +00004447const char *Clang::getBaseInputName(const ArgList &Args,
4448 const InputInfoList &Inputs) {
Michael J. Spencer472ccff2010-12-18 00:19:12 +00004449 return Args.MakeArgString(
4450 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004451}
4452
Bob Wilson66b8a662012-11-23 06:14:39 +00004453const char *Clang::getBaseInputStem(const ArgList &Args,
4454 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004455 const char *Str = getBaseInputName(Args, Inputs);
4456
Chris Lattner657ca662011-01-16 08:14:11 +00004457 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar88137642009-09-09 22:32:48 +00004458 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004459
4460 return Str;
4461}
4462
Bob Wilson66b8a662012-11-23 06:14:39 +00004463const char *Clang::getDependencyFileName(const ArgList &Args,
4464 const InputInfoList &Inputs) {
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004465 // FIXME: Think about this more.
4466 std::string Res;
4467
4468 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smith1d489cf2012-11-01 04:30:05 +00004469 std::string Str(OutputOpt->getValue());
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004470 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier30601782011-08-17 23:08:45 +00004471 } else {
Bob Wilson66b8a662012-11-23 06:14:39 +00004472 Res = getBaseInputStem(Args, Inputs);
Chad Rosier30601782011-08-17 23:08:45 +00004473 }
Daniel Dunbar88137642009-09-09 22:32:48 +00004474 return Args.MakeArgString(Res + ".d");
Daniel Dunbara3ec60e2009-03-29 18:40:18 +00004475}
4476
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004477void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004478 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004479 const InputInfoList &Inputs,
4480 const ArgList &Args,
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004481 const char *LinkingOutput) const {
4482 ArgStringList CmdArgs;
4483
4484 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4485 const InputInfo &Input = Inputs[0];
4486
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004487 // Determine the original source input.
4488 const Action *SourceAction = &JA;
4489 while (SourceAction->getKind() != Action::InputClass) {
4490 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4491 SourceAction = SourceAction->getInputs()[0];
4492 }
4493
4494 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher88b7cf02011-08-19 00:30:14 +00004495 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbar34bac1f2011-04-12 23:59:20 +00004496 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004497 if (Args.hasArg(options::OPT_gstabs))
4498 CmdArgs.push_back("--gstabs");
4499 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson591ff152011-11-02 05:10:45 +00004500 CmdArgs.push_back("-g");
Daniel Dunbar8e4fea62009-04-01 00:27:44 +00004501 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004502
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004503 // Derived from asm spec.
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004504 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004505
Daniel Dunbarf5438e32010-07-22 01:47:22 +00004506 // Use -force_cpusubtype_ALL on x86 by default.
Eli Bendersky8f4269a2013-07-24 22:20:49 +00004507 if (getToolChain().getArch() == llvm::Triple::x86 ||
4508 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbarcc6f8032009-09-09 18:36:27 +00004509 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4510 CmdArgs.push_back("-force_cpusubtype_ALL");
4511
Eli Bendersky8f4269a2013-07-24 22:20:49 +00004512 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004513 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher59320e72013-02-21 22:35:01 +00004514 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004515 (!getDarwinToolChain().isTargetIPhoneOS() ||
4516 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4517 Args.hasArg(options::OPT_static)))
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004518 CmdArgs.push_back("-static");
4519
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004520 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4521 options::OPT_Xassembler);
4522
4523 assert(Output.isFilename() && "Unexpected lipo output.");
4524 CmdArgs.push_back("-o");
4525 CmdArgs.push_back(Output.getFilename());
4526
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00004527 assert(Input.isFilename() && "Invalid input.");
4528 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004529
4530 // asm_final spec is empty.
4531
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004532 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004533 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004534 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8cac5f72009-03-20 16:06:39 +00004535}
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004536
David Blaikie99ba9e32011-12-20 02:48:34 +00004537void darwin::DarwinTool::anchor() {}
4538
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +00004539void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4540 ArgStringList &CmdArgs) const {
Chris Lattner5f9e2722011-07-23 10:55:15 +00004541 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbareeff4062010-01-22 02:04:58 +00004542
Daniel Dunbar02633b52009-03-26 16:23:12 +00004543 // Derived from darwin_arch spec.
4544 CmdArgs.push_back("-arch");
Daniel Dunbareeff4062010-01-22 02:04:58 +00004545 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004546
Daniel Dunbareeff4062010-01-22 02:04:58 +00004547 // FIXME: Is this needed anymore?
4548 if (ArchName == "arm")
Daniel Dunbar78dbd582009-09-04 18:35:31 +00004549 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004550}
4551
Bill Wendling6acf8b42012-10-02 18:02:50 +00004552bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4553 // We only need to generate a temp path for LTO if we aren't compiling object
4554 // files. When compiling source files, we run 'dsymutil' after linking. We
4555 // don't run 'dsymutil' when compiling object files.
4556 for (InputInfoList::const_iterator
4557 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4558 if (it->getType() != types::TY_Object)
4559 return true;
4560
4561 return false;
4562}
4563
Daniel Dunbar748de8e2010-09-09 21:51:05 +00004564void darwin::Link::AddLinkArgs(Compilation &C,
4565 const ArgList &Args,
Bill Wendling6acf8b42012-10-02 18:02:50 +00004566 ArgStringList &CmdArgs,
4567 const InputInfoList &Inputs) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00004568 const Driver &D = getToolChain().getDriver();
Daniel Dunbarce911f52011-04-28 21:23:41 +00004569 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbar02633b52009-03-26 16:23:12 +00004570
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004571 unsigned Version[3] = { 0, 0, 0 };
4572 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4573 bool HadExtra;
Richard Smith1d489cf2012-11-01 04:30:05 +00004574 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004575 Version[1], Version[2], HadExtra) ||
4576 HadExtra)
Chris Lattner5f9e2722011-07-23 10:55:15 +00004577 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004578 << A->getAsString(Args);
4579 }
4580
4581 // Newer linkers support -demangle, pass it if supported and not disabled by
4582 // the user.
Daniel Dunbard2d20882012-01-04 21:45:27 +00004583 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004584 // Don't pass -demangle to ld_classic.
4585 //
4586 // FIXME: This is a temporary workaround, ld should be handling this.
4587 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4588 Args.hasArg(options::OPT_static));
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004589 if (getToolChain().getArch() == llvm::Triple::x86) {
4590 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4591 options::OPT_Wl_COMMA),
4592 ie = Args.filtered_end(); it != ie; ++it) {
4593 const Arg *A = *it;
4594 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smith1d489cf2012-11-01 04:30:05 +00004595 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar9ced7042010-09-07 17:50:41 +00004596 UsesLdClassic = true;
4597 }
4598 }
Daniel Dunbarbcf1da82010-09-07 17:07:49 +00004599 if (!UsesLdClassic)
4600 CmdArgs.push_back("-demangle");
Daniel Dunbarb18dc5b2010-08-11 23:07:50 +00004601 }
4602
Bob Wilsonbd77c592013-08-02 22:25:34 +00004603 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4604 CmdArgs.push_back("-export_dynamic");
4605
Bill Wendlingc35f9082012-11-16 23:03:00 +00004606 // If we are using LTO, then automatically create a temporary file path for
4607 // the linker to use, so that it's lifetime will extend past a possible
4608 // dsymutil step.
4609 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4610 const char *TmpPath = C.getArgs().MakeArgString(
4611 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4612 C.addTempFile(TmpPath);
4613 CmdArgs.push_back("-object_path_lto");
4614 CmdArgs.push_back(TmpPath);
Daniel Dunbar5bfa6562011-06-21 20:55:11 +00004615 }
4616
Daniel Dunbar02633b52009-03-26 16:23:12 +00004617 // Derived from the "link" spec.
4618 Args.AddAllArgs(CmdArgs, options::OPT_static);
4619 if (!Args.hasArg(options::OPT_static))
4620 CmdArgs.push_back("-dynamic");
4621 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4622 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4623 // here. How do we wish to handle such things?
4624 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004625
Daniel Dunbar02633b52009-03-26 16:23:12 +00004626 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara6d38492010-01-22 02:04:52 +00004627 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara6d38492010-01-22 02:04:52 +00004628 // FIXME: Why do this only on this path?
Daniel Dunbar8917dd42010-01-22 03:37:33 +00004629 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004630
4631 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4632 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4633 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4634
4635 Arg *A;
4636 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4637 (A = Args.getLastArg(options::OPT_current__version)) ||
4638 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004639 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004640 << A->getAsString(Args) << "-dynamiclib";
4641
4642 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4643 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4644 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4645 } else {
4646 CmdArgs.push_back("-dylib");
4647
4648 Arg *A;
4649 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4650 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4651 (A = Args.getLastArg(options::OPT_client__name)) ||
4652 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4653 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4654 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner5f9e2722011-07-23 10:55:15 +00004655 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar02633b52009-03-26 16:23:12 +00004656 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004657
Daniel Dunbar02633b52009-03-26 16:23:12 +00004658 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4659 "-dylib_compatibility_version");
4660 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4661 "-dylib_current_version");
4662
Daniel Dunbara6d38492010-01-22 02:04:52 +00004663 AddDarwinArch(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004664
4665 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4666 "-dylib_install_name");
4667 }
4668
4669 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4670 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4671 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarce911f52011-04-28 21:23:41 +00004672 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004673 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004674 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4675 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4676 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4677 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4678 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4679 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar99ca47b2011-06-28 20:16:02 +00004680 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004681 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4682 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4683 Args.AddAllArgs(CmdArgs, options::OPT_init);
4684
Daniel Dunbarce911f52011-04-28 21:23:41 +00004685 // Add the deployment target.
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004686 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbarb7f5ef72011-04-30 04:22:58 +00004687
4688 // If we had an explicit -mios-simulator-version-min argument, honor that,
4689 // otherwise use the traditional deployment targets. We can't just check the
4690 // is-sim attribute because existing code follows this path, and the linker
4691 // may not handle the argument.
4692 //
4693 // FIXME: We may be able to remove this, once we can verify no one depends on
4694 // it.
4695 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4696 CmdArgs.push_back("-ios_simulator_version_min");
4697 else if (DarwinTC.isTargetIPhoneOS())
4698 CmdArgs.push_back("-iphoneos_version_min");
4699 else
4700 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramer09c9a562012-03-10 20:55:36 +00004701 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarce911f52011-04-28 21:23:41 +00004702
Daniel Dunbar02633b52009-03-26 16:23:12 +00004703 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4704 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4705 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4706 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4707 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004708
Daniel Dunbar47e879d2010-07-13 23:31:40 +00004709 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4710 options::OPT_fno_pie,
4711 options::OPT_fno_PIE)) {
4712 if (A->getOption().matches(options::OPT_fpie) ||
4713 A->getOption().matches(options::OPT_fPIE))
4714 CmdArgs.push_back("-pie");
4715 else
4716 CmdArgs.push_back("-no_pie");
4717 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004718
4719 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4720 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4721 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4722 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4723 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4724 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4725 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4726 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4727 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4728 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4729 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4730 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4731 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4732 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4733 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4734 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004735
Daniel Dunbarcc957192011-05-02 21:03:47 +00004736 // Give --sysroot= preference, over the Apple specific behavior to also use
4737 // --isysroot as the syslibroot.
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004738 StringRef sysroot = C.getSysRoot();
4739 if (sysroot != "") {
Daniel Dunbarcc957192011-05-02 21:03:47 +00004740 CmdArgs.push_back("-syslibroot");
Sebastian Pop4762a2d2012-04-16 04:16:43 +00004741 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbarcc957192011-05-02 21:03:47 +00004742 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4743 CmdArgs.push_back("-syslibroot");
Richard Smith1d489cf2012-11-01 04:30:05 +00004744 CmdArgs.push_back(A->getValue());
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004745 }
4746
Daniel Dunbar02633b52009-03-26 16:23:12 +00004747 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4748 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4749 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4750 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4751 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbard82f8fa2009-09-04 18:35:41 +00004752 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004753 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4754 Args.AddAllArgs(CmdArgs, options::OPT_y);
4755 Args.AddLastArg(CmdArgs, options::OPT_w);
4756 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4757 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4758 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4759 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4760 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4761 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4762 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4763 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4764 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4765 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4766 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4767 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4768}
4769
4770void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004771 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004772 const InputInfoList &Inputs,
4773 const ArgList &Args,
Daniel Dunbar02633b52009-03-26 16:23:12 +00004774 const char *LinkingOutput) const {
4775 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbare0be8b12009-09-08 16:39:16 +00004776
Daniel Dunbar02633b52009-03-26 16:23:12 +00004777 // The logic here is derived from gcc's behavior; most of which
4778 // comes from specs (starting with link_command). Consult gcc for
4779 // more information.
Daniel Dunbar02633b52009-03-26 16:23:12 +00004780 ArgStringList CmdArgs;
4781
Argyrios Kyrtzidis22897172011-10-07 22:58:08 +00004782 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4783 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4784 options::OPT_ccc_arcmt_migrate)) {
4785 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4786 (*I)->claim();
4787 const char *Exec =
4788 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4789 CmdArgs.push_back(Output.getFilename());
4790 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4791 return;
4792 }
4793
Daniel Dunbar02633b52009-03-26 16:23:12 +00004794 // I'm not sure why this particular decomposition exists in gcc, but
4795 // we follow suite for ease of comparison.
Bill Wendling6acf8b42012-10-02 18:02:50 +00004796 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004797
Daniel Dunbar02633b52009-03-26 16:23:12 +00004798 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4799 Args.AddAllArgs(CmdArgs, options::OPT_s);
4800 Args.AddAllArgs(CmdArgs, options::OPT_t);
4801 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4802 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004803 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004804 Args.AddAllArgs(CmdArgs, options::OPT_r);
4805
Daniel Dunbar270073c2010-10-18 22:08:36 +00004806 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4807 // members of static archive libraries which implement Objective-C classes or
4808 // categories.
4809 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4810 CmdArgs.push_back("-ObjC");
Michael J. Spencer20249a12010-10-21 03:16:25 +00004811
Daniel Dunbar02633b52009-03-26 16:23:12 +00004812 CmdArgs.push_back("-o");
4813 CmdArgs.push_back(Output.getFilename());
4814
Chad Rosier18937312012-05-16 23:45:12 +00004815 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004816 !Args.hasArg(options::OPT_nostartfiles)) {
4817 // Derived from startfile spec.
4818 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004819 // Derived from darwin_dylib1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004820 if (getDarwinToolChain().isTargetIOSSimulator()) {
4821 // The simulator doesn't have a versioned crt1 file.
4822 CmdArgs.push_back("-ldylib1.o");
4823 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004824 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4825 CmdArgs.push_back("-ldylib1.o");
4826 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004827 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004828 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004829 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004830 CmdArgs.push_back("-ldylib1.10.5.o");
4831 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004832 } else {
4833 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004834 if (!Args.hasArg(options::OPT_static)) {
4835 // Derived from darwin_bundle1 spec.
Daniel Dunbar1051fc02011-04-01 21:02:42 +00004836 if (getDarwinToolChain().isTargetIOSSimulator()) {
4837 // The simulator doesn't have a versioned crt1 file.
4838 CmdArgs.push_back("-lbundle1.o");
4839 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004840 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4841 CmdArgs.push_back("-lbundle1.o");
4842 } else {
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004843 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004844 CmdArgs.push_back("-lbundle1.o");
4845 }
Daniel Dunbar8a8d8af2009-04-01 03:17:40 +00004846 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004847 } else {
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +00004848 if (Args.hasArg(options::OPT_pg) &&
4849 getToolChain().SupportsProfiling()) {
Daniel Dunbar02633b52009-03-26 16:23:12 +00004850 if (Args.hasArg(options::OPT_static) ||
4851 Args.hasArg(options::OPT_object) ||
4852 Args.hasArg(options::OPT_preload)) {
4853 CmdArgs.push_back("-lgcrt0.o");
4854 } else {
4855 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004856
Daniel Dunbar02633b52009-03-26 16:23:12 +00004857 // darwin_crt2 spec is empty.
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004858 }
Bob Wilson4e6e7912012-07-04 00:18:41 +00004859 // By default on OS X 10.8 and later, we don't link with a crt1.o
4860 // file and the linker knows to use _main as the entry point. But,
4861 // when compiling with -pg, we need to link with the gcrt1.o file,
4862 // so pass the -no_new_main option to tell the linker to use the
4863 // "start" symbol as the entry point.
Bob Wilson1fc6e4f2012-07-03 20:42:10 +00004864 if (getDarwinToolChain().isTargetMacOS() &&
4865 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4866 CmdArgs.push_back("-no_new_main");
Daniel Dunbar02633b52009-03-26 16:23:12 +00004867 } else {
4868 if (Args.hasArg(options::OPT_static) ||
4869 Args.hasArg(options::OPT_object) ||
4870 Args.hasArg(options::OPT_preload)) {
4871 CmdArgs.push_back("-lcrt0.o");
4872 } else {
4873 // Derived from darwin_crt1 spec.
Daniel Dunbar40355802011-03-31 17:12:33 +00004874 if (getDarwinToolChain().isTargetIOSSimulator()) {
4875 // The simulator doesn't have a versioned crt1 file.
4876 CmdArgs.push_back("-lcrt1.o");
4877 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004878 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4879 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbar7a0c0642012-10-15 22:23:53 +00004880 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbarcacb0f02010-01-27 00:56:56 +00004881 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004882 } else {
4883 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4884 CmdArgs.push_back("-lcrt1.o");
4885 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4886 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004887 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004888 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004889
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004890 // darwin_crt2 spec is empty.
4891 }
Daniel Dunbar02633b52009-03-26 16:23:12 +00004892 }
4893 }
4894 }
4895 }
4896
Daniel Dunbarce3fdf22010-01-27 00:57:03 +00004897 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4898 Args.hasArg(options::OPT_shared_libgcc) &&
4899 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar88137642009-09-09 22:32:48 +00004900 const char *Str =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004901 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar88137642009-09-09 22:32:48 +00004902 CmdArgs.push_back(Str);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004903 }
4904 }
4905
4906 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004907
Daniel Dunbar02633b52009-03-26 16:23:12 +00004908 if (Args.hasArg(options::OPT_fopenmp))
4909 // This is more complicated in gcc...
4910 CmdArgs.push_back("-lgomp");
4911
Douglas Gregor04e326b2012-05-15 21:00:27 +00004912 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4913
Bob Wilson63d9f3c2012-05-15 18:57:39 +00004914 if (isObjCRuntimeLinked(Args) &&
4915 !Args.hasArg(options::OPT_nostdlib) &&
4916 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004917 // Avoid linking compatibility stubs on i386 mac.
4918 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola64f7ad92012-10-07 04:44:33 +00004919 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004920 // If we don't have ARC or subscripting runtime support, link in the
4921 // runtime stubs. We have to do this *before* adding any of the normal
4922 // linker inputs so that its initializer gets run first.
John McCall260611a2012-06-20 06:18:46 +00004923 ObjCRuntime runtime =
4924 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004925 // We use arclite library for both ARC and subscripting support.
John McCall0a7dd782012-08-21 02:47:43 +00004926 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall260611a2012-06-20 06:18:46 +00004927 !runtime.hasSubscripting())
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004928 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004929 }
Bob Wilson0b1c7152012-04-21 00:21:42 +00004930 CmdArgs.push_back("-framework");
4931 CmdArgs.push_back("Foundation");
Ted Kremenekebcb57a2012-03-06 20:05:56 +00004932 // Link libobj.
4933 CmdArgs.push_back("-lobjc");
John McCall9f084a32011-07-06 00:26:06 +00004934 }
John McCallf85e1932011-06-15 23:02:42 +00004935
Daniel Dunbar02633b52009-03-26 16:23:12 +00004936 if (LinkingOutput) {
4937 CmdArgs.push_back("-arch_multiple");
4938 CmdArgs.push_back("-final_output");
4939 CmdArgs.push_back(LinkingOutput);
4940 }
4941
Daniel Dunbar02633b52009-03-26 16:23:12 +00004942 if (Args.hasArg(options::OPT_fnested_functions))
4943 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004944
Daniel Dunbar02633b52009-03-26 16:23:12 +00004945 if (!Args.hasArg(options::OPT_nostdlib) &&
4946 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00004947 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar132e35d2010-09-17 01:20:05 +00004948 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbaredfa02b2009-04-08 06:06:21 +00004949
Daniel Dunbar02633b52009-03-26 16:23:12 +00004950 // link_ssp spec is empty.
4951
Daniel Dunbar6cd41542009-09-18 08:15:03 +00004952 // Let the tool chain choose which runtime library to link.
4953 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbar02633b52009-03-26 16:23:12 +00004954 }
4955
Chad Rosier18937312012-05-16 23:45:12 +00004956 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbar02633b52009-03-26 16:23:12 +00004957 !Args.hasArg(options::OPT_nostartfiles)) {
4958 // endfile_spec is empty.
4959 }
4960
4961 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4962 Args.AddAllArgs(CmdArgs, options::OPT_F);
4963
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004964 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004965 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004966 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar02633b52009-03-26 16:23:12 +00004967}
4968
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004969void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004970 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004971 const InputInfoList &Inputs,
4972 const ArgList &Args,
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004973 const char *LinkingOutput) const {
4974 ArgStringList CmdArgs;
4975
4976 CmdArgs.push_back("-create");
4977 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbara428df82009-03-24 00:24:37 +00004978
4979 CmdArgs.push_back("-output");
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004980 CmdArgs.push_back(Output.getFilename());
Daniel Dunbara428df82009-03-24 00:24:37 +00004981
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004982 for (InputInfoList::const_iterator
4983 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4984 const InputInfo &II = *it;
4985 assert(II.isFilename() && "Unexpected lipo input.");
4986 CmdArgs.push_back(II.getFilename());
4987 }
Daniel Dunbarc21c4852009-04-08 23:54:23 +00004988 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00004989 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004990 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarff7488d2009-03-20 00:52:38 +00004991}
Daniel Dunbar68a31d42009-03-31 17:45:15 +00004992
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004993void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00004994 const InputInfo &Output,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00004995 const InputInfoList &Inputs,
4996 const ArgList &Args,
4997 const char *LinkingOutput) const {
4998 ArgStringList CmdArgs;
4999
Daniel Dunbar03e92302011-05-09 17:23:16 +00005000 CmdArgs.push_back("-o");
5001 CmdArgs.push_back(Output.getFilename());
5002
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00005003 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5004 const InputInfo &Input = Inputs[0];
5005 assert(Input.isFilename() && "Unexpected dsymutil input.");
5006 CmdArgs.push_back(Input.getFilename());
5007
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00005008 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005009 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005010 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00005011}
5012
Eric Christopherf8571862011-08-23 17:56:55 +00005013void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher27e2b982012-12-18 00:31:10 +00005014 const InputInfo &Output,
5015 const InputInfoList &Inputs,
5016 const ArgList &Args,
5017 const char *LinkingOutput) const {
Eric Christopherf8571862011-08-23 17:56:55 +00005018 ArgStringList CmdArgs;
5019 CmdArgs.push_back("--verify");
Eric Christopher1c79dc42012-02-06 19:13:09 +00005020 CmdArgs.push_back("--debug-info");
5021 CmdArgs.push_back("--eh-frame");
Eric Christopherb822f722012-02-06 19:43:51 +00005022 CmdArgs.push_back("--quiet");
Eric Christopherf8571862011-08-23 17:56:55 +00005023
5024 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5025 const InputInfo &Input = Inputs[0];
5026 assert(Input.isFilename() && "Unexpected verify input");
5027
5028 // Grabbing the output of the earlier dsymutil run.
5029 CmdArgs.push_back(Input.getFilename());
5030
5031 const char *Exec =
5032 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5033 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5034}
5035
David Chisnall31c46902012-02-15 13:39:01 +00005036void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5037 const InputInfo &Output,
5038 const InputInfoList &Inputs,
5039 const ArgList &Args,
5040 const char *LinkingOutput) const {
5041 ArgStringList CmdArgs;
5042
5043 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5044 options::OPT_Xassembler);
5045
5046 CmdArgs.push_back("-o");
5047 CmdArgs.push_back(Output.getFilename());
5048
5049 for (InputInfoList::const_iterator
5050 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5051 const InputInfo &II = *it;
5052 CmdArgs.push_back(II.getFilename());
5053 }
5054
5055 const char *Exec =
5056 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5057 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5058}
5059
5060
5061void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5062 const InputInfo &Output,
5063 const InputInfoList &Inputs,
5064 const ArgList &Args,
5065 const char *LinkingOutput) const {
5066 // FIXME: Find a real GCC, don't hard-code versions here
5067 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5068 const llvm::Triple &T = getToolChain().getTriple();
5069 std::string LibPath = "/usr/lib/";
5070 llvm::Triple::ArchType Arch = T.getArch();
5071 switch (Arch) {
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00005072 case llvm::Triple::x86:
5073 GCCLibPath +=
5074 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5075 break;
5076 case llvm::Triple::x86_64:
5077 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5078 GCCLibPath += "/4.5.2/amd64/";
5079 LibPath += "amd64/";
5080 break;
5081 default:
5082 llvm_unreachable("Unsupported architecture");
David Chisnall31c46902012-02-15 13:39:01 +00005083 }
5084
5085 ArgStringList CmdArgs;
5086
David Chisnall41d476d2012-02-29 15:06:12 +00005087 // Demangle C++ names in errors
5088 CmdArgs.push_back("-C");
5089
David Chisnall31c46902012-02-15 13:39:01 +00005090 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5091 (!Args.hasArg(options::OPT_shared))) {
5092 CmdArgs.push_back("-e");
5093 CmdArgs.push_back("_start");
5094 }
5095
5096 if (Args.hasArg(options::OPT_static)) {
5097 CmdArgs.push_back("-Bstatic");
5098 CmdArgs.push_back("-dn");
5099 } else {
5100 CmdArgs.push_back("-Bdynamic");
5101 if (Args.hasArg(options::OPT_shared)) {
5102 CmdArgs.push_back("-shared");
5103 } else {
5104 CmdArgs.push_back("--dynamic-linker");
5105 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5106 }
5107 }
5108
5109 if (Output.isFilename()) {
5110 CmdArgs.push_back("-o");
5111 CmdArgs.push_back(Output.getFilename());
5112 } else {
5113 assert(Output.isNothing() && "Invalid output.");
5114 }
5115
5116 if (!Args.hasArg(options::OPT_nostdlib) &&
5117 !Args.hasArg(options::OPT_nostartfiles)) {
5118 if (!Args.hasArg(options::OPT_shared)) {
5119 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5120 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00005121 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005122 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5123 } else {
5124 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall165329c2012-02-28 17:10:04 +00005125 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5126 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005127 }
Hans Wennborg76b86c22013-07-18 20:29:38 +00005128 if (getToolChain().getDriver().CCCIsCXX())
David Chisnalle6dd6832012-03-13 14:14:54 +00005129 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005130 }
5131
5132 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5133
5134 Args.AddAllArgs(CmdArgs, options::OPT_L);
5135 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5136 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall165329c2012-02-28 17:10:04 +00005137 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnall31c46902012-02-15 13:39:01 +00005138
5139 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5140
5141 if (!Args.hasArg(options::OPT_nostdlib) &&
5142 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005143 if (getToolChain().getDriver().CCCIsCXX())
David Chisnalle58e6f92012-04-10 11:49:50 +00005144 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnallb6229592012-02-15 18:24:31 +00005145 CmdArgs.push_back("-lgcc_s");
David Chisnall165329c2012-02-28 17:10:04 +00005146 if (!Args.hasArg(options::OPT_shared)) {
5147 CmdArgs.push_back("-lgcc");
David Chisnall31c46902012-02-15 13:39:01 +00005148 CmdArgs.push_back("-lc");
David Chisnall7dbefe12012-02-28 20:06:45 +00005149 CmdArgs.push_back("-lm");
David Chisnall165329c2012-02-28 17:10:04 +00005150 }
David Chisnall31c46902012-02-15 13:39:01 +00005151 }
5152
5153 if (!Args.hasArg(options::OPT_nostdlib) &&
5154 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall165329c2012-02-28 17:10:04 +00005155 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005156 }
David Chisnalld1ac03e2012-02-16 16:00:47 +00005157 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnall31c46902012-02-15 13:39:01 +00005158
5159 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5160
5161 const char *Exec =
5162 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5163 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5164}
5165
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005166void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005167 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00005168 const InputInfoList &Inputs,
5169 const ArgList &Args,
5170 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005171 ArgStringList CmdArgs;
5172
5173 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5174 options::OPT_Xassembler);
5175
5176 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005177 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005178
5179 for (InputInfoList::const_iterator
5180 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5181 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005182 CmdArgs.push_back(II.getFilename());
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005183 }
5184
5185 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005186 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005187 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005188}
5189
5190void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005191 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00005192 const InputInfoList &Inputs,
5193 const ArgList &Args,
5194 const char *LinkingOutput) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005195 ArgStringList CmdArgs;
5196
5197 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00005198 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005199 CmdArgs.push_back("-e");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005200 CmdArgs.push_back("_start");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005201 }
5202
5203 if (Args.hasArg(options::OPT_static)) {
5204 CmdArgs.push_back("-Bstatic");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005205 CmdArgs.push_back("-dn");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005206 } else {
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00005207// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005208 CmdArgs.push_back("-Bdynamic");
5209 if (Args.hasArg(options::OPT_shared)) {
5210 CmdArgs.push_back("-shared");
5211 } else {
Edward O'Callaghan3cecc192009-10-16 19:44:18 +00005212 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005213 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5214 }
5215 }
5216
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005217 if (Output.isFilename()) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005218 CmdArgs.push_back("-o");
5219 CmdArgs.push_back(Output.getFilename());
5220 } else {
5221 assert(Output.isNothing() && "Invalid output.");
5222 }
5223
5224 if (!Args.hasArg(options::OPT_nostdlib) &&
5225 !Args.hasArg(options::OPT_nostartfiles)) {
5226 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner38e317d2010-07-07 16:01:42 +00005227 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005228 getToolChain().GetFilePath("crt1.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005229 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005230 getToolChain().GetFilePath("crti.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005231 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005232 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005233 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005234 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005235 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005236 }
Chris Lattner38e317d2010-07-07 16:01:42 +00005237 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005238 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005239 }
5240
Daniel Dunbar294691e2009-11-04 06:24:38 +00005241 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5242 + getToolChain().getTripleString()
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00005243 + "/4.2.4"));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005244
5245 Args.AddAllArgs(CmdArgs, options::OPT_L);
5246 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5247 Args.AddAllArgs(CmdArgs, options::OPT_e);
5248
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005249 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005250
5251 if (!Args.hasArg(options::OPT_nostdlib) &&
5252 !Args.hasArg(options::OPT_nodefaultlibs)) {
5253 // FIXME: For some reason GCC passes -lgcc before adding
5254 // the default system libraries. Just mimic this for now.
5255 CmdArgs.push_back("-lgcc");
5256
5257 if (Args.hasArg(options::OPT_pthread))
5258 CmdArgs.push_back("-pthread");
5259 if (!Args.hasArg(options::OPT_shared))
5260 CmdArgs.push_back("-lc");
5261 CmdArgs.push_back("-lgcc");
5262 }
5263
5264 if (!Args.hasArg(options::OPT_nostdlib) &&
5265 !Args.hasArg(options::OPT_nostartfiles)) {
5266 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005267 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005268 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005269 }
5270
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005271 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005272
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005273 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005274 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005275 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghane7925a02009-08-22 01:06:46 +00005276}
5277
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005278void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005279 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005280 const InputInfoList &Inputs,
5281 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005282 const char *LinkingOutput) const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005283 ArgStringList CmdArgs;
5284
5285 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5286 options::OPT_Xassembler);
5287
5288 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005289 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005290
5291 for (InputInfoList::const_iterator
5292 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5293 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005294 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005295 }
5296
5297 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005298 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005299 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005300}
5301
5302void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005303 const InputInfo &Output,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005304 const InputInfoList &Inputs,
5305 const ArgList &Args,
5306 const char *LinkingOutput) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +00005307 const Driver &D = getToolChain().getDriver();
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005308 ArgStringList CmdArgs;
5309
Rafael Espindola6cc2a682012-12-31 22:41:36 +00005310 // Silence warning for "clang -g foo.o -o foo"
5311 Args.ClaimAllArgs(options::OPT_g_Group);
5312 // and "clang -emit-llvm foo.o -o foo"
5313 Args.ClaimAllArgs(options::OPT_emit_llvm);
5314 // and for "clang -w foo.o -o foo". Other warning options are already
5315 // handled somewhere else.
5316 Args.ClaimAllArgs(options::OPT_w);
5317
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005318 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar294691e2009-11-04 06:24:38 +00005319 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005320 CmdArgs.push_back("-e");
5321 CmdArgs.push_back("__start");
5322 }
5323
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005324 if (Args.hasArg(options::OPT_static)) {
5325 CmdArgs.push_back("-Bstatic");
5326 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005327 if (Args.hasArg(options::OPT_rdynamic))
5328 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005329 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005330 CmdArgs.push_back("-Bdynamic");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005331 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005332 CmdArgs.push_back("-shared");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005333 } else {
5334 CmdArgs.push_back("-dynamic-linker");
5335 CmdArgs.push_back("/usr/libexec/ld.so");
5336 }
5337 }
5338
Rafael Espindola9adba392013-06-05 04:28:55 +00005339 if (Args.hasArg(options::OPT_nopie))
5340 CmdArgs.push_back("-nopie");
5341
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005342 if (Output.isFilename()) {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005343 CmdArgs.push_back("-o");
5344 CmdArgs.push_back(Output.getFilename());
5345 } else {
5346 assert(Output.isNothing() && "Invalid output.");
5347 }
5348
5349 if (!Args.hasArg(options::OPT_nostdlib) &&
5350 !Args.hasArg(options::OPT_nostartfiles)) {
5351 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman62d829a2011-12-15 02:15:56 +00005352 if (Args.hasArg(options::OPT_pg))
5353 CmdArgs.push_back(Args.MakeArgString(
5354 getToolChain().GetFilePath("gcrt0.o")));
5355 else
5356 CmdArgs.push_back(Args.MakeArgString(
5357 getToolChain().GetFilePath("crt0.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00005358 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005359 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005360 } else {
Chris Lattner38e317d2010-07-07 16:01:42 +00005361 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005362 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005363 }
5364 }
5365
Edward O'Callaghane7e18202009-10-28 15:13:08 +00005366 std::string Triple = getToolChain().getTripleString();
5367 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar294691e2009-11-04 06:24:38 +00005368 Triple.replace(0, 6, "amd64");
Daniel Dunbarf7fb31f2009-10-29 02:24:37 +00005369 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbar95c04572010-08-01 23:13:54 +00005370 "/4.2.1"));
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005371
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005372 Args.AddAllArgs(CmdArgs, options::OPT_L);
5373 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5374 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindola6cc2a682012-12-31 22:41:36 +00005375 Args.AddAllArgs(CmdArgs, options::OPT_s);
5376 Args.AddAllArgs(CmdArgs, options::OPT_t);
5377 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5378 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005379
Daniel Dunbar2008fee2010-09-17 00:24:54 +00005380 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005381
5382 if (!Args.hasArg(options::OPT_nostdlib) &&
5383 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005384 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00005385 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman62d829a2011-12-15 02:15:56 +00005386 if (Args.hasArg(options::OPT_pg))
5387 CmdArgs.push_back("-lm_p");
5388 else
5389 CmdArgs.push_back("-lm");
Daniel Dunbar95c04572010-08-01 23:13:54 +00005390 }
5391
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005392 // FIXME: For some reason GCC passes -lgcc before adding
5393 // the default system libraries. Just mimic this for now.
5394 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005395
Eric Christopherdc6cc872012-09-13 06:32:34 +00005396 if (Args.hasArg(options::OPT_pthread)) {
5397 if (!Args.hasArg(options::OPT_shared) &&
5398 Args.hasArg(options::OPT_pg))
5399 CmdArgs.push_back("-lpthread_p");
5400 else
5401 CmdArgs.push_back("-lpthread");
5402 }
5403
Chandler Carruth657849c2011-12-17 22:32:42 +00005404 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherdc6cc872012-09-13 06:32:34 +00005405 if (Args.hasArg(options::OPT_pg))
Eli Friedman62d829a2011-12-15 02:15:56 +00005406 CmdArgs.push_back("-lc_p");
5407 else
5408 CmdArgs.push_back("-lc");
Chandler Carruth657849c2011-12-17 22:32:42 +00005409 }
Eric Christopherdc6cc872012-09-13 06:32:34 +00005410
Daniel Dunbar2bbcf662009-08-03 01:28:59 +00005411 CmdArgs.push_back("-lgcc");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005412 }
5413
5414 if (!Args.hasArg(options::OPT_nostdlib) &&
5415 !Args.hasArg(options::OPT_nostartfiles)) {
5416 if (!Args.hasArg(options::OPT_shared))
Chris Lattner38e317d2010-07-07 16:01:42 +00005417 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005418 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005419 else
Chris Lattner38e317d2010-07-07 16:01:42 +00005420 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005421 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005422 }
5423
5424 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005425 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005426 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00005427}
Ed Schoutenc66a5a32009-04-02 19:13:12 +00005428
Eli Friedman42f74f22012-08-08 23:57:20 +00005429void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5430 const InputInfo &Output,
5431 const InputInfoList &Inputs,
5432 const ArgList &Args,
5433 const char *LinkingOutput) const {
5434 ArgStringList CmdArgs;
5435
5436 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5437 options::OPT_Xassembler);
5438
5439 CmdArgs.push_back("-o");
5440 CmdArgs.push_back(Output.getFilename());
5441
5442 for (InputInfoList::const_iterator
5443 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5444 const InputInfo &II = *it;
5445 CmdArgs.push_back(II.getFilename());
5446 }
5447
5448 const char *Exec =
5449 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5450 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5451}
5452
5453void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5454 const InputInfo &Output,
5455 const InputInfoList &Inputs,
5456 const ArgList &Args,
5457 const char *LinkingOutput) const {
5458 const Driver &D = getToolChain().getDriver();
5459 ArgStringList CmdArgs;
5460
5461 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5462 (!Args.hasArg(options::OPT_shared))) {
5463 CmdArgs.push_back("-e");
5464 CmdArgs.push_back("__start");
5465 }
5466
5467 if (Args.hasArg(options::OPT_static)) {
5468 CmdArgs.push_back("-Bstatic");
5469 } else {
5470 if (Args.hasArg(options::OPT_rdynamic))
5471 CmdArgs.push_back("-export-dynamic");
5472 CmdArgs.push_back("--eh-frame-hdr");
5473 CmdArgs.push_back("-Bdynamic");
5474 if (Args.hasArg(options::OPT_shared)) {
5475 CmdArgs.push_back("-shared");
5476 } else {
5477 CmdArgs.push_back("-dynamic-linker");
5478 CmdArgs.push_back("/usr/libexec/ld.so");
5479 }
5480 }
5481
5482 if (Output.isFilename()) {
5483 CmdArgs.push_back("-o");
5484 CmdArgs.push_back(Output.getFilename());
5485 } else {
5486 assert(Output.isNothing() && "Invalid output.");
5487 }
5488
5489 if (!Args.hasArg(options::OPT_nostdlib) &&
5490 !Args.hasArg(options::OPT_nostartfiles)) {
5491 if (!Args.hasArg(options::OPT_shared)) {
5492 if (Args.hasArg(options::OPT_pg))
5493 CmdArgs.push_back(Args.MakeArgString(
5494 getToolChain().GetFilePath("gcrt0.o")));
5495 else
5496 CmdArgs.push_back(Args.MakeArgString(
5497 getToolChain().GetFilePath("crt0.o")));
5498 CmdArgs.push_back(Args.MakeArgString(
5499 getToolChain().GetFilePath("crtbegin.o")));
5500 } else {
5501 CmdArgs.push_back(Args.MakeArgString(
5502 getToolChain().GetFilePath("crtbeginS.o")));
5503 }
5504 }
5505
5506 Args.AddAllArgs(CmdArgs, options::OPT_L);
5507 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5508 Args.AddAllArgs(CmdArgs, options::OPT_e);
5509
5510 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5511
5512 if (!Args.hasArg(options::OPT_nostdlib) &&
5513 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005514 if (D.CCCIsCXX()) {
Eli Friedman42f74f22012-08-08 23:57:20 +00005515 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5516 if (Args.hasArg(options::OPT_pg))
5517 CmdArgs.push_back("-lm_p");
5518 else
5519 CmdArgs.push_back("-lm");
5520 }
5521
Rafael Espindola3667bbe2012-10-23 17:07:31 +00005522 if (Args.hasArg(options::OPT_pthread)) {
5523 if (!Args.hasArg(options::OPT_shared) &&
5524 Args.hasArg(options::OPT_pg))
5525 CmdArgs.push_back("-lpthread_p");
5526 else
5527 CmdArgs.push_back("-lpthread");
5528 }
5529
Eli Friedman42f74f22012-08-08 23:57:20 +00005530 if (!Args.hasArg(options::OPT_shared)) {
5531 if (Args.hasArg(options::OPT_pg))
5532 CmdArgs.push_back("-lc_p");
5533 else
5534 CmdArgs.push_back("-lc");
5535 }
5536
Benjamin Kramer39e4b0f2013-10-21 12:33:55 +00005537 StringRef MyArch;
5538 switch (getToolChain().getTriple().getArch()) {
5539 case llvm::Triple::arm:
5540 MyArch = "arm";
5541 break;
5542 case llvm::Triple::x86:
5543 MyArch = "i386";
5544 break;
5545 case llvm::Triple::x86_64:
5546 MyArch = "amd64";
5547 break;
5548 default:
5549 llvm_unreachable("Unsupported architecture");
5550 }
5551 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman42f74f22012-08-08 23:57:20 +00005552 }
5553
5554 if (!Args.hasArg(options::OPT_nostdlib) &&
5555 !Args.hasArg(options::OPT_nostartfiles)) {
5556 if (!Args.hasArg(options::OPT_shared))
5557 CmdArgs.push_back(Args.MakeArgString(
5558 getToolChain().GetFilePath("crtend.o")));
5559 else
5560 CmdArgs.push_back(Args.MakeArgString(
5561 getToolChain().GetFilePath("crtendS.o")));
5562 }
Eli Friedmanc9c48db2012-08-09 22:42:04 +00005563
5564 const char *Exec =
5565 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5566 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman42f74f22012-08-08 23:57:20 +00005567}
5568
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005569void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005570 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005571 const InputInfoList &Inputs,
5572 const ArgList &Args,
Mike Stump1eb44332009-09-09 15:08:12 +00005573 const char *LinkingOutput) const {
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005574 ArgStringList CmdArgs;
5575
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005576 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5577 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc55da4b2012-09-05 21:32:44 +00005578 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005579 CmdArgs.push_back("--32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005580 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky3393cef2011-06-04 07:37:31 +00005581 CmdArgs.push_back("-a32");
Eric Christopherc55da4b2012-09-05 21:32:44 +00005582 else if (getToolChain().getArch() == llvm::Triple::mips ||
5583 getToolChain().getArch() == llvm::Triple::mipsel ||
5584 getToolChain().getArch() == llvm::Triple::mips64 ||
5585 getToolChain().getArch() == llvm::Triple::mips64el) {
5586 StringRef CPUName;
5587 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00005588 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer20249a12010-10-21 03:16:25 +00005589
Eric Christopherc55da4b2012-09-05 21:32:44 +00005590 CmdArgs.push_back("-march");
5591 CmdArgs.push_back(CPUName.data());
5592
Eric Christopherc55da4b2012-09-05 21:32:44 +00005593 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00005594 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc55da4b2012-09-05 21:32:44 +00005595
5596 if (getToolChain().getArch() == llvm::Triple::mips ||
5597 getToolChain().getArch() == llvm::Triple::mips64)
5598 CmdArgs.push_back("-EB");
5599 else
5600 CmdArgs.push_back("-EL");
5601
5602 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5603 options::OPT_fpic, options::OPT_fno_pic,
5604 options::OPT_fPIE, options::OPT_fno_PIE,
5605 options::OPT_fpie, options::OPT_fno_pie);
5606 if (LastPICArg &&
5607 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5608 LastPICArg->getOption().matches(options::OPT_fpic) ||
5609 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5610 LastPICArg->getOption().matches(options::OPT_fpie))) {
5611 CmdArgs.push_back("-KPIC");
5612 }
Rafael Espindola27fa2362012-12-13 04:17:14 +00005613 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5614 getToolChain().getArch() == llvm::Triple::thumb) {
5615 CmdArgs.push_back("-mfpu=softvfp");
5616 switch(getToolChain().getTriple().getEnvironment()) {
5617 case llvm::Triple::GNUEABI:
5618 case llvm::Triple::EABI:
Anton Korobeynikovb234e742013-03-18 07:59:20 +00005619 CmdArgs.push_back("-meabi=5");
Rafael Espindola27fa2362012-12-13 04:17:14 +00005620 break;
5621
5622 default:
5623 CmdArgs.push_back("-matpcs");
5624 }
Eric Christopherc55da4b2012-09-05 21:32:44 +00005625 }
Eric Christophered734732010-03-02 02:41:08 +00005626
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005627 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5628 options::OPT_Xassembler);
5629
5630 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005631 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005632
5633 for (InputInfoList::const_iterator
5634 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5635 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005636 CmdArgs.push_back(II.getFilename());
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005637 }
5638
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005639 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00005640 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005641 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar68a31d42009-03-31 17:45:15 +00005642}
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005643
5644void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005645 const InputInfo &Output,
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005646 const InputInfoList &Inputs,
5647 const ArgList &Args,
Daniel Dunbara8304f62009-05-02 20:14:53 +00005648 const char *LinkingOutput) const {
Roman Divacky94380162012-08-28 15:09:03 +00005649 const toolchains::FreeBSD& ToolChain =
5650 static_cast<const toolchains::FreeBSD&>(getToolChain());
5651 const Driver &D = ToolChain.getDriver();
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005652 ArgStringList CmdArgs;
David Chisnalldfa210b2012-07-29 15:24:44 +00005653
5654 // Silence warning for "clang -g foo.o -o foo"
5655 Args.ClaimAllArgs(options::OPT_g_Group);
5656 // and "clang -emit-llvm foo.o -o foo"
5657 Args.ClaimAllArgs(options::OPT_emit_llvm);
5658 // and for "clang -w foo.o -o foo". Other warning options are already
5659 // handled somewhere else.
5660 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005661
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005662 if (!D.SysRoot.empty())
5663 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5664
Roman Divacky94380162012-08-28 15:09:03 +00005665 if (Args.hasArg(options::OPT_pie))
5666 CmdArgs.push_back("-pie");
5667
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005668 if (Args.hasArg(options::OPT_static)) {
5669 CmdArgs.push_back("-Bstatic");
5670 } else {
Rafael Espindola65ba55d2010-11-11 02:17:51 +00005671 if (Args.hasArg(options::OPT_rdynamic))
5672 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005673 CmdArgs.push_back("--eh-frame-hdr");
5674 if (Args.hasArg(options::OPT_shared)) {
5675 CmdArgs.push_back("-Bshareable");
5676 } else {
5677 CmdArgs.push_back("-dynamic-linker");
5678 CmdArgs.push_back("/libexec/ld-elf.so.1");
5679 }
Roman Divacky94380162012-08-28 15:09:03 +00005680 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5681 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnalldfa210b2012-07-29 15:24:44 +00005682 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5683 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5684 CmdArgs.push_back("--hash-style=both");
5685 }
5686 }
5687 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005688 }
5689
5690 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5691 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005692 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005693 CmdArgs.push_back("-m");
5694 CmdArgs.push_back("elf_i386_fbsd");
5695 }
5696
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005697 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky000a6552011-06-04 07:40:24 +00005698 CmdArgs.push_back("-m");
Roman Divacky1052c1d2011-11-21 16:50:32 +00005699 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky000a6552011-06-04 07:40:24 +00005700 }
5701
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00005702 if (Output.isFilename()) {
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005703 CmdArgs.push_back("-o");
5704 CmdArgs.push_back(Output.getFilename());
5705 } else {
5706 assert(Output.isNothing() && "Invalid output.");
5707 }
5708
5709 if (!Args.hasArg(options::OPT_nostdlib) &&
5710 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divacky94380162012-08-28 15:09:03 +00005711 const char *crt1 = NULL;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005712 if (!Args.hasArg(options::OPT_shared)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005713 if (Args.hasArg(options::OPT_pg))
Roman Divacky94380162012-08-28 15:09:03 +00005714 crt1 = "gcrt1.o";
5715 else if (Args.hasArg(options::OPT_pie))
5716 crt1 = "Scrt1.o";
5717 else
5718 crt1 = "crt1.o";
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005719 }
Roman Divacky94380162012-08-28 15:09:03 +00005720 if (crt1)
5721 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5722
5723 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5724
5725 const char *crtbegin = NULL;
5726 if (Args.hasArg(options::OPT_static))
5727 crtbegin = "crtbeginT.o";
5728 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5729 crtbegin = "crtbeginS.o";
5730 else
5731 crtbegin = "crtbegin.o";
5732
5733 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005734 }
5735
5736 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divacky94380162012-08-28 15:09:03 +00005737 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divacky58e5ac92011-03-01 17:53:14 +00005738 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5739 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00005740 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005741 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5742 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnallc7363772010-08-15 22:58:12 +00005743 Args.AddAllArgs(CmdArgs, options::OPT_s);
5744 Args.AddAllArgs(CmdArgs, options::OPT_t);
5745 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5746 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005747
Roman Divacky94380162012-08-28 15:09:03 +00005748 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005749
5750 if (!Args.hasArg(options::OPT_nostdlib) &&
5751 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005752 if (D.CCCIsCXX()) {
Roman Divacky94380162012-08-28 15:09:03 +00005753 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divackyc16bb762011-02-10 16:59:40 +00005754 if (Args.hasArg(options::OPT_pg))
5755 CmdArgs.push_back("-lm_p");
5756 else
5757 CmdArgs.push_back("-lm");
Daniel Dunbar20022632010-02-17 08:07:51 +00005758 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005759 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5760 // the default system libraries. Just mimic this for now.
Roman Divackyc16bb762011-02-10 16:59:40 +00005761 if (Args.hasArg(options::OPT_pg))
5762 CmdArgs.push_back("-lgcc_p");
5763 else
5764 CmdArgs.push_back("-lgcc");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005765 if (Args.hasArg(options::OPT_static)) {
5766 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005767 } else if (Args.hasArg(options::OPT_pg)) {
5768 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005769 } else {
5770 CmdArgs.push_back("--as-needed");
5771 CmdArgs.push_back("-lgcc_s");
5772 CmdArgs.push_back("--no-as-needed");
5773 }
5774
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005775 if (Args.hasArg(options::OPT_pthread)) {
Roman Divackyc16bb762011-02-10 16:59:40 +00005776 if (Args.hasArg(options::OPT_pg))
5777 CmdArgs.push_back("-lpthread_p");
5778 else
5779 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay24230262011-02-10 20:35:01 +00005780 }
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005781
Roman Divackyc16bb762011-02-10 16:59:40 +00005782 if (Args.hasArg(options::OPT_pg)) {
5783 if (Args.hasArg(options::OPT_shared))
5784 CmdArgs.push_back("-lc");
5785 else
5786 CmdArgs.push_back("-lc_p");
5787 CmdArgs.push_back("-lgcc_p");
5788 } else {
5789 CmdArgs.push_back("-lc");
5790 CmdArgs.push_back("-lgcc");
5791 }
5792
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005793 if (Args.hasArg(options::OPT_static)) {
5794 CmdArgs.push_back("-lgcc_eh");
Roman Divackyc16bb762011-02-10 16:59:40 +00005795 } else if (Args.hasArg(options::OPT_pg)) {
5796 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005797 } else {
5798 CmdArgs.push_back("--as-needed");
5799 CmdArgs.push_back("-lgcc_s");
5800 CmdArgs.push_back("--no-as-needed");
5801 }
5802 }
5803
5804 if (!Args.hasArg(options::OPT_nostdlib) &&
5805 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyf6513812012-09-07 13:36:21 +00005806 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divacky94380162012-08-28 15:09:03 +00005807 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackyf6513812012-09-07 13:36:21 +00005808 else
5809 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divacky94380162012-08-28 15:09:03 +00005810 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005811 }
5812
Roman Divacky94380162012-08-28 15:09:03 +00005813 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005814
Daniel Dunbarc21c4852009-04-08 23:54:23 +00005815 const char *Exec =
Roman Divacky94380162012-08-28 15:09:03 +00005816 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00005817 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar008f54a2009-04-01 19:36:32 +00005818}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00005819
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005820void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5821 const InputInfo &Output,
5822 const InputInfoList &Inputs,
5823 const ArgList &Args,
5824 const char *LinkingOutput) const {
5825 ArgStringList CmdArgs;
5826
5827 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5828 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005829 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005830 CmdArgs.push_back("--32");
5831
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005832 // Set byte order explicitly
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005833 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005834 CmdArgs.push_back("-EB");
Rafael Espindola64f7ad92012-10-07 04:44:33 +00005835 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005836 CmdArgs.push_back("-EL");
5837
5838 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5839 options::OPT_Xassembler);
5840
5841 CmdArgs.push_back("-o");
5842 CmdArgs.push_back(Output.getFilename());
5843
5844 for (InputInfoList::const_iterator
5845 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5846 const InputInfo &II = *it;
5847 CmdArgs.push_back(II.getFilename());
5848 }
5849
David Chisnall5adcec12011-09-27 22:03:18 +00005850 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005851 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5852}
5853
5854void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5855 const InputInfo &Output,
5856 const InputInfoList &Inputs,
5857 const ArgList &Args,
5858 const char *LinkingOutput) const {
5859 const Driver &D = getToolChain().getDriver();
5860 ArgStringList CmdArgs;
5861
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00005862 if (!D.SysRoot.empty())
5863 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5864
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005865 if (Args.hasArg(options::OPT_static)) {
5866 CmdArgs.push_back("-Bstatic");
5867 } else {
5868 if (Args.hasArg(options::OPT_rdynamic))
5869 CmdArgs.push_back("-export-dynamic");
5870 CmdArgs.push_back("--eh-frame-hdr");
5871 if (Args.hasArg(options::OPT_shared)) {
5872 CmdArgs.push_back("-Bshareable");
5873 } else {
5874 CmdArgs.push_back("-dynamic-linker");
5875 CmdArgs.push_back("/libexec/ld.elf_so");
5876 }
5877 }
5878
5879 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5880 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00005881 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005882 CmdArgs.push_back("-m");
5883 CmdArgs.push_back("elf_i386");
5884 }
5885
5886 if (Output.isFilename()) {
5887 CmdArgs.push_back("-o");
5888 CmdArgs.push_back(Output.getFilename());
5889 } else {
5890 assert(Output.isNothing() && "Invalid output.");
5891 }
5892
5893 if (!Args.hasArg(options::OPT_nostdlib) &&
5894 !Args.hasArg(options::OPT_nostartfiles)) {
5895 if (!Args.hasArg(options::OPT_shared)) {
5896 CmdArgs.push_back(Args.MakeArgString(
5897 getToolChain().GetFilePath("crt0.o")));
5898 CmdArgs.push_back(Args.MakeArgString(
5899 getToolChain().GetFilePath("crti.o")));
5900 CmdArgs.push_back(Args.MakeArgString(
5901 getToolChain().GetFilePath("crtbegin.o")));
5902 } else {
5903 CmdArgs.push_back(Args.MakeArgString(
5904 getToolChain().GetFilePath("crti.o")));
5905 CmdArgs.push_back(Args.MakeArgString(
5906 getToolChain().GetFilePath("crtbeginS.o")));
5907 }
5908 }
5909
5910 Args.AddAllArgs(CmdArgs, options::OPT_L);
5911 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5912 Args.AddAllArgs(CmdArgs, options::OPT_e);
5913 Args.AddAllArgs(CmdArgs, options::OPT_s);
5914 Args.AddAllArgs(CmdArgs, options::OPT_t);
5915 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5916 Args.AddAllArgs(CmdArgs, options::OPT_r);
5917
5918 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5919
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00005920 unsigned Major, Minor, Micro;
5921 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
5922 bool useLibgcc = true;
5923 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
5924 if (getToolChain().getArch() == llvm::Triple::x86 ||
5925 getToolChain().getArch() == llvm::Triple::x86_64)
5926 useLibgcc = false;
5927 }
5928
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005929 if (!Args.hasArg(options::OPT_nostdlib) &&
5930 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00005931 if (D.CCCIsCXX()) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005932 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5933 CmdArgs.push_back("-lm");
5934 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005935 if (Args.hasArg(options::OPT_pthread))
5936 CmdArgs.push_back("-lpthread");
5937 CmdArgs.push_back("-lc");
5938
Joerg Sonnenbergere69cca42013-10-14 20:13:05 +00005939 if (useLibgcc) {
5940 if (Args.hasArg(options::OPT_static)) {
5941 // libgcc_eh depends on libc, so resolve as much as possible,
5942 // pull in any new requirements from libc and then get the rest
5943 // of libgcc.
5944 CmdArgs.push_back("-lgcc_eh");
5945 CmdArgs.push_back("-lc");
5946 CmdArgs.push_back("-lgcc");
5947 } else {
5948 CmdArgs.push_back("-lgcc");
5949 CmdArgs.push_back("--as-needed");
5950 CmdArgs.push_back("-lgcc_s");
5951 CmdArgs.push_back("--no-as-needed");
5952 }
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005953 }
5954 }
5955
5956 if (!Args.hasArg(options::OPT_nostdlib) &&
5957 !Args.hasArg(options::OPT_nostartfiles)) {
5958 if (!Args.hasArg(options::OPT_shared))
5959 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5960 "crtend.o")));
5961 else
5962 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5963 "crtendS.o")));
5964 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5965 "crtn.o")));
5966 }
5967
Bill Wendling3f4be6f2011-06-27 19:15:03 +00005968 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00005969
David Chisnall5adcec12011-09-27 22:03:18 +00005970 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer8e50a962011-02-02 18:59:27 +00005971 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5972}
5973
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00005974void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5975 const InputInfo &Output,
5976 const InputInfoList &Inputs,
5977 const ArgList &Args,
5978 const char *LinkingOutput) const {
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005979 ArgStringList CmdArgs;
5980
5981 // Add --32/--64 to make sure we get the format we want.
5982 // This is incomplete
5983 if (getToolChain().getArch() == llvm::Triple::x86) {
5984 CmdArgs.push_back("--32");
5985 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5986 CmdArgs.push_back("--64");
Eli Friedman7972c882011-11-28 23:46:52 +00005987 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5988 CmdArgs.push_back("-a32");
5989 CmdArgs.push_back("-mppc");
5990 CmdArgs.push_back("-many");
5991 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5992 CmdArgs.push_back("-a64");
5993 CmdArgs.push_back("-mppc64");
5994 CmdArgs.push_back("-many");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00005995 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
5996 CmdArgs.push_back("-a64");
5997 CmdArgs.push_back("-mppc64le");
5998 CmdArgs.push_back("-many");
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00005999 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00006000 StringRef MArch = getToolChain().getArchName();
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006001 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6002 CmdArgs.push_back("-mfpu=neon");
Bernard Ogden80e90c22013-10-24 18:32:41 +00006003 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a")
6004 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanov700c5082012-04-20 09:03:40 +00006005
6006 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
6007 getToolChain().getTriple());
6008 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanoveca187e2012-04-24 09:05:31 +00006009
6010 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
6011 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
6012 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanakac85900f2011-11-30 19:31:38 +00006013 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6014 getToolChain().getArch() == llvm::Triple::mipsel ||
6015 getToolChain().getArch() == llvm::Triple::mips64 ||
6016 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan073a7802012-04-07 22:31:29 +00006017 StringRef CPUName;
6018 StringRef ABIName;
Rafael Espindolab330e402013-08-20 22:12:08 +00006019 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanakac85900f2011-11-30 19:31:38 +00006020
Simon Atanasyan073a7802012-04-07 22:31:29 +00006021 CmdArgs.push_back("-march");
6022 CmdArgs.push_back(CPUName.data());
6023
Simon Atanasyan073a7802012-04-07 22:31:29 +00006024 CmdArgs.push_back("-mabi");
Simon Atanasyane9616a42013-02-27 14:55:49 +00006025 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan5f0a1c12012-04-06 19:15:24 +00006026
6027 if (getToolChain().getArch() == llvm::Triple::mips ||
6028 getToolChain().getArch() == llvm::Triple::mips64)
6029 CmdArgs.push_back("-EB");
6030 else
6031 CmdArgs.push_back("-EL");
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00006032
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00006033 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6034 if (StringRef(A->getValue()) == "2008")
6035 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6036 }
6037
Simon Atanasyan9dbfc612013-04-30 07:47:13 +00006038 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6039 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6040 options::OPT_mno_micromips);
6041 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6042 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6043
Simon Atanasyan1f0646e2012-05-29 19:07:33 +00006044 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6045 options::OPT_fpic, options::OPT_fno_pic,
6046 options::OPT_fPIE, options::OPT_fno_PIE,
6047 options::OPT_fpie, options::OPT_fno_pie);
6048 if (LastPICArg &&
6049 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6050 LastPICArg->getOption().matches(options::OPT_fpic) ||
6051 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6052 LastPICArg->getOption().matches(options::OPT_fpie))) {
6053 CmdArgs.push_back("-KPIC");
6054 }
Ulrich Weigandb8409212013-05-06 16:26:41 +00006055 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00006056 // Always pass an -march option, since our default of z10 is later
6057 // than the GNU assembler's default.
6058 StringRef CPUName = getSystemZTargetCPU(Args);
6059 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006060 }
6061
6062 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6063 options::OPT_Xassembler);
6064
6065 CmdArgs.push_back("-o");
6066 CmdArgs.push_back(Output.getFilename());
6067
6068 for (InputInfoList::const_iterator
6069 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6070 const InputInfo &II = *it;
6071 CmdArgs.push_back(II.getFilename());
6072 }
6073
6074 const char *Exec =
6075 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6076 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopherc47b6f32013-06-05 23:58:15 +00006077
6078 // Handle the debug info splitting at object creation time if we're
6079 // creating an object.
6080 // TODO: Currently only works on linux with newer objcopy.
6081 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani57b1da12013-09-14 01:09:11 +00006082 getToolChain().getTriple().isOSLinux())
Eric Christopherc47b6f32013-06-05 23:58:15 +00006083 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6084 SplitDebugName(Args, Inputs));
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006085}
6086
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006087static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6088 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chien94a71422012-09-02 09:30:11 +00006089 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth68f94db2013-03-04 02:07:55 +00006090 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6091 Args.hasArg(options::OPT_static);
Hans Wennborg76b86c22013-07-18 20:29:38 +00006092 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006093 CmdArgs.push_back("-lgcc");
6094
Logan Chien529a73d2012-11-19 12:04:11 +00006095 if (StaticLibgcc || isAndroid) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006096 if (D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006097 CmdArgs.push_back("-lgcc");
6098 } else {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006099 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006100 CmdArgs.push_back("--as-needed");
6101 CmdArgs.push_back("-lgcc_s");
Hans Wennborg76b86c22013-07-18 20:29:38 +00006102 if (!D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006103 CmdArgs.push_back("--no-as-needed");
6104 }
6105
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006106 if (StaticLibgcc && !isAndroid)
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006107 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg76b86c22013-07-18 20:29:38 +00006108 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006109 CmdArgs.push_back("-lgcc");
Logan Chien529a73d2012-11-19 12:04:11 +00006110
6111 // According to Android ABI, we have to link with libdl if we are
6112 // linking with non-static libgcc.
6113 //
6114 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6115 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6116 if (isAndroid && !StaticLibgcc)
6117 CmdArgs.push_back("-ldl");
Rafael Espindolaabf3ac72011-10-17 21:39:04 +00006118}
6119
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00006120static bool hasMipsN32ABIArg(const ArgList &Args) {
6121 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smith1d489cf2012-11-01 04:30:05 +00006122 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00006123}
6124
Peter Collingbournebdaa1342013-05-27 21:40:20 +00006125static StringRef getLinuxDynamicLinker(const ArgList &Args,
6126 const toolchains::Linux &ToolChain) {
6127 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6128 return "/system/bin/linker";
6129 else if (ToolChain.getArch() == llvm::Triple::x86)
6130 return "/lib/ld-linux.so.2";
6131 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6132 return "/lib/ld-linux-aarch64.so.1";
6133 else if (ToolChain.getArch() == llvm::Triple::arm ||
6134 ToolChain.getArch() == llvm::Triple::thumb) {
6135 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6136 return "/lib/ld-linux-armhf.so.3";
6137 else
6138 return "/lib/ld-linux.so.3";
6139 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6140 ToolChain.getArch() == llvm::Triple::mipsel)
6141 return "/lib/ld.so.1";
6142 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6143 ToolChain.getArch() == llvm::Triple::mips64el) {
6144 if (hasMipsN32ABIArg(Args))
6145 return "/lib32/ld.so.1";
6146 else
6147 return "/lib64/ld.so.1";
6148 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6149 return "/lib/ld.so.1";
6150 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00006151 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbournebdaa1342013-05-27 21:40:20 +00006152 ToolChain.getArch() == llvm::Triple::systemz)
6153 return "/lib64/ld64.so.1";
6154 else
6155 return "/lib64/ld-linux-x86-64.so.2";
6156}
6157
Thomas Schwinge577bb0a2013-03-28 19:04:25 +00006158void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6159 const InputInfo &Output,
6160 const InputInfoList &Inputs,
6161 const ArgList &Args,
6162 const char *LinkingOutput) const {
Rafael Espindolac1da9812010-11-07 20:14:31 +00006163 const toolchains::Linux& ToolChain =
6164 static_cast<const toolchains::Linux&>(getToolChain());
6165 const Driver &D = ToolChain.getDriver();
Rafael Espindola715852c2012-11-02 20:41:30 +00006166 const bool isAndroid =
6167 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Alexey Samsonov1b8f12d2013-08-19 09:14:21 +00006168 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006169 const bool IsPIE =
6170 !Args.hasArg(options::OPT_shared) &&
Alexey Samsonov8bdc92c2013-08-09 07:42:13 +00006171 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow(ToolChain));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006172
Rafael Espindolac1da9812010-11-07 20:14:31 +00006173 ArgStringList CmdArgs;
6174
Rafael Espindola26f14c32010-11-15 18:28:16 +00006175 // Silence warning for "clang -g foo.o -o foo"
6176 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindola9c094fb2011-03-01 05:25:27 +00006177 // and "clang -emit-llvm foo.o -o foo"
6178 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnalldfa210b2012-07-29 15:24:44 +00006179 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindola7f6458b2010-11-17 20:37:10 +00006180 // handled somewhere else.
6181 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindola26f14c32010-11-15 18:28:16 +00006182
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006183 if (!D.SysRoot.empty())
6184 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006185
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006186 if (IsPIE)
Rafael Espindolafdda1712010-11-17 22:26:15 +00006187 CmdArgs.push_back("-pie");
6188
Rafael Espindoladc1b76d2010-11-07 22:57:16 +00006189 if (Args.hasArg(options::OPT_rdynamic))
6190 CmdArgs.push_back("-export-dynamic");
6191
Rafael Espindolae0e6d3b2010-11-11 19:34:42 +00006192 if (Args.hasArg(options::OPT_s))
6193 CmdArgs.push_back("-s");
6194
Rafael Espindolac1da9812010-11-07 20:14:31 +00006195 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6196 e = ToolChain.ExtraOpts.end();
6197 i != e; ++i)
6198 CmdArgs.push_back(i->c_str());
6199
6200 if (!Args.hasArg(options::OPT_static)) {
6201 CmdArgs.push_back("--eh-frame-hdr");
6202 }
6203
6204 CmdArgs.push_back("-m");
6205 if (ToolChain.getArch() == llvm::Triple::x86)
6206 CmdArgs.push_back("elf_i386");
Tim Northoverc264e162013-01-31 12:13:10 +00006207 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6208 CmdArgs.push_back("aarch64linux");
Eric Christopher88b7cf02011-08-19 00:30:14 +00006209 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregorf0594d82011-03-06 19:11:49 +00006210 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00006211 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43ac2972011-04-05 22:04:27 +00006212 else if (ToolChain.getArch() == llvm::Triple::ppc)
6213 CmdArgs.push_back("elf32ppclinux");
6214 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6215 CmdArgs.push_back("elf64ppc");
Eli Friedman5bea4f62011-11-08 19:43:37 +00006216 else if (ToolChain.getArch() == llvm::Triple::mips)
6217 CmdArgs.push_back("elf32btsmip");
6218 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6219 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyanf4bd3292012-10-21 11:44:57 +00006220 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6221 if (hasMipsN32ABIArg(Args))
6222 CmdArgs.push_back("elf32btsmipn32");
6223 else
6224 CmdArgs.push_back("elf64btsmip");
6225 }
6226 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6227 if (hasMipsN32ABIArg(Args))
6228 CmdArgs.push_back("elf32ltsmipn32");
6229 else
6230 CmdArgs.push_back("elf64ltsmip");
6231 }
Ulrich Weigandb8409212013-05-06 16:26:41 +00006232 else if (ToolChain.getArch() == llvm::Triple::systemz)
6233 CmdArgs.push_back("elf64_s390");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006234 else
6235 CmdArgs.push_back("elf_x86_64");
6236
6237 if (Args.hasArg(options::OPT_static)) {
Douglas Gregorf0594d82011-03-06 19:11:49 +00006238 if (ToolChain.getArch() == llvm::Triple::arm
6239 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00006240 CmdArgs.push_back("-Bstatic");
6241 else
6242 CmdArgs.push_back("-static");
6243 } else if (Args.hasArg(options::OPT_shared)) {
6244 CmdArgs.push_back("-shared");
Rafael Espindola715852c2012-11-02 20:41:30 +00006245 if (isAndroid) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006246 CmdArgs.push_back("-Bsymbolic");
6247 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006248 }
6249
6250 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregorf0594d82011-03-06 19:11:49 +00006251 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac1da9812010-11-07 20:14:31 +00006252 (!Args.hasArg(options::OPT_static) &&
6253 !Args.hasArg(options::OPT_shared))) {
6254 CmdArgs.push_back("-dynamic-linker");
Peter Collingbournebdaa1342013-05-27 21:40:20 +00006255 CmdArgs.push_back(Args.MakeArgString(
6256 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006257 }
6258
6259 CmdArgs.push_back("-o");
6260 CmdArgs.push_back(Output.getFilename());
6261
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006262 if (!Args.hasArg(options::OPT_nostdlib) &&
6263 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006264 if (!isAndroid) {
6265 const char *crt1 = NULL;
6266 if (!Args.hasArg(options::OPT_shared)){
Eric Christopher61f08682013-06-07 23:25:01 +00006267 if (Args.hasArg(options::OPT_pg))
6268 crt1 = "gcrt1.o";
6269 else if (IsPIE)
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006270 crt1 = "Scrt1.o";
6271 else
6272 crt1 = "crt1.o";
6273 }
6274 if (crt1)
6275 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006276
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006277 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6278 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006279
Rafael Espindola89414b32010-11-12 03:00:39 +00006280 const char *crtbegin;
6281 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006282 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006283 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006284 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006285 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006286 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006287 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006288 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006289 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramere20e5082012-10-04 19:42:20 +00006290
6291 // Add crtfastmath.o if available and fast math is enabled.
6292 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola89414b32010-11-12 03:00:39 +00006293 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006294
6295 Args.AddAllArgs(CmdArgs, options::OPT_L);
6296
6297 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6298
Roman Divacky58e5ac92011-03-01 17:53:14 +00006299 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6300 i != e; ++i)
Chris Lattner5f9e2722011-07-23 10:55:15 +00006301 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac1da9812010-11-07 20:14:31 +00006302
Rafael Espindolac5151542012-04-09 23:53:34 +00006303 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6304 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6305 // forward.
Rafael Espindola6155fbe2013-09-04 19:37:35 +00006306 if (D.IsUsingLTO(Args)) {
Rafael Espindolac5151542012-04-09 23:53:34 +00006307 CmdArgs.push_back("-plugin");
6308 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6309 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth700d4e42013-01-13 11:46:33 +00006310
6311 // Try to pass driver level flags relevant to LTO code generation down to
6312 // the plugin.
6313
Rafael Espindolab330e402013-08-20 22:12:08 +00006314 // Handle flags for selecting CPU variants.
6315 std::string CPU = getCPUName(Args, ToolChain.getTriple());
6316 if (!CPU.empty()) {
Chandler Carruth700d4e42013-01-13 11:46:33 +00006317 CmdArgs.push_back(
Rafael Espindolab330e402013-08-20 22:12:08 +00006318 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6319 CPU));
6320 }
Rafael Espindolac5151542012-04-09 23:53:34 +00006321 }
6322
Chandler Carruth700d4e42013-01-13 11:46:33 +00006323
Nick Lewyckye276cfc2012-08-17 03:39:16 +00006324 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6325 CmdArgs.push_back("--no-demangle");
6326
Rafael Espindolac1da9812010-11-07 20:14:31 +00006327 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6328
Eric Christopher6716d942012-11-29 18:51:05 +00006329 // Call these before we add the C++ ABI library.
Richard Smithc4dabad2012-11-05 22:04:41 +00006330 if (Sanitize.needsUbsanRt())
Hans Wennborg76b86c22013-07-18 20:29:38 +00006331 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
Richard Smith61a574f2013-03-20 23:49:07 +00006332 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev050309f2013-05-27 11:17:01 +00006333 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher6716d942012-11-29 18:51:05 +00006334 if (Sanitize.needsAsanRt())
6335 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6336 if (Sanitize.needsTsanRt())
6337 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +00006338 if (Sanitize.needsMsanRt())
6339 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev050309f2013-05-27 11:17:01 +00006340 if (Sanitize.needsLsanRt())
6341 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Peter Collingbourne2eeed712013-08-07 22:47:34 +00006342 if (Sanitize.needsDfsanRt())
6343 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith8e1cee62012-10-25 02:14:12 +00006344
Chandler Carruth80a393e2013-06-24 09:38:45 +00006345 // The profile runtime also needs access to system libraries.
6346 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6347
Hans Wennborg76b86c22013-07-18 20:29:38 +00006348 if (D.CCCIsCXX() &&
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006349 !Args.hasArg(options::OPT_nostdlib) &&
6350 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola19706f82011-10-17 22:14:51 +00006351 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6352 !Args.hasArg(options::OPT_static);
6353 if (OnlyLibstdcxxStatic)
6354 CmdArgs.push_back("-Bstatic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006355 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola19706f82011-10-17 22:14:51 +00006356 if (OnlyLibstdcxxStatic)
6357 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac1da9812010-11-07 20:14:31 +00006358 CmdArgs.push_back("-lm");
6359 }
6360
Rafael Espindola89414b32010-11-12 03:00:39 +00006361 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006362 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6363 if (Args.hasArg(options::OPT_static))
6364 CmdArgs.push_back("--start-group");
Nick Lewycky80df0252011-06-04 06:27:06 +00006365
Chandler Carruthdf96e022013-01-17 13:19:29 +00006366 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6367 if (OpenMP) {
6368 CmdArgs.push_back("-lgomp");
6369
6370 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6371 // librt. Most modern Linux platfroms require it, but some may not.
6372 CmdArgs.push_back("-lrt");
6373 }
6374
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006375 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola89414b32010-11-12 03:00:39 +00006376
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006377 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruthdf96e022013-01-17 13:19:29 +00006378 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth2ba542c2012-05-14 18:31:18 +00006379 CmdArgs.push_back("-lpthread");
6380
6381 CmdArgs.push_back("-lc");
6382
6383 if (Args.hasArg(options::OPT_static))
6384 CmdArgs.push_back("--end-group");
6385 else
6386 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6387 }
Rafael Espindolafdda1712010-11-17 22:26:15 +00006388
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006389 if (!Args.hasArg(options::OPT_nostartfiles)) {
6390 const char *crtend;
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006391 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006392 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne52ca70d2013-04-09 04:35:11 +00006393 else if (IsPIE)
Evgeniy Stepanova92983d2012-09-10 10:30:12 +00006394 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006395 else
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006396 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola89414b32010-11-12 03:00:39 +00006397
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006398 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanova6ddc022012-04-25 08:59:22 +00006399 if (!isAndroid)
6400 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola49c64fd2010-12-01 01:52:43 +00006401 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00006402 }
6403
Rafael Espindolac1da9812010-11-07 20:14:31 +00006404 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6405}
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00006406
Chris Lattner38e317d2010-07-07 16:01:42 +00006407void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006408 const InputInfo &Output,
6409 const InputInfoList &Inputs,
6410 const ArgList &Args,
6411 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00006412 ArgStringList CmdArgs;
6413
6414 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6415 options::OPT_Xassembler);
6416
6417 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006418 CmdArgs.push_back(Output.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00006419
6420 for (InputInfoList::const_iterator
6421 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6422 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006423 CmdArgs.push_back(II.getFilename());
Chris Lattner38e317d2010-07-07 16:01:42 +00006424 }
6425
6426 const char *Exec =
Eli Friedman6d402dc2011-12-08 23:54:21 +00006427 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006428 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00006429}
6430
6431void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006432 const InputInfo &Output,
6433 const InputInfoList &Inputs,
6434 const ArgList &Args,
6435 const char *LinkingOutput) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00006436 const Driver &D = getToolChain().getDriver();
6437 ArgStringList CmdArgs;
6438
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006439 if (Output.isFilename()) {
Chris Lattner38e317d2010-07-07 16:01:42 +00006440 CmdArgs.push_back("-o");
6441 CmdArgs.push_back(Output.getFilename());
6442 } else {
6443 assert(Output.isNothing() && "Invalid output.");
6444 }
6445
6446 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman6d402dc2011-12-08 23:54:21 +00006447 !Args.hasArg(options::OPT_nostartfiles)) {
6448 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6449 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6450 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6451 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6452 }
Chris Lattner38e317d2010-07-07 16:01:42 +00006453
6454 Args.AddAllArgs(CmdArgs, options::OPT_L);
6455 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6456 Args.AddAllArgs(CmdArgs, options::OPT_e);
6457
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006458 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00006459
Eli Friedman6d402dc2011-12-08 23:54:21 +00006460 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6461
Chris Lattner38e317d2010-07-07 16:01:42 +00006462 if (!Args.hasArg(options::OPT_nostdlib) &&
6463 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg76b86c22013-07-18 20:29:38 +00006464 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006465 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner38e317d2010-07-07 16:01:42 +00006466 CmdArgs.push_back("-lm");
6467 }
Chris Lattner38e317d2010-07-07 16:01:42 +00006468 }
6469
6470 if (!Args.hasArg(options::OPT_nostdlib) &&
6471 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman6d402dc2011-12-08 23:54:21 +00006472 if (Args.hasArg(options::OPT_pthread))
6473 CmdArgs.push_back("-lpthread");
6474 CmdArgs.push_back("-lc");
6475 CmdArgs.push_back("-lCompilerRT-Generic");
6476 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6477 CmdArgs.push_back(
Eric Christopher27e2b982012-12-18 00:31:10 +00006478 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006479 }
6480
Eli Friedman6d402dc2011-12-08 23:54:21 +00006481 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006482 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner38e317d2010-07-07 16:01:42 +00006483}
6484
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006485/// DragonFly Tools
6486
6487// For now, DragonFly Assemble does just about the same as for
6488// FreeBSD, but this may change soon.
6489void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006490 const InputInfo &Output,
Daniel Dunbar294691e2009-11-04 06:24:38 +00006491 const InputInfoList &Inputs,
6492 const ArgList &Args,
6493 const char *LinkingOutput) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006494 ArgStringList CmdArgs;
6495
6496 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6497 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006498 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006499 CmdArgs.push_back("--32");
6500
6501 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6502 options::OPT_Xassembler);
6503
6504 CmdArgs.push_back("-o");
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006505 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006506
6507 for (InputInfoList::const_iterator
6508 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6509 const InputInfo &II = *it;
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006510 CmdArgs.push_back(II.getFilename());
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006511 }
6512
6513 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006514 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006515 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006516}
6517
6518void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006519 const InputInfo &Output,
6520 const InputInfoList &Inputs,
6521 const ArgList &Args,
6522 const char *LinkingOutput) const {
John McCall8cfb7202013-04-11 22:55:55 +00006523 bool UseGCC47 = false;
Daniel Dunbaree788e72009-12-21 18:54:17 +00006524 const Driver &D = getToolChain().getDriver();
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006525 ArgStringList CmdArgs;
6526
John McCall8cfb7202013-04-11 22:55:55 +00006527 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6528 UseGCC47 = false;
6529
Joerg Sonnenberger8ab2bdc2011-03-21 13:51:29 +00006530 if (!D.SysRoot.empty())
6531 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6532
John McCall8cfb7202013-04-11 22:55:55 +00006533 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006534 if (Args.hasArg(options::OPT_static)) {
6535 CmdArgs.push_back("-Bstatic");
6536 } else {
John McCall8cfb7202013-04-11 22:55:55 +00006537 if (Args.hasArg(options::OPT_rdynamic))
6538 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006539 if (Args.hasArg(options::OPT_shared))
6540 CmdArgs.push_back("-Bshareable");
6541 else {
6542 CmdArgs.push_back("-dynamic-linker");
6543 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6544 }
John McCall8cfb7202013-04-11 22:55:55 +00006545 CmdArgs.push_back("--hash-style=both");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006546 }
6547
6548 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6549 // instruct ld in the base system to link 32-bit code.
Rafael Espindola64f7ad92012-10-07 04:44:33 +00006550 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006551 CmdArgs.push_back("-m");
6552 CmdArgs.push_back("elf_i386");
6553 }
6554
Daniel Dunbar7c1e4652010-08-02 02:38:21 +00006555 if (Output.isFilename()) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006556 CmdArgs.push_back("-o");
6557 CmdArgs.push_back(Output.getFilename());
6558 } else {
6559 assert(Output.isNothing() && "Invalid output.");
6560 }
6561
6562 if (!Args.hasArg(options::OPT_nostdlib) &&
6563 !Args.hasArg(options::OPT_nostartfiles)) {
6564 if (!Args.hasArg(options::OPT_shared)) {
John McCall8cfb7202013-04-11 22:55:55 +00006565 if (Args.hasArg(options::OPT_pg))
6566 CmdArgs.push_back(Args.MakeArgString(
6567 getToolChain().GetFilePath("gcrt1.o")));
6568 else {
6569 if (Args.hasArg(options::OPT_pie))
6570 CmdArgs.push_back(Args.MakeArgString(
6571 getToolChain().GetFilePath("Scrt1.o")));
6572 else
6573 CmdArgs.push_back(Args.MakeArgString(
6574 getToolChain().GetFilePath("crt1.o")));
6575 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006576 }
John McCall8cfb7202013-04-11 22:55:55 +00006577 CmdArgs.push_back(Args.MakeArgString(
6578 getToolChain().GetFilePath("crti.o")));
6579 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6580 CmdArgs.push_back(Args.MakeArgString(
6581 getToolChain().GetFilePath("crtbeginS.o")));
6582 else
6583 CmdArgs.push_back(Args.MakeArgString(
6584 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006585 }
6586
6587 Args.AddAllArgs(CmdArgs, options::OPT_L);
6588 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6589 Args.AddAllArgs(CmdArgs, options::OPT_e);
6590
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006591 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006592
6593 if (!Args.hasArg(options::OPT_nostdlib) &&
6594 !Args.hasArg(options::OPT_nodefaultlibs)) {
6595 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6596 // rpaths
John McCall8cfb7202013-04-11 22:55:55 +00006597 if (UseGCC47)
6598 CmdArgs.push_back("-L/usr/lib/gcc47");
6599 else
6600 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006601
6602 if (!Args.hasArg(options::OPT_static)) {
John McCall8cfb7202013-04-11 22:55:55 +00006603 if (UseGCC47) {
6604 CmdArgs.push_back("-rpath");
6605 CmdArgs.push_back("/usr/lib/gcc47");
6606 } else {
6607 CmdArgs.push_back("-rpath");
6608 CmdArgs.push_back("/usr/lib/gcc44");
6609 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006610 }
6611
Hans Wennborg76b86c22013-07-18 20:29:38 +00006612 if (D.CCCIsCXX()) {
Daniel Dunbar132e35d2010-09-17 01:20:05 +00006613 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola405861d2010-07-20 12:59:03 +00006614 CmdArgs.push_back("-lm");
6615 }
6616
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006617 if (Args.hasArg(options::OPT_pthread))
Mike Stump4d63f8b2009-10-31 20:11:46 +00006618 CmdArgs.push_back("-lpthread");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006619
6620 if (!Args.hasArg(options::OPT_nolibc)) {
6621 CmdArgs.push_back("-lc");
6622 }
6623
John McCall8cfb7202013-04-11 22:55:55 +00006624 if (UseGCC47) {
6625 if (Args.hasArg(options::OPT_static) ||
6626 Args.hasArg(options::OPT_static_libgcc)) {
6627 CmdArgs.push_back("-lgcc");
6628 CmdArgs.push_back("-lgcc_eh");
6629 } else {
6630 if (Args.hasArg(options::OPT_shared_libgcc)) {
6631 CmdArgs.push_back("-lgcc_pic");
6632 if (!Args.hasArg(options::OPT_shared))
6633 CmdArgs.push_back("-lgcc");
6634 } else {
6635 CmdArgs.push_back("-lgcc");
6636 CmdArgs.push_back("--as-needed");
6637 CmdArgs.push_back("-lgcc_pic");
6638 CmdArgs.push_back("--no-as-needed");
6639 }
6640 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006641 } else {
John McCall8cfb7202013-04-11 22:55:55 +00006642 if (Args.hasArg(options::OPT_shared)) {
6643 CmdArgs.push_back("-lgcc_pic");
6644 } else {
6645 CmdArgs.push_back("-lgcc");
6646 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006647 }
6648 }
6649
6650 if (!Args.hasArg(options::OPT_nostdlib) &&
6651 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall8cfb7202013-04-11 22:55:55 +00006652 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner38e317d2010-07-07 16:01:42 +00006653 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006654 getToolChain().GetFilePath("crtendS.o")));
John McCall8cfb7202013-04-11 22:55:55 +00006655 else
6656 CmdArgs.push_back(Args.MakeArgString(
6657 getToolChain().GetFilePath("crtend.o")));
Chris Lattner38e317d2010-07-07 16:01:42 +00006658 CmdArgs.push_back(Args.MakeArgString(
John McCall8cfb7202013-04-11 22:55:55 +00006659 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006660 }
6661
Bill Wendling3f4be6f2011-06-27 19:15:03 +00006662 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky2e95a6d2011-05-24 21:54:59 +00006663
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006664 const char *Exec =
Daniel Dunbar4a7e8892010-07-14 18:46:23 +00006665 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar2fe238e2010-08-02 02:38:28 +00006666 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar11e1b402009-05-02 18:28:39 +00006667}
Michael J. Spencerff58e362010-08-21 21:55:07 +00006668
6669void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6670 const InputInfo &Output,
6671 const InputInfoList &Inputs,
6672 const ArgList &Args,
6673 const char *LinkingOutput) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006674 ArgStringList CmdArgs;
6675
6676 if (Output.isFilename()) {
Daniel Dunbare5a37f42010-09-17 00:45:02 +00006677 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6678 Output.getFilename()));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006679 } else {
6680 assert(Output.isNothing() && "Invalid output.");
6681 }
6682
6683 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg746974d2013-08-09 17:38:42 +00006684 !Args.hasArg(options::OPT_nostartfiles) &&
6685 !C.getDriver().IsCLMode()) {
Michael J. Spencerff58e362010-08-21 21:55:07 +00006686 CmdArgs.push_back("-defaultlib:libcmt");
6687 }
6688
6689 CmdArgs.push_back("-nologo");
6690
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00006691 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
6692
6693 if (DLL) {
6694 CmdArgs.push_back(Args.MakeArgString("-dll"));
6695
6696 SmallString<128> ImplibName(Output.getFilename());
6697 llvm::sys::path::replace_extension(ImplibName, "lib");
6698 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
6699 ImplibName.str()));
6700 }
6701
Hans Wennborg3c4da0c2013-08-27 18:10:21 +00006702 if (getToolChain().getDriver().getOrParseSanitizerArgs(Args).needsAsanRt()) {
Hans Wennborg324cc032013-08-28 17:36:07 +00006703 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborg2ddffa12013-08-30 10:50:52 +00006704 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg3c4da0c2013-08-27 18:10:21 +00006705 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00006706 llvm::sys::path::append(LibSanitizer, "lib", "windows");
6707 if (DLL) {
Timur Iskhodzhanove4814132013-09-11 11:45:31 +00006708 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborg6d0a8d52013-09-10 20:18:04 +00006709 } else {
6710 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
6711 }
6712 // FIXME: Handle 64-bit.
Hans Wennborg3c4da0c2013-08-27 18:10:21 +00006713 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
6714 }
6715
Michael J. Spencera2284f52012-06-18 16:56:04 +00006716 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg5db95272013-08-13 23:38:57 +00006717 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencera2284f52012-06-18 16:56:04 +00006718
6719 // Add filenames immediately.
6720 for (InputInfoList::const_iterator
6721 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6722 if (it->isFilename())
6723 CmdArgs.push_back(it->getFilename());
Hans Wennborg2388b772013-08-14 01:24:35 +00006724 else
6725 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencera2284f52012-06-18 16:56:04 +00006726 }
Michael J. Spencerff58e362010-08-21 21:55:07 +00006727
6728 const char *Exec =
Daniel Dunbar2008fee2010-09-17 00:24:54 +00006729 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerff58e362010-08-21 21:55:07 +00006730 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6731}
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006732
6733void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
6734 const InputInfo &Output,
6735 const InputInfoList &Inputs,
6736 const ArgList &Args,
6737 const char *LinkingOutput) const {
6738 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
6739}
6740
Hans Wennborgdc40bf92013-09-20 18:16:35 +00006741// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
6742// If one cannot be found, return FallbackName.
6743// We do this special search to prevent clang-cl from falling back onto itself
6744// if it's available as cl.exe on the path.
6745static std::string FindFallback(const char *FallbackName,
6746 const char *ClangProgramPath) {
6747 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
6748 if (!OptPath.hasValue())
6749 return FallbackName;
6750
6751#ifdef LLVM_ON_WIN32
6752 const StringRef PathSeparators = ";";
6753#else
6754 const StringRef PathSeparators = ":";
6755#endif
6756
6757 SmallVector<StringRef, 8> PathSegments;
6758 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
6759
6760 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
6761 const StringRef &PathSegment = PathSegments[i];
6762 if (PathSegment.empty())
6763 continue;
6764
6765 SmallString<128> FilePath(PathSegment);
6766 llvm::sys::path::append(FilePath, FallbackName);
6767 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
6768 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
6769 return FilePath.str();
6770 }
6771
6772 return FallbackName;
6773}
6774
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006775Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
6776 const InputInfo &Output,
6777 const InputInfoList &Inputs,
6778 const ArgList &Args,
6779 const char *LinkingOutput) const {
6780 ArgStringList CmdArgs;
Hans Wennborg1413d622013-09-24 17:36:21 +00006781 CmdArgs.push_back("/nologo");
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006782 CmdArgs.push_back("/c"); // Compile only.
6783 CmdArgs.push_back("/W0"); // No warnings.
6784
6785 // The goal is to be able to invoke this tool correctly based on
6786 // any flag accepted by clang-cl.
6787
6788 // These are spelled the same way in clang and cl.exe,.
6789 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
6790 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborga8ffc162013-09-24 18:17:21 +00006791
6792 // Optimization level.
6793 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
6794 if (A->getOption().getID() == options::OPT_O0) {
6795 CmdArgs.push_back("/Od");
6796 } else {
6797 StringRef OptLevel = A->getValue();
6798 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
6799 A->render(Args, CmdArgs);
6800 else if (OptLevel == "3")
6801 CmdArgs.push_back("/Ox");
6802 }
6803 }
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006804
6805 // Flags for which clang-cl have an alias.
6806 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
6807
6808 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
6809 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
6810 : "/GR-");
6811 if (Args.hasArg(options::OPT_fsyntax_only))
6812 CmdArgs.push_back("/Zs");
6813
Hans Wennborg4fe475a2013-09-27 17:54:18 +00006814 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
6815 for (size_t I = 0, E = Includes.size(); I != E; ++I)
6816 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
6817
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006818 // Flags that can simply be passed through.
6819 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
6820 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
6821
6822 // The order of these flags is relevant, so pick the last one.
6823 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
6824 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
6825 A->render(Args, CmdArgs);
6826
6827
6828 // Input filename.
6829 assert(Inputs.size() == 1);
6830 const InputInfo &II = Inputs[0];
6831 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
6832 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
6833 if (II.isFilename())
6834 CmdArgs.push_back(II.getFilename());
6835 else
6836 II.getInputArg().renderAsInput(Args, CmdArgs);
6837
6838 // Output filename.
6839 assert(Output.getType() == types::TY_Object);
6840 const char *Fo = Args.MakeArgString(std::string("/Fo") +
6841 Output.getFilename());
6842 CmdArgs.push_back(Fo);
6843
Hans Wennborgdc40bf92013-09-20 18:16:35 +00006844 const Driver &D = getToolChain().getDriver();
6845 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006846
Hans Wennborgdc40bf92013-09-20 18:16:35 +00006847 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborgc8ba0a02013-09-19 20:32:16 +00006848}
Robert Lytton4e490e22013-10-11 10:29:40 +00006849
6850
6851/// XCore Tools
6852// We pass assemble and link construction to the xcc tool.
6853
6854void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6855 const InputInfo &Output,
6856 const InputInfoList &Inputs,
6857 const ArgList &Args,
6858 const char *LinkingOutput) const {
6859 ArgStringList CmdArgs;
6860
6861 CmdArgs.push_back("-o");
6862 CmdArgs.push_back(Output.getFilename());
6863
6864 CmdArgs.push_back("-c");
6865
6866 if (Args.hasArg(options::OPT_g_Group)) {
6867 CmdArgs.push_back("-g");
6868 }
6869
6870 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6871 options::OPT_Xassembler);
6872
6873 for (InputInfoList::const_iterator
6874 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6875 const InputInfo &II = *it;
6876 CmdArgs.push_back(II.getFilename());
6877 }
6878
6879 const char *Exec =
6880 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6881 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6882}
6883
6884void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
6885 const InputInfo &Output,
6886 const InputInfoList &Inputs,
6887 const ArgList &Args,
6888 const char *LinkingOutput) const {
6889 ArgStringList CmdArgs;
6890
6891 if (Output.isFilename()) {
6892 CmdArgs.push_back("-o");
6893 CmdArgs.push_back(Output.getFilename());
6894 } else {
6895 assert(Output.isNothing() && "Invalid output.");
6896 }
6897
6898 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6899
6900 const char *Exec =
6901 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6902 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6903}