blob: c96d5a48046b524819d40f2961d57bd725856531 [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-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 Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
12#include "SanitizerArgs.h"
13#include "ToolChains.h"
14#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000015#include "clang/Basic/Version.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000016#include "clang/Driver/Action.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000017#include "clang/Driver/Arg.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000018#include "clang/Driver/ArgList.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000023#include "clang/Driver/Option.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000024#include "clang/Driver/Options.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000027#include "llvm/ADT/SmallString.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000028#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000029#include "llvm/ADT/Twine.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000030#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000031#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000032#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000033#include "llvm/Support/Host.h"
34#include "llvm/Support/Process.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000035#include "llvm/Support/raw_ostream.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000036
Daniel Dunbar1a093d22009-03-18 06:00:36 +000037using namespace clang::driver;
38using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000039using namespace clang;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000040
Daniel Dunbar64198ef2009-09-10 01:21:05 +000041/// CheckPreprocessingOptions - Perform some validation of preprocessing
42/// arguments that is shared with gcc.
43static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
44 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +000045 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP)
Chris Lattner0e62c1c2011-07-23 10:55:15 +000046 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar64198ef2009-09-10 01:21:05 +000047 << A->getAsString(Args) << "-E";
48}
49
Daniel Dunbar4eadb602009-09-10 01:21:12 +000050/// CheckCodeGenerationOptions - Perform some validation of code generation
51/// arguments that is shared with gcc.
52static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
53 // In gcc, only ARM checks this, but it seems reasonable to check universally.
54 if (Args.hasArg(options::OPT_static))
55 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
56 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000057 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000058 << A->getAsString(Args) << "-static";
59}
60
Chris Lattnerbf2803f2010-03-29 17:55:58 +000061// Quote target names for inclusion in GNU Make dependency files.
62// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000063static void QuoteTarget(StringRef Target,
64 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000065 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
66 switch (Target[i]) {
67 case ' ':
68 case '\t':
69 // Escape the preceding backslashes
70 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
71 Res.push_back('\\');
72
73 // Escape the space/tab
74 Res.push_back('\\');
75 break;
76 case '$':
77 Res.push_back('$');
78 break;
79 case '#':
80 Res.push_back('\\');
81 break;
82 default:
83 break;
84 }
85
86 Res.push_back(Target[i]);
87 }
88}
89
Bill Wendlingc0938f32012-03-12 22:10:06 +000090static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +000091 ArgStringList &CmdArgs,
92 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +000093 const char *EnvVar) {
94 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +000095 bool CombinedArg = false;
96
Bill Wendling281ca292012-03-12 21:22:35 +000097 if (!DirList)
98 return; // Nothing to do.
99
Chad Rosier616e8a52012-10-30 21:42:09 +0000100 StringRef Name(ArgName);
101 if (Name.equals("-I") || Name.equals("-L"))
102 CombinedArg = true;
103
Bill Wendling281ca292012-03-12 21:22:35 +0000104 StringRef Dirs(DirList);
105 if (Dirs.empty()) // Empty string should not add '.'.
106 return;
107
108 StringRef::size_type Delim;
109 while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
110 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000111 if (CombinedArg) {
112 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
113 } else {
114 CmdArgs.push_back(ArgName);
115 CmdArgs.push_back(".");
116 }
Bill Wendling281ca292012-03-12 21:22:35 +0000117 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000118 if (CombinedArg) {
119 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
120 } else {
121 CmdArgs.push_back(ArgName);
122 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
123 }
Bill Wendling281ca292012-03-12 21:22:35 +0000124 }
Nico Weber89355782012-03-19 15:00:03 +0000125 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000126 }
127
128 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000129 if (CombinedArg) {
130 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
131 } else {
132 CmdArgs.push_back(ArgName);
133 CmdArgs.push_back(".");
134 }
Bill Wendling281ca292012-03-12 21:22:35 +0000135 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000136 if (CombinedArg) {
137 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
138 } else {
139 CmdArgs.push_back(ArgName);
140 CmdArgs.push_back(Args.MakeArgString(Dirs));
141 }
Bill Wendling281ca292012-03-12 21:22:35 +0000142 }
143}
144
Daniel Dunbar54423b22010-09-17 00:24:54 +0000145static void AddLinkerInputs(const ToolChain &TC,
146 const InputInfoList &Inputs, const ArgList &Args,
147 ArgStringList &CmdArgs) {
148 const Driver &D = TC.getDriver();
149
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000150 // Add extra linker input arguments which are not treated as inputs
151 // (constructed via -Xarch_).
152 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
153
Daniel Dunbar54423b22010-09-17 00:24:54 +0000154 for (InputInfoList::const_iterator
155 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
156 const InputInfo &II = *it;
157
158 if (!TC.HasNativeLLVMSupport()) {
159 // Don't try to pass LLVM inputs unless we have native support.
160 if (II.getType() == types::TY_LLVM_IR ||
161 II.getType() == types::TY_LTO_IR ||
162 II.getType() == types::TY_LLVM_BC ||
163 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000164 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000165 << TC.getTripleString();
166 }
167
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000168 // Add filenames immediately.
169 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000170 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000171 continue;
172 }
173
174 // Otherwise, this is a linker input argument.
175 const Arg &A = II.getInputArg();
176
177 // Handle reserved library options.
178 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000179 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000180 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
181 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000182 } else
183 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000184 }
Bill Wendling281ca292012-03-12 21:22:35 +0000185
186 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000187 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000188}
189
John McCall31168b02011-06-15 23:02:42 +0000190/// \brief Determine whether Objective-C automated reference counting is
191/// enabled.
192static bool isObjCAutoRefCount(const ArgList &Args) {
193 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
194}
195
Ted Kremeneke65b0862012-03-06 20:05:56 +0000196/// \brief Determine whether we are linking the ObjC runtime.
197static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000198 if (isObjCAutoRefCount(Args)) {
199 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000200 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000201 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000202 return Args.hasArg(options::OPT_fobjc_link_runtime);
203}
204
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000205static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling08760582011-06-27 19:15:03 +0000206 ArgStringList &CmdArgs,
207 llvm::Triple Triple) {
208 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
209 Args.hasArg(options::OPT_fprofile_generate) ||
210 Args.hasArg(options::OPT_fcreate_profile) ||
211 Args.hasArg(options::OPT_coverage)))
212 return;
213
214 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
215 // the link line. We cannot do the same thing because unlike gcov there is a
216 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
217 // not supported by old linkers.
Benjamin Kramerf5fbe432011-11-07 16:02:25 +0000218 std::string ProfileRT =
219 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling08760582011-06-27 19:15:03 +0000220
Bill Wendling08760582011-06-27 19:15:03 +0000221 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000222}
223
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000224static bool forwardToGCC(const Option &O) {
225 return !O.hasFlag(options::NoForward) &&
226 !O.hasFlag(options::DriverOption) &&
227 !O.hasFlag(options::LinkerInput);
228}
229
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000230void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000231 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000232 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000233 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000234 ArgStringList &CmdArgs,
235 const InputInfo &Output,
236 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000237 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000238
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000239 CheckPreprocessingOptions(D, Args);
240
241 Args.AddLastArg(CmdArgs, options::OPT_C);
242 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000243
244 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000245 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000246 (A = Args.getLastArg(options::OPT_MD)) ||
247 (A = Args.getLastArg(options::OPT_MMD))) {
248 // Determine the output location.
249 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000250 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000251 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000252 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000253 } else if (Output.getType() == types::TY_Dependencies) {
254 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000255 } else if (A->getOption().matches(options::OPT_M) ||
256 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000257 DepFile = "-";
258 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000259 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000260 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000261 }
262 CmdArgs.push_back("-dependency-file");
263 CmdArgs.push_back(DepFile);
264
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000265 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000266 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
267 const char *DepTarget;
268
269 // If user provided -o, that is the dependency target, except
270 // when we are only generating a dependency file.
271 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
272 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000273 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000274 } else {
275 // Otherwise derive from the base input.
276 //
277 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000278 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000279 llvm::sys::path::replace_extension(P, "o");
280 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000281 }
282
283 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000284 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000285 QuoteTarget(DepTarget, Quoted);
286 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000287 }
288
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000289 if (A->getOption().matches(options::OPT_M) ||
290 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000291 CmdArgs.push_back("-sys-header-deps");
292 }
293
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000294 if (Args.hasArg(options::OPT_MG)) {
295 if (!A || A->getOption().matches(options::OPT_MD) ||
296 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000297 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000298 CmdArgs.push_back("-MG");
299 }
300
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000301 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000302
303 // Convert all -MQ <target> args to -MT <quoted target>
304 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
305 options::OPT_MQ),
306 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000307 const Arg *A = *it;
308 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000309
Daniel Dunbara442fd52010-06-11 22:00:13 +0000310 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000311 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000312 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000313 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000314 CmdArgs.push_back(Args.MakeArgString(Quoted));
315
316 // -MT flag - no change
317 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000318 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000319 }
320 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321
Douglas Gregor111af7d2009-04-18 00:34:01 +0000322 // Add -i* options, and automatically translate to
323 // -include-pch/-include-pth for transparent PCH support. It's
324 // wonky, but we include looking for .gch so we can support seamless
325 // replacement into a build system already set up to be generating
326 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000327 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000328 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
329 ie = Args.filtered_end(); it != ie; ++it) {
330 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000331
332 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000333 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
334 RenderedImplicitInclude = true;
335
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000336 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000337 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000338
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000339 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000340 bool FoundPCH = false;
Richard Smithbd55daf2012-11-01 04:30:05 +0000341 llvm::sys::Path P(A->getValue());
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000342 bool Exists;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000343 if (UsePCH) {
Douglas Gregor111af7d2009-04-18 00:34:01 +0000344 P.appendSuffix("pch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000345 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000346 FoundPCH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000347 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000348 P.eraseSuffix();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000349 }
350
Douglas Gregor111af7d2009-04-18 00:34:01 +0000351 if (!FoundPCH) {
352 P.appendSuffix("pth");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000353 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000354 FoundPTH = true;
355 else
356 P.eraseSuffix();
Mike Stump11289f42009-09-09 15:08:12 +0000357 }
358
Douglas Gregor111af7d2009-04-18 00:34:01 +0000359 if (!FoundPCH && !FoundPTH) {
360 P.appendSuffix("gch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000361 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000362 FoundPCH = UsePCH;
363 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000364 }
Mike Stump11289f42009-09-09 15:08:12 +0000365 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000366 P.eraseSuffix();
367 }
368
369 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000370 if (IsFirstImplicitInclude) {
371 A->claim();
372 if (UsePCH)
373 CmdArgs.push_back("-include-pch");
374 else
375 CmdArgs.push_back("-include-pth");
376 CmdArgs.push_back(Args.MakeArgString(P.str()));
377 continue;
378 } else {
379 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000380 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000381 << P.str() << A->getAsString(Args);
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383 }
384 }
385
386 // Not translated, render as usual.
387 A->claim();
388 A->render(Args, CmdArgs);
389 }
390
391 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000392 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
393 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000394
395 // Add -Wp, and -Xassembler if using the preprocessor.
396
397 // FIXME: There is a very unfortunate problem here, some troubled
398 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
399 // really support that we would have to parse and then translate
400 // those options. :(
401 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
402 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000403
404 // -I- is a deprecated GCC feature, reject it.
405 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000406 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000407
408 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
409 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000410 StringRef sysroot = C.getSysRoot();
411 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000412 if (!Args.hasArg(options::OPT_isysroot)) {
413 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000414 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000415 }
416 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000417
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000418 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000419 // FIXME: We should probably sink the logic for handling these from the
420 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000421 // CPATH - included following the user specified includes (but prior to
422 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000423 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000424 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000425 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000426 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000427 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000428 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000429 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000430 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000431 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000432
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000433 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000434 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000435 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000436
437 // Add system include arguments.
438 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000439}
440
Daniel Dunbarf492c922009-09-10 22:59:51 +0000441/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000442/// CPU.
443//
444// FIXME: This is redundant with -mcpu, why does LLVM use this.
445// FIXME: tblgen this, or kill it!
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000446static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosier9ac84512011-10-07 17:48:56 +0000447 return llvm::StringSwitch<const char *>(CPU)
448 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
449 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
450 .Cases("arm920", "arm920t", "arm922t", "v4t")
451 .Cases("arm940t", "ep9312","v4t")
452 .Cases("arm10tdmi", "arm1020t", "v5")
453 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
454 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
455 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
456 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
457 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
458 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonf643afc2013-03-04 22:37:46 +0000459 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
460 .Cases("cortex-a9", "cortex-a15", "v7")
Quentin Colombetf5a37a32012-12-21 17:57:47 +0000461 .Case("cortex-r5", "v7r")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000462 .Case("cortex-m0", "v6m")
Bob Wilson743bf672013-03-04 22:37:49 +0000463 .Case("cortex-m3", "v7m")
464 .Case("cortex-m4", "v7em")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000465 .Case("cortex-a9-mp", "v7f")
466 .Case("swift", "v7s")
Chad Rosier9ac84512011-10-07 17:48:56 +0000467 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000468}
469
Benjamin Kramer09811c72012-06-26 22:20:06 +0000470/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
471//
472// FIXME: tblgen this.
473static std::string getARMTargetCPU(const ArgList &Args,
474 const llvm::Triple &Triple) {
475 // FIXME: Warn on inconsistent use of -mcpu and -march.
476
477 // If we have -mcpu=, use that.
478 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000479 StringRef MCPU = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000480 // Handle -mcpu=native.
481 if (MCPU == "native")
482 return llvm::sys::getHostCPUName();
483 else
484 return MCPU;
485 }
486
487 StringRef MArch;
488 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
489 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smithbd55daf2012-11-01 04:30:05 +0000490 MArch = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000491 } else {
492 // Otherwise, use the Arch from the triple.
493 MArch = Triple.getArchName();
494 }
495
496 // Handle -march=native.
497 std::string NativeMArch;
498 if (MArch == "native") {
499 std::string CPU = llvm::sys::getHostCPUName();
500 if (CPU != "generic") {
501 // Translate the native cpu into the architecture. The switch below will
502 // then chose the minimum cpu for that arch.
503 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
504 MArch = NativeMArch;
505 }
506 }
507
508 return llvm::StringSwitch<const char *>(MArch)
509 .Cases("armv2", "armv2a","arm2")
510 .Case("armv3", "arm6")
511 .Case("armv3m", "arm7m")
512 .Cases("armv4", "armv4t", "arm7tdmi")
513 .Cases("armv5", "armv5t", "arm10tdmi")
514 .Cases("armv5e", "armv5te", "arm1022e")
515 .Case("armv5tej", "arm926ej-s")
516 .Cases("armv6", "armv6k", "arm1136jf-s")
517 .Case("armv6j", "arm1136j-s")
518 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
519 .Case("armv6t2", "arm1156t2-s")
Bob Wilson743bf672013-03-04 22:37:49 +0000520 .Cases("armv6m", "armv6-m", "cortex-m0")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000521 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilson743bf672013-03-04 22:37:49 +0000522 .Cases("armv7em", "armv7e-m", "cortex-m4")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000523 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
524 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000525 .Cases("armv7r", "armv7-r", "cortex-r4")
526 .Cases("armv7m", "armv7-m", "cortex-m3")
527 .Case("ep9312", "ep9312")
528 .Case("iwmmxt", "iwmmxt")
529 .Case("xscale", "xscale")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000530 // If all else failed, return the most base CPU LLVM supports.
531 .Default("arm7tdmi");
532}
533
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000534// FIXME: Move to target hook.
535static bool isSignedCharDefault(const llvm::Triple &Triple) {
536 switch (Triple.getArch()) {
537 default:
538 return true;
539
Tim Northover9bb857a2013-01-31 12:13:10 +0000540 case llvm::Triple::aarch64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000541 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000542 case llvm::Triple::ppc:
543 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000544 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000545 return true;
546 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000547 }
548}
549
Chad Rosiercfbfc582012-04-04 20:51:35 +0000550// Handle -mfpu=.
551//
552// FIXME: Centralize feature selection, defaulting shouldn't be also in the
553// frontend target.
554static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
555 ArgStringList &CmdArgs) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000556 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000557
558 // Set the target features based on the FPU.
559 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
560 // Disable any default FPU support.
561 CmdArgs.push_back("-target-feature");
562 CmdArgs.push_back("-vfp2");
563 CmdArgs.push_back("-target-feature");
564 CmdArgs.push_back("-vfp3");
565 CmdArgs.push_back("-target-feature");
566 CmdArgs.push_back("-neon");
567 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
568 CmdArgs.push_back("-target-feature");
569 CmdArgs.push_back("+vfp3");
570 CmdArgs.push_back("-target-feature");
571 CmdArgs.push_back("+d16");
572 CmdArgs.push_back("-target-feature");
573 CmdArgs.push_back("-neon");
574 } else if (FPU == "vfp") {
575 CmdArgs.push_back("-target-feature");
576 CmdArgs.push_back("+vfp2");
577 CmdArgs.push_back("-target-feature");
578 CmdArgs.push_back("-neon");
579 } else if (FPU == "vfp3" || FPU == "vfpv3") {
580 CmdArgs.push_back("-target-feature");
581 CmdArgs.push_back("+vfp3");
582 CmdArgs.push_back("-target-feature");
583 CmdArgs.push_back("-neon");
584 } else if (FPU == "neon") {
585 CmdArgs.push_back("-target-feature");
586 CmdArgs.push_back("+neon");
587 } else
588 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
589}
590
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000591// Handle -mfpmath=.
592static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier45619cb2012-04-04 22:13:40 +0000593 ArgStringList &CmdArgs, StringRef CPU) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000594 StringRef FPMath = A->getValue();
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000595
596 // Set the target features based on the FPMath.
597 if (FPMath == "neon") {
598 CmdArgs.push_back("-target-feature");
599 CmdArgs.push_back("+neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000600
Bob Wilsonf643afc2013-03-04 22:37:46 +0000601 if (CPU != "cortex-a5" && CPU != "cortex-a7" &&
602 CPU != "cortex-a8" && CPU != "cortex-a9" &&
603 CPU != "cortex-a9-mp" && CPU != "cortex-a15")
Chad Rosier45619cb2012-04-04 22:13:40 +0000604 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
605
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000606 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
607 FPMath == "vfp4") {
608 CmdArgs.push_back("-target-feature");
609 CmdArgs.push_back("-neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000610
611 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000612 } else
613 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
614}
615
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000616// Select the float ABI as determined by -msoft-float, -mhard-float, and
617// -mfloat-abi=.
618static StringRef getARMFloatABI(const Driver &D,
619 const ArgList &Args,
620 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000621 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000622 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
623 options::OPT_mhard_float,
624 options::OPT_mfloat_abi_EQ)) {
625 if (A->getOption().matches(options::OPT_msoft_float))
626 FloatABI = "soft";
627 else if (A->getOption().matches(options::OPT_mhard_float))
628 FloatABI = "hard";
629 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000630 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000631 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000632 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000633 << A->getAsString(Args);
634 FloatABI = "soft";
635 }
636 }
637 }
638
639 // If unspecified, choose the default based on the platform.
640 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000641 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000642 case llvm::Triple::Darwin:
643 case llvm::Triple::MacOSX:
644 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000645 // Darwin defaults to "softfp" for v6 and v7.
646 //
647 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000648 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000649 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000650 if (StringRef(ArchName).startswith("v6") ||
651 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000652 FloatABI = "softfp";
653 else
654 FloatABI = "soft";
655 break;
656 }
657
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000658 case llvm::Triple::FreeBSD:
659 // FreeBSD defaults to soft float
660 FloatABI = "soft";
661 break;
662
Daniel Dunbar78485922009-09-10 23:00:09 +0000663 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000664 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000665 case llvm::Triple::GNUEABIHF:
666 FloatABI = "hard";
667 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000668 case llvm::Triple::GNUEABI:
669 FloatABI = "softfp";
670 break;
671 case llvm::Triple::EABI:
672 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
673 FloatABI = "softfp";
674 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000675 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000676 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000677 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000678 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000679 FloatABI = "softfp";
680 else
681 FloatABI = "soft";
682 break;
683 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000684 default:
685 // Assume "soft", but warn the user we are guessing.
686 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000687 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000688 break;
689 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000690 }
691 }
692
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000693 return FloatABI;
694}
695
696
697void Clang::AddARMTargetArgs(const ArgList &Args,
698 ArgStringList &CmdArgs,
699 bool KernelOrKext) const {
700 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000701 // Get the effective triple, which takes into account the deployment target.
702 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
703 llvm::Triple Triple(TripleStr);
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000704 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000705
706 // Select the ABI to use.
707 //
708 // FIXME: Support -meabi.
709 const char *ABIName = 0;
710 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000711 ABIName = A->getValue();
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000712 } else if (Triple.isOSDarwin()) {
713 // The backend is hardwired to assume AAPCS for M-class processors, ensure
714 // the frontend matches that.
715 if (StringRef(CPUName).startswith("cortex-m")) {
716 ABIName = "aapcs";
717 } else {
718 ABIName = "apcs-gnu";
719 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000720 } else {
721 // Select the default based on the platform.
722 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000723 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000724 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000725 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000726 ABIName = "aapcs-linux";
727 break;
728 case llvm::Triple::EABI:
729 ABIName = "aapcs";
730 break;
731 default:
732 ABIName = "apcs-gnu";
733 }
734 }
735 CmdArgs.push_back("-target-abi");
736 CmdArgs.push_back(ABIName);
737
738 // Set the CPU based on -march= and -mcpu=.
739 CmdArgs.push_back("-target-cpu");
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000740 CmdArgs.push_back(Args.MakeArgString(CPUName));
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000741
742 // Determine floating point ABI from the options & target defaults.
743 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000744 if (FloatABI == "soft") {
745 // Floating point operations and argument passing are soft.
746 //
747 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000748 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000749 CmdArgs.push_back("-mfloat-abi");
750 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000751 } else if (FloatABI == "softfp") {
752 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000753 CmdArgs.push_back("-mfloat-abi");
754 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000755 } else {
756 // Floating point operations and argument passing are hard.
757 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000758 CmdArgs.push_back("-mfloat-abi");
759 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000760 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000761
762 // Set appropriate target features for floating point mode.
763 //
764 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
765 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
766 // stripped out by the ARM target.
767
768 // Use software floating point operations?
769 if (FloatABI == "soft") {
770 CmdArgs.push_back("-target-feature");
771 CmdArgs.push_back("+soft-float");
772 }
773
774 // Use software floating point argument passing?
775 if (FloatABI != "hard") {
776 CmdArgs.push_back("-target-feature");
777 CmdArgs.push_back("+soft-float-abi");
778 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +0000779
780 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +0000781 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +0000782 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000783
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000784 // Honor -mfpmath=.
785 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +0000786 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000787
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000788 // Setting -msoft-float effectively disables NEON because of the GCC
789 // implementation, although the same isn't true of VFP or VFP3.
790 if (FloatABI == "soft") {
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000791 CmdArgs.push_back("-target-feature");
792 CmdArgs.push_back("-neon");
793 }
794
795 // Kernel code has more strict alignment requirements.
796 if (KernelOrKext) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000797 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
798 CmdArgs.push_back("-backend-option");
799 CmdArgs.push_back("-arm-long-calls");
800 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000801
Daniel Dunbar12100e22011-03-22 16:48:17 +0000802 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000803 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000804
805 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000806 CmdArgs.push_back("-backend-option");
807 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000808 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000809
810 // Setting -mno-global-merge disables the codegen global merge pass. Setting
811 // -mglobal-merge has no effect as the pass is enabled by default.
812 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
813 options::OPT_mno_global_merge)) {
814 if (A->getOption().matches(options::OPT_mno_global_merge))
815 CmdArgs.push_back("-mno-global-merge");
816 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000817
Chad Rosierc14ded72012-05-16 21:19:55 +0000818 if (Args.hasArg(options::OPT_mno_implicit_float))
Chad Rosierf1985d22012-05-16 20:40:09 +0000819 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000820}
821
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000822// Translate MIPS CPU name alias option to CPU name.
823static StringRef getMipsCPUFromAlias(const Arg &A) {
824 if (A.getOption().matches(options::OPT_mips32))
825 return "mips32";
826 if (A.getOption().matches(options::OPT_mips32r2))
827 return "mips32r2";
828 if (A.getOption().matches(options::OPT_mips64))
829 return "mips64";
830 if (A.getOption().matches(options::OPT_mips64r2))
831 return "mips64r2";
832 llvm_unreachable("Unexpected option");
833 return "";
834}
835
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000836// Get CPU and ABI names. They are not independent
837// so we have to calculate them together.
838static void getMipsCPUAndABI(const ArgList &Args,
839 const ToolChain &TC,
840 StringRef &CPUName,
841 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000842 const char *DefMips32CPU = "mips32";
843 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000844
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000845 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000846 options::OPT_mcpu_EQ,
847 options::OPT_mips_CPUs_Group)) {
848 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
849 CPUName = getMipsCPUFromAlias(*A);
850 else
Richard Smithbd55daf2012-11-01 04:30:05 +0000851 CPUName = A->getValue();
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000852 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000853
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000854 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +0000855 ABIName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000856
857 // Setup default CPU and ABI names.
858 if (CPUName.empty() && ABIName.empty()) {
859 switch (TC.getTriple().getArch()) {
860 default:
861 llvm_unreachable("Unexpected triple arch name");
862 case llvm::Triple::mips:
863 case llvm::Triple::mipsel:
864 CPUName = DefMips32CPU;
865 break;
866 case llvm::Triple::mips64:
867 case llvm::Triple::mips64el:
868 CPUName = DefMips64CPU;
869 break;
870 }
871 }
872
873 if (!ABIName.empty()) {
874 // Deduce CPU name from ABI name.
875 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000876 .Cases("32", "o32", "eabi", DefMips32CPU)
877 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000878 .Default("");
879 }
880 else if (!CPUName.empty()) {
881 // Deduce ABI name from CPU name.
882 ABIName = llvm::StringSwitch<const char *>(CPUName)
883 .Cases("mips32", "mips32r2", "o32")
884 .Cases("mips64", "mips64r2", "n64")
885 .Default("");
886 }
887
888 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000889}
890
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000891// Convert ABI name to the GNU tools acceptable variant.
892static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
893 return llvm::StringSwitch<llvm::StringRef>(ABI)
894 .Case("o32", "32")
895 .Case("n64", "64")
896 .Default(ABI);
897}
898
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000899// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
900// and -mfloat-abi=.
901static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000902 // Select the float ABI as determined by -msoft-float, -mhard-float,
903 // and -mfloat-abi=.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000904 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000905 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000906 options::OPT_mhard_float,
907 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000908 if (A->getOption().matches(options::OPT_msoft_float))
909 FloatABI = "soft";
910 else if (A->getOption().matches(options::OPT_mhard_float))
911 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000912 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000913 FloatABI = A->getValue();
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000914 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000915 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000916 FloatABI = "hard";
917 }
918 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000919 }
920
921 // If unspecified, choose the default based on the platform.
922 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000923 // Assume "hard", because it's a default value used by gcc.
924 // When we start to recognize specific target MIPS processors,
925 // we will be able to select the default more correctly.
926 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000927 }
928
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000929 return FloatABI;
930}
931
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000932static void AddTargetFeature(const ArgList &Args,
933 ArgStringList &CmdArgs,
934 OptSpecifier OnOpt,
935 OptSpecifier OffOpt,
936 StringRef FeatureName) {
937 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
938 CmdArgs.push_back("-target-feature");
939 if (A->getOption().matches(OnOpt))
940 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
941 else
942 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
943 }
944}
945
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000946void Clang::AddMIPSTargetArgs(const ArgList &Args,
947 ArgStringList &CmdArgs) const {
948 const Driver &D = getToolChain().getDriver();
949 StringRef CPUName;
950 StringRef ABIName;
951 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
952
953 CmdArgs.push_back("-target-cpu");
954 CmdArgs.push_back(CPUName.data());
955
956 CmdArgs.push_back("-target-abi");
957 CmdArgs.push_back(ABIName.data());
958
959 StringRef FloatABI = getMipsFloatABI(D, Args);
960
Simon Atanasyan81c423c2013-01-10 12:36:19 +0000961 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
962
963 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000964 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000965 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000966 CmdArgs.push_back("-mfloat-abi");
967 CmdArgs.push_back("soft");
968
969 // FIXME: Note, this is a hack. We need to pass the selected float
970 // mode to the MipsTargetInfoBase to define appropriate macros there.
971 // Now it is the only method.
972 CmdArgs.push_back("-target-feature");
973 CmdArgs.push_back("+soft-float");
Simon Atanasyan81c423c2013-01-10 12:36:19 +0000974
975 if (FloatABI == "hard" && IsMips16) {
976 CmdArgs.push_back("-mllvm");
977 CmdArgs.push_back("-mips16-hard-float");
978 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000979 }
980 else if (FloatABI == "single") {
981 // Restrict the use of hardware floating-point
982 // instructions to 32-bit operations.
983 CmdArgs.push_back("-target-feature");
984 CmdArgs.push_back("+single-float");
985 }
986 else {
987 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000988 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000989 CmdArgs.push_back("-mfloat-abi");
990 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000991 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000992
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000993 AddTargetFeature(Args, CmdArgs,
994 options::OPT_mips16, options::OPT_mno_mips16,
995 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +0000996 AddTargetFeature(Args, CmdArgs,
997 options::OPT_mdsp, options::OPT_mno_dsp,
998 "dsp");
999 AddTargetFeature(Args, CmdArgs,
1000 options::OPT_mdspr2, options::OPT_mno_dspr2,
1001 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001002
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001003 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1004 if (A->getOption().matches(options::OPT_mxgot)) {
1005 CmdArgs.push_back("-mllvm");
1006 CmdArgs.push_back("-mxgot");
1007 }
1008 }
1009
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001010 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001011 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001012 CmdArgs.push_back("-mllvm");
1013 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1014 A->claim();
1015 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001016}
1017
Hal Finkel8eb59282012-06-11 22:35:19 +00001018/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1019static std::string getPPCTargetCPU(const ArgList &Args) {
1020 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001021 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001022
1023 if (CPUName == "native") {
1024 std::string CPU = llvm::sys::getHostCPUName();
1025 if (!CPU.empty() && CPU != "generic")
1026 return CPU;
1027 else
1028 return "";
1029 }
1030
1031 return llvm::StringSwitch<const char *>(CPUName)
1032 .Case("common", "generic")
1033 .Case("440", "440")
1034 .Case("440fp", "440")
1035 .Case("450", "450")
1036 .Case("601", "601")
1037 .Case("602", "602")
1038 .Case("603", "603")
1039 .Case("603e", "603e")
1040 .Case("603ev", "603ev")
1041 .Case("604", "604")
1042 .Case("604e", "604e")
1043 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001044 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001045 .Case("G3", "g3")
1046 .Case("7400", "7400")
1047 .Case("G4", "g4")
1048 .Case("7450", "7450")
1049 .Case("G4+", "g4+")
1050 .Case("750", "750")
1051 .Case("970", "970")
1052 .Case("G5", "g5")
1053 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001054 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001055 .Case("e500mc", "e500mc")
1056 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001057 .Case("power3", "pwr3")
1058 .Case("power4", "pwr4")
1059 .Case("power5", "pwr5")
1060 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001061 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001062 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001063 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001064 .Case("pwr3", "pwr3")
1065 .Case("pwr4", "pwr4")
1066 .Case("pwr5", "pwr5")
1067 .Case("pwr5x", "pwr5x")
1068 .Case("pwr6", "pwr6")
1069 .Case("pwr6x", "pwr6x")
1070 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001071 .Case("powerpc", "ppc")
1072 .Case("powerpc64", "ppc64")
1073 .Default("");
1074 }
1075
1076 return "";
1077}
1078
1079void Clang::AddPPCTargetArgs(const ArgList &Args,
1080 ArgStringList &CmdArgs) const {
1081 std::string TargetCPUName = getPPCTargetCPU(Args);
1082
1083 // LLVM may default to generating code for the native CPU,
1084 // but, like gcc, we default to a more generic option for
1085 // each architecture. (except on Darwin)
1086 llvm::Triple Triple = getToolChain().getTriple();
1087 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1088 if (Triple.getArch() == llvm::Triple::ppc64)
1089 TargetCPUName = "ppc64";
1090 else
1091 TargetCPUName = "ppc";
1092 }
1093
1094 if (!TargetCPUName.empty()) {
1095 CmdArgs.push_back("-target-cpu");
1096 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1097 }
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001098
1099 // Allow override of the Altivec feature.
Hal Finkel279ca4d2013-03-28 08:38:53 +00001100 AddTargetFeature(Args, CmdArgs,
1101 options::OPT_faltivec, options::OPT_fno_altivec,
1102 "altivec");
Hal Finkelb58ce852013-02-01 18:44:19 +00001103
Hal Finkel279ca4d2013-03-28 08:38:53 +00001104 // Note that gcc calls this mfcrf and LLVM calls this mfocrf.
1105 AddTargetFeature(Args, CmdArgs,
1106 options::OPT_mmfcrf, options::OPT_mno_mfcrf,
1107 "mfocrf");
1108
Hal Finkel1fe8b3d2013-03-28 13:51:36 +00001109 AddTargetFeature(Args, CmdArgs,
1110 options::OPT_mpopcntd, options::OPT_mno_popcntd,
1111 "popcntd");
1112
Hal Finkel279ca4d2013-03-28 08:38:53 +00001113 // It is really only possible to turn qpx off because turning qpx on is tied
1114 // to using the a2q CPU.
Hal Finkelb58ce852013-02-01 18:44:19 +00001115 if (Args.hasFlag(options::OPT_mno_qpx, options::OPT_mqpx, false)) {
1116 CmdArgs.push_back("-target-feature");
1117 CmdArgs.push_back("-qpx");
1118 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001119}
1120
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001121void Clang::AddSparcTargetArgs(const ArgList &Args,
1122 ArgStringList &CmdArgs) const {
1123 const Driver &D = getToolChain().getDriver();
1124
1125 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001126 CmdArgs.push_back("-target-cpu");
Richard Smithbd55daf2012-11-01 04:30:05 +00001127 CmdArgs.push_back(A->getValue());
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001128 }
1129
1130 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001131 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001132 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1133 options::OPT_mhard_float)) {
1134 if (A->getOption().matches(options::OPT_msoft_float))
1135 FloatABI = "soft";
1136 else if (A->getOption().matches(options::OPT_mhard_float))
1137 FloatABI = "hard";
1138 }
1139
1140 // If unspecified, choose the default based on the platform.
1141 if (FloatABI.empty()) {
1142 switch (getToolChain().getTriple().getOS()) {
1143 default:
1144 // Assume "soft", but warn the user we are guessing.
1145 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001146 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001147 break;
1148 }
1149 }
1150
1151 if (FloatABI == "soft") {
1152 // Floating point operations and argument passing are soft.
1153 //
1154 // FIXME: This changes CPP defines, we need -target-soft-float.
1155 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001156 CmdArgs.push_back("-target-feature");
1157 CmdArgs.push_back("+soft-float");
1158 } else {
1159 assert(FloatABI == "hard" && "Invalid float abi!");
1160 CmdArgs.push_back("-mhard-float");
1161 }
1162}
1163
Chandler Carruth953fb082013-01-13 11:46:33 +00001164static const char *getX86TargetCPU(const ArgList &Args,
1165 const llvm::Triple &Triple) {
1166 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1167 if (StringRef(A->getValue()) != "native")
1168 return A->getValue();
1169
1170 // FIXME: Reject attempts to use -march=native unless the target matches
1171 // the host.
1172 //
1173 // FIXME: We should also incorporate the detected target features for use
1174 // with -native.
1175 std::string CPU = llvm::sys::getHostCPUName();
1176 if (!CPU.empty() && CPU != "generic")
1177 return Args.MakeArgString(CPU);
1178 }
1179
1180 // Select the default CPU if none was given (or detection failed).
1181
1182 if (Triple.getArch() != llvm::Triple::x86_64 &&
1183 Triple.getArch() != llvm::Triple::x86)
1184 return 0; // This routine is only handling x86 targets.
1185
1186 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1187
1188 // FIXME: Need target hooks.
1189 if (Triple.isOSDarwin())
1190 return Is64Bit ? "core2" : "yonah";
1191
1192 // Everything else goes to x86-64 in 64-bit mode.
1193 if (Is64Bit)
1194 return "x86-64";
1195
1196 if (Triple.getOSName().startswith("haiku"))
1197 return "i586";
1198 if (Triple.getOSName().startswith("openbsd"))
1199 return "i486";
1200 if (Triple.getOSName().startswith("bitrig"))
1201 return "i686";
1202 if (Triple.getOSName().startswith("freebsd"))
1203 return "i486";
1204 if (Triple.getOSName().startswith("netbsd"))
1205 return "i486";
1206 // All x86 devices running Android have core2 as their common
1207 // denominator. This makes a better choice than pentium4.
1208 if (Triple.getEnvironment() == llvm::Triple::Android)
1209 return "core2";
1210
1211 // Fallback to p4.
1212 return "pentium4";
1213}
1214
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001215void Clang::AddX86TargetArgs(const ArgList &Args,
1216 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001217 if (!Args.hasFlag(options::OPT_mred_zone,
1218 options::OPT_mno_red_zone,
1219 true) ||
1220 Args.hasArg(options::OPT_mkernel) ||
1221 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001222 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001223
Bob Wilson2616e2e2013-02-10 16:01:41 +00001224 // Default to avoid implicit floating-point for kernel/kext code, but allow
1225 // that to be overridden with -mno-soft-float.
1226 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1227 Args.hasArg(options::OPT_fapple_kext));
1228 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1229 options::OPT_mno_soft_float,
1230 options::OPT_mno_implicit_float)) {
1231 const Option &O = A->getOption();
1232 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1233 O.matches(options::OPT_msoft_float));
1234 }
1235 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001236 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001237
Chandler Carruth953fb082013-01-13 11:46:33 +00001238 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001239 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001240 CmdArgs.push_back(CPUName);
1241 }
1242
Eli Friedmanad811f02011-07-02 00:34:19 +00001243 // The required algorithm here is slightly strange: the options are applied
1244 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1245 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1246 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1247 // former correctly, but not the latter; handle directly-overridden
1248 // attributes here.
1249 llvm::StringMap<unsigned> PrevFeature;
1250 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001251 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1252 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001253 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001254 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001255
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001256 // Skip over "-m".
Michael J. Spencer929fccd2012-10-22 22:13:48 +00001257 assert(Name.startswith("m") && "Invalid feature name.");
1258 Name = Name.substr(1);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001259
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001260 bool IsNegative = Name.startswith("no-");
1261 if (IsNegative)
1262 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001263
Eli Friedmanad811f02011-07-02 00:34:19 +00001264 unsigned& Prev = PrevFeature[Name];
1265 if (Prev)
1266 Features[Prev - 1] = 0;
1267 Prev = Features.size() + 1;
1268 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1269 }
1270 for (unsigned i = 0; i < Features.size(); i++) {
1271 if (Features[i]) {
1272 CmdArgs.push_back("-target-feature");
1273 CmdArgs.push_back(Features[i]);
1274 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001275 }
1276}
1277
Matthew Curtise8f80a12012-12-06 17:49:03 +00001278static inline bool HasPICArg(const ArgList &Args) {
1279 return Args.hasArg(options::OPT_fPIC)
1280 || Args.hasArg(options::OPT_fpic);
1281}
1282
1283static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1284 return Args.getLastArg(options::OPT_G,
1285 options::OPT_G_EQ,
1286 options::OPT_msmall_data_threshold_EQ);
1287}
1288
1289static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1290 std::string value;
1291 if (HasPICArg(Args))
1292 value = "0";
1293 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1294 value = A->getValue();
1295 A->claim();
1296 }
1297 return value;
1298}
1299
Tony Linthicum76329bf2011-12-12 21:14:55 +00001300void Clang::AddHexagonTargetArgs(const ArgList &Args,
1301 ArgStringList &CmdArgs) const {
1302 llvm::Triple Triple = getToolChain().getTriple();
1303
1304 CmdArgs.push_back("-target-cpu");
Matthew Curtisf10a5952012-12-06 14:16:43 +00001305 CmdArgs.push_back(Args.MakeArgString(
1306 "hexagon"
1307 + toolchains::Hexagon_TC::GetTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001308 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001309 CmdArgs.push_back("-mqdsp6-compat");
1310 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001311
Matthew Curtise8f80a12012-12-06 17:49:03 +00001312 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1313 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001314 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001315 CmdArgs.push_back(Args.MakeArgString(
1316 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001317 }
1318
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001319 if (!Args.hasArg(options::OPT_fno_short_enums))
1320 CmdArgs.push_back("-fshort-enums");
1321 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1322 CmdArgs.push_back ("-mllvm");
1323 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1324 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001325 CmdArgs.push_back ("-mllvm");
1326 CmdArgs.push_back ("-machine-sink-split=0");
1327}
1328
Eric Christopher84fbdb42011-08-19 00:30:14 +00001329static bool
John McCall5fb5df92012-06-20 06:18:46 +00001330shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001331 const llvm::Triple &Triple) {
1332 // We use the zero-cost exception tables for Objective-C if the non-fragile
1333 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1334 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001335 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001336 return true;
1337
Bob Wilson6524dd32011-10-14 05:03:44 +00001338 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001339 return false;
1340
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001341 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001342 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001343 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001344}
1345
Anders Carlssone96ab552011-02-28 02:27:16 +00001346/// addExceptionArgs - Adds exception related arguments to the driver command
1347/// arguments. There's a master flag, -fexceptions and also language specific
1348/// flags to enable/disable C++ and Objective-C exceptions.
1349/// This makes it possible to for example disable C++ exceptions but enable
1350/// Objective-C exceptions.
1351static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1352 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001353 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001354 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001355 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001356 if (KernelOrKext) {
1357 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1358 // arguments now to avoid warnings about unused arguments.
1359 Args.ClaimAllArgs(options::OPT_fexceptions);
1360 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1361 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1362 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1363 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1364 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001365 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001366 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001367
1368 // Exceptions are enabled by default.
1369 bool ExceptionsEnabled = true;
1370
1371 // This keeps track of whether exceptions were explicitly turned on or off.
1372 bool DidHaveExplicitExceptionFlag = false;
1373
Rafael Espindola00a66572009-10-01 13:33:33 +00001374 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1375 options::OPT_fno_exceptions)) {
1376 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001377 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001378 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001379 ExceptionsEnabled = false;
1380
1381 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001382 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001383
Anders Carlssone96ab552011-02-28 02:27:16 +00001384 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001385
Anders Carlssone96ab552011-02-28 02:27:16 +00001386 // Exception tables and cleanups can be enabled with -fexceptions even if the
1387 // language itself doesn't support exceptions.
1388 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1389 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001390
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001391 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1392 // is not necessarily sensible, but follows GCC.
1393 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001394 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001395 options::OPT_fno_objc_exceptions,
1396 true)) {
1397 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001398
Eric Christopher84fbdb42011-08-19 00:30:14 +00001399 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001400 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001401 }
1402
1403 if (types::isCXX(InputType)) {
1404 bool CXXExceptionsEnabled = ExceptionsEnabled;
1405
Eric Christopher84fbdb42011-08-19 00:30:14 +00001406 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1407 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001408 options::OPT_fexceptions,
1409 options::OPT_fno_exceptions)) {
1410 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1411 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001412 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001413 CXXExceptionsEnabled = false;
1414 }
1415
1416 if (CXXExceptionsEnabled) {
1417 CmdArgs.push_back("-fcxx-exceptions");
1418
1419 ShouldUseExceptionTables = true;
1420 }
1421 }
1422
1423 if (ShouldUseExceptionTables)
1424 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001425}
1426
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001427static bool ShouldDisableCFI(const ArgList &Args,
1428 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001429 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001430 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001431 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001432 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001433 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001434 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001435 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001436 options::OPT_fno_dwarf2_cfi_asm,
1437 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001438}
1439
Ted Kremenek62093662013-03-12 17:02:12 +00001440static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1441 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001442 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1443 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001444 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001445 return !UseDwarfDirectory;
1446}
1447
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001448/// \brief Check whether the given input tree contains any compilation actions.
1449static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001450 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001451 return true;
1452
1453 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1454 if (ContainsCompileAction(*it))
1455 return true;
1456
1457 return false;
1458}
1459
1460/// \brief Check if -relax-all should be passed to the internal assembler.
1461/// This is done by default when compiling non-assembler source with -O0.
1462static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1463 bool RelaxDefault = true;
1464
1465 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1466 RelaxDefault = A->getOption().matches(options::OPT_O0);
1467
1468 if (RelaxDefault) {
1469 RelaxDefault = false;
1470 for (ActionList::const_iterator it = C.getActions().begin(),
1471 ie = C.getActions().end(); it != ie; ++it) {
1472 if (ContainsCompileAction(*it)) {
1473 RelaxDefault = true;
1474 break;
1475 }
1476 }
1477 }
1478
1479 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1480 RelaxDefault);
1481}
1482
Alexey Samsonovf7a24762013-01-16 11:34:36 +00001483SanitizerArgs::SanitizerArgs(const Driver &D, const ArgList &Args)
Alexey Samsonov29524a92013-01-20 13:12:12 +00001484 : Kind(0), BlacklistFile(""), MsanTrackOrigins(false),
1485 AsanZeroBaseShadow(false) {
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001486 unsigned AllKinds = 0; // All kinds of sanitizers that were turned on
1487 // at least once (possibly, disabled further).
Richard Smith52be6192012-11-05 22:04:41 +00001488 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
Alexey Samsonov53f7e122012-11-28 17:34:24 +00001489 unsigned Add, Remove;
1490 if (!parse(D, Args, *I, Add, Remove, true))
Richard Smith52be6192012-11-05 22:04:41 +00001491 continue;
Richard Smith52be6192012-11-05 22:04:41 +00001492 (*I)->claim();
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001493 Kind |= Add;
1494 Kind &= ~Remove;
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001495 AllKinds |= Add;
Richard Smith52be6192012-11-05 22:04:41 +00001496 }
1497
Chad Rosierae229d52013-01-29 23:31:22 +00001498 UbsanTrapOnError =
1499 Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
1500 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1501 options::OPT_fno_sanitize_undefined_trap_on_error, false);
1502
1503 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) &&
1504 !Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1505 options::OPT_fno_sanitize_undefined_trap_on_error, true)) {
1506 D.Diag(diag::err_drv_argument_not_allowed_with)
1507 << "-fcatch-undefined-behavior"
1508 << "-fno-sanitize-undefined-trap-on-error";
1509 }
1510
1511 // Warn about undefined sanitizer options that require runtime support.
1512 if (UbsanTrapOnError && notAllowedWithTrap()) {
1513 if (Args.hasArg(options::OPT_fcatch_undefined_behavior))
1514 D.Diag(diag::err_drv_argument_not_allowed_with)
1515 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1516 << "-fcatch-undefined-behavior";
1517 else if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1518 options::OPT_fno_sanitize_undefined_trap_on_error,
1519 false))
1520 D.Diag(diag::err_drv_argument_not_allowed_with)
1521 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1522 << "-fsanitize-undefined-trap-on-error";
1523 }
1524
Richard Smith52be6192012-11-05 22:04:41 +00001525 // Only one runtime library can be used at once.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001526 bool NeedsAsan = needsAsanRt();
1527 bool NeedsTsan = needsTsanRt();
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001528 bool NeedsMsan = needsMsanRt();
Richard Smith06d87f12012-12-01 01:02:45 +00001529 if (NeedsAsan && NeedsTsan)
Richard Smith52be6192012-11-05 22:04:41 +00001530 D.Diag(diag::err_drv_argument_not_allowed_with)
Richard Smith06d87f12012-12-01 01:02:45 +00001531 << lastArgumentForKind(D, Args, NeedsAsanRt)
1532 << lastArgumentForKind(D, Args, NeedsTsanRt);
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001533 if (NeedsAsan && NeedsMsan)
1534 D.Diag(diag::err_drv_argument_not_allowed_with)
1535 << lastArgumentForKind(D, Args, NeedsAsanRt)
1536 << lastArgumentForKind(D, Args, NeedsMsanRt);
1537 if (NeedsTsan && NeedsMsan)
1538 D.Diag(diag::err_drv_argument_not_allowed_with)
1539 << lastArgumentForKind(D, Args, NeedsTsanRt)
1540 << lastArgumentForKind(D, Args, NeedsMsanRt);
Alexey Samsonov0e96bec2012-11-29 22:36:21 +00001541
1542 // If -fsanitize contains extra features of ASan, it should also
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001543 // explicitly contain -fsanitize=address (probably, turned off later in the
1544 // command line).
1545 if ((Kind & AddressFull) != 0 && (AllKinds & Address) == 0)
1546 D.Diag(diag::warn_drv_unused_sanitizer)
1547 << lastArgumentForKind(D, Args, AddressFull)
1548 << "-fsanitize=address";
Alexey Samsonov9ab73622012-12-03 19:12:58 +00001549
1550 // Parse -f(no-)sanitize-blacklist options.
1551 if (Arg *BLArg = Args.getLastArg(options::OPT_fsanitize_blacklist,
1552 options::OPT_fno_sanitize_blacklist)) {
1553 if (BLArg->getOption().matches(options::OPT_fsanitize_blacklist)) {
1554 std::string BLPath = BLArg->getValue();
1555 bool BLExists = false;
1556 if (!llvm::sys::fs::exists(BLPath, BLExists) && BLExists)
1557 BlacklistFile = BLPath;
1558 else
1559 D.Diag(diag::err_drv_no_such_file) << BLPath;
1560 }
Alexey Samsonovd26b3332013-02-19 11:25:29 +00001561 } else {
1562 // If no -fsanitize-blacklist option is specified, try to look up for
1563 // blacklist in the resource directory.
1564 std::string BLPath;
1565 bool BLExists = false;
1566 if (getDefaultBlacklistForKind(D, Kind, BLPath) &&
1567 !llvm::sys::fs::exists(BLPath, BLExists) && BLExists)
1568 BlacklistFile = BLPath;
Alexey Samsonov9ab73622012-12-03 19:12:58 +00001569 }
Evgeniy Stepanovad8ab3d2012-12-24 08:42:34 +00001570
1571 // Parse -f(no-)sanitize-memory-track-origins options.
Alexey Samsonov29524a92013-01-20 13:12:12 +00001572 if (NeedsMsan)
Evgeniy Stepanovad8ab3d2012-12-24 08:42:34 +00001573 MsanTrackOrigins =
1574 Args.hasFlag(options::OPT_fsanitize_memory_track_origins,
1575 options::OPT_fno_sanitize_memory_track_origins,
1576 /* Default */false);
Alexey Samsonov29524a92013-01-20 13:12:12 +00001577
1578 // Parse -f(no-)sanitize-address-zero-base-shadow options.
1579 if (NeedsAsan)
1580 AsanZeroBaseShadow =
1581 Args.hasFlag(options::OPT_fsanitize_address_zero_base_shadow,
1582 options::OPT_fno_sanitize_address_zero_base_shadow,
1583 /* Default */false);
Richard Smith52be6192012-11-05 22:04:41 +00001584}
1585
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001586static void addSanitizerRTLinkFlagsLinux(
1587 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001588 const StringRef Sanitizer, bool BeforeLibStdCXX,
1589 bool ExportSymbols = true) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001590 // Sanitizer runtime is located in the Linux library directory and
1591 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1592 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1593 llvm::sys::path::append(
1594 LibSanitizer, "lib", "linux",
1595 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001596
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001597 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1598 // etc.) so that the linker picks custom versions of the global 'operator
1599 // new' and 'operator delete' symbols. We take the extreme (but simple)
1600 // strategy of inserting it at the front of the link command. It also
1601 // needs to be forced to end up in the executable, so wrap it in
1602 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001603 SmallVector<const char *, 3> LibSanitizerArgs;
1604 LibSanitizerArgs.push_back("-whole-archive");
1605 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
1606 LibSanitizerArgs.push_back("-no-whole-archive");
1607
1608 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1609 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1610
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001611 CmdArgs.push_back("-lpthread");
1612 CmdArgs.push_back("-ldl");
Richard Smithf3e624c2013-03-23 00:30:08 +00001613
1614 // If possible, use a dynamic symbols file to export the symbols from the
1615 // runtime library. If we can't do so, use -export-dynamic instead to export
1616 // all symbols from the binary.
1617 if (ExportSymbols) {
1618 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1619 CmdArgs.push_back(
1620 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1621 else
1622 CmdArgs.push_back("-export-dynamic");
1623 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001624}
1625
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001626/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1627/// This needs to be called before we add the C run-time (malloc, etc).
1628static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001629 ArgStringList &CmdArgs) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001630 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001631 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001632 if (!Args.hasArg(options::OPT_pie))
1633 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001634 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001635
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001636 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1637 llvm::sys::path::append(LibAsan, "lib", "linux",
1638 (Twine("libclang_rt.asan-") +
1639 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001640 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001641 } else {
1642 if (!Args.hasArg(options::OPT_shared)) {
Alexey Samsonov29524a92013-01-20 13:12:12 +00001643 bool ZeroBaseShadow = Args.hasFlag(
1644 options::OPT_fsanitize_address_zero_base_shadow,
1645 options::OPT_fno_sanitize_address_zero_base_shadow, false);
1646 if (ZeroBaseShadow && !Args.hasArg(options::OPT_pie)) {
1647 TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with) <<
1648 "-fsanitize-address-zero-base-shadow" << "-pie";
1649 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001650 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001651 }
1652 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001653}
1654
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001655/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1656/// This needs to be called before we add the C run-time (malloc, etc).
1657static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1658 ArgStringList &CmdArgs) {
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001659 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001660 if (!Args.hasArg(options::OPT_pie))
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001661 TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with) <<
1662 "-fsanitize=thread" << "-pie";
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001663 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001664 }
1665}
1666
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001667/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1668/// This needs to be called before we add the C run-time (malloc, etc).
1669static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1670 ArgStringList &CmdArgs) {
1671 if (!Args.hasArg(options::OPT_shared)) {
1672 if (!Args.hasArg(options::OPT_pie))
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001673 TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with) <<
1674 "-fsanitize=memory" << "-pie";
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001675 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001676 }
1677}
1678
Richard Smithe30752c2012-10-09 19:52:38 +00001679/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1680/// (Linux).
1681static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smithcff3cde2013-03-20 23:49:07 +00001682 ArgStringList &CmdArgs, bool IsCXX,
1683 bool HasOtherSanitizerRt) {
1684 if (Args.hasArg(options::OPT_shared))
1685 return;
1686
1687 // Need a copy of sanitizer_common. This could come from another sanitizer
1688 // runtime; if we're not including one, include our own copy.
1689 if (!HasOtherSanitizerRt)
Richard Smithf3e624c2013-03-23 00:30:08 +00001690 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
Richard Smithcff3cde2013-03-20 23:49:07 +00001691
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001692 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
Richard Smithcff3cde2013-03-20 23:49:07 +00001693
1694 // Only include the bits of the runtime which need a C++ ABI library if
1695 // we're linking in C++ mode.
1696 if (IsCXX)
1697 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001698}
1699
Rafael Espindola224dd632011-12-14 21:02:23 +00001700static bool shouldUseFramePointer(const ArgList &Args,
1701 const llvm::Triple &Triple) {
1702 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1703 options::OPT_fomit_frame_pointer))
1704 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1705
Rafael Espindola00b29182011-12-14 21:50:24 +00001706 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001707 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1708 Triple.getArch() == llvm::Triple::x86) &&
1709 Triple.getOS() == llvm::Triple::Linux) {
1710 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1711 if (!A->getOption().matches(options::OPT_O0))
1712 return false;
1713 }
1714
1715 return true;
1716}
1717
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001718/// If the PWD environment variable is set, add a CC1 option to specify the
1719/// debug compilation directory.
1720static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
1721 if (const char *pwd = ::getenv("PWD")) {
1722 // GCC also verifies that stat(pwd) and stat(".") have the same inode
1723 // number. Not doing those because stats are slow, but we could.
1724 if (llvm::sys::path::is_absolute(pwd)) {
1725 std::string CompDir = pwd;
1726 CmdArgs.push_back("-fdebug-compilation-dir");
1727 CmdArgs.push_back(Args.MakeArgString(CompDir));
1728 }
1729 }
1730}
1731
Eric Christopherd3804002013-02-22 20:12:52 +00001732static const char *SplitDebugName(const ArgList &Args,
1733 const InputInfoList &Inputs) {
1734 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1735 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1736 SmallString<128> T(FinalOutput->getValue());
1737 llvm::sys::path::replace_extension(T, "dwo");
1738 return Args.MakeArgString(T);
1739 } else {
1740 // Use the compilation dir.
1741 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1742 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1743 llvm::sys::path::replace_extension(F, "dwo");
1744 T += F;
1745 return Args.MakeArgString(F);
1746 }
1747}
1748
1749static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1750 const Tool &T, const JobAction &JA,
1751 const ArgList &Args, const InputInfo &Output,
1752 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00001753 ArgStringList ExtractArgs;
1754 ExtractArgs.push_back("--extract-dwo");
1755
1756 ArgStringList StripArgs;
1757 StripArgs.push_back("--strip-dwo");
1758
1759 // Grabbing the output of the earlier compile step.
1760 StripArgs.push_back(Output.getFilename());
1761 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00001762 ExtractArgs.push_back(OutFile);
1763
1764 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00001765 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00001766
1767 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00001768 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001769
1770 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00001771 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001772}
1773
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001774void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001775 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001776 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001777 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001778 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001779 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1780 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001781 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001782 ArgStringList CmdArgs;
1783
Daniel Dunbare521a892009-03-31 20:53:55 +00001784 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1785
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001786 // Invoke ourselves in -cc1 mode.
1787 //
1788 // FIXME: Implement custom jobs for internal actions.
1789 CmdArgs.push_back("-cc1");
1790
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001791 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001792 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001793 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001794 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001795
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001796 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001797 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001798
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001799 if (isa<AnalyzeJobAction>(JA)) {
1800 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1801 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001802 } else if (isa<MigrateJobAction>(JA)) {
1803 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001804 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001805 if (Output.getType() == types::TY_Dependencies)
1806 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001807 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001808 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001809 if (Args.hasArg(options::OPT_rewrite_objc) &&
1810 !Args.hasArg(options::OPT_g_Group))
1811 CmdArgs.push_back("-P");
1812 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00001813 } else if (isa<AssembleJobAction>(JA)) {
1814 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001815
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001816 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001817 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001818
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001819 // When using an integrated assembler, translate -Wa, and -Xassembler
1820 // options.
1821 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1822 options::OPT_Xassembler),
1823 ie = Args.filtered_end(); it != ie; ++it) {
1824 const Arg *A = *it;
1825 A->claim();
1826
1827 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001828 StringRef Value = A->getValue(i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001829
1830 if (Value == "-force_cpusubtype_ALL") {
1831 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001832 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001833 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001834 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001835 CmdArgs.push_back("-mllvm");
1836 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001837 } else if (Value == "--noexecstack") {
1838 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001839 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001840 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001841 << A->getOption().getName() << Value;
1842 }
1843 }
1844 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001845
1846 // Also ignore explicit -force_cpusubtype_ALL option.
1847 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001848 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001849 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001850 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001851
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001852 if (JA.getType() == types::TY_Nothing)
1853 CmdArgs.push_back("-fsyntax-only");
1854 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001855 CmdArgs.push_back("-emit-pch");
1856 else
1857 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001858 } else {
1859 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001860
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001861 if (JA.getType() == types::TY_Nothing) {
1862 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001863 } else if (JA.getType() == types::TY_LLVM_IR ||
1864 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001865 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001866 } else if (JA.getType() == types::TY_LLVM_BC ||
1867 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001868 CmdArgs.push_back("-emit-llvm-bc");
1869 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001870 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001871 } else if (JA.getType() == types::TY_AST) {
1872 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00001873 } else if (JA.getType() == types::TY_ModuleFile) {
1874 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001875 } else if (JA.getType() == types::TY_RewrittenObjC) {
1876 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001877 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001878 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1879 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001880 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001881 } else {
1882 assert(JA.getType() == types::TY_PP_Asm &&
1883 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001884 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001885 }
1886
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001887 // The make clang go fast button.
1888 CmdArgs.push_back("-disable-free");
1889
John McCallbb79b5f2010-02-13 03:50:24 +00001890 // Disable the verification pass in -asserts builds.
1891#ifdef NDEBUG
1892 CmdArgs.push_back("-disable-llvm-verifier");
1893#endif
1894
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001895 // Set the main file name, so that debug info works even with
1896 // -save-temps.
1897 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00001898 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001899
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001900 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00001901 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001902 if (Args.hasArg(options::OPT_static))
1903 CmdArgs.push_back("-static-define");
1904
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001905 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001906 // Enable region store model by default.
1907 CmdArgs.push_back("-analyzer-store=region");
1908
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001909 // Treat blocks as analysis entry points.
1910 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1911
Ted Kremenek49c79792011-03-24 00:28:47 +00001912 CmdArgs.push_back("-analyzer-eagerly-assume");
1913
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001914 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001915 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001916 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001917
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001918 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1919 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001920
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001921 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001922 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001923
1924 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001925
Anton Yartsev13df0362013-03-25 01:35:45 +00001926 if (types::isCXX(Inputs[0].getType()))
1927 CmdArgs.push_back("-analyzer-checker=cplusplus");
1928
Ted Kremenek37e96522012-01-26 02:27:38 +00001929 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001930 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1931 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1932 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1933 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1934 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1935 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001936 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001937
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001938 // Set the output format. The default is plist, for (lame) historical
1939 // reasons.
1940 CmdArgs.push_back("-analyzer-output");
1941 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00001942 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001943 else
1944 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001945
Ted Kremenekfe449a22010-03-22 22:32:05 +00001946 // Disable the presentation of standard compiler warnings when
1947 // using --analyze. We only want to show static analyzer diagnostics
1948 // or frontend errors.
1949 CmdArgs.push_back("-w");
1950
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001951 // Add -Xanalyzer arguments when running as analyzer.
1952 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001953 }
1954
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001955 CheckCodeGenerationOptions(D, Args);
1956
Chandler Carruth76a943b2012-11-19 03:52:03 +00001957 // For the PIC and PIE flag options, this logic is different from the legacy
1958 // logic in very old versions of GCC, as that logic was just a bug no one had
1959 // ever fixed. This logic is both more rational and consistent with GCC's new
1960 // logic now that the bugs are fixed. The last argument relating to either
1961 // PIC or PIE wins, and no other argument is used. If the last argument is
1962 // any flavor of the '-fno-...' arguments, both PIC and PIE are disabled. Any
1963 // PIE option implicitly enables PIC at the same level.
1964 bool PIE = false;
1965 bool PIC = getToolChain().isPICDefault();
1966 bool IsPICLevelTwo = PIC;
1967 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1968 options::OPT_fpic, options::OPT_fno_pic,
1969 options::OPT_fPIE, options::OPT_fno_PIE,
1970 options::OPT_fpie, options::OPT_fno_pie)) {
1971 Option O = A->getOption();
1972 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
1973 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
1974 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
1975 PIC = PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
1976 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
1977 O.matches(options::OPT_fPIC);
1978 } else {
1979 PIE = PIC = false;
1980 }
Benjamin Kramer76db2902012-11-13 15:32:35 +00001981 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00001982 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
1983 // is forced, then neither PIC nor PIE flags will have no effect.
1984 if (getToolChain().isPICDefaultForced()) {
1985 PIE = false;
1986 PIC = getToolChain().isPICDefault();
1987 IsPICLevelTwo = PIC;
Chandler Carruthc0c04552012-04-08 16:40:35 +00001988 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00001989
1990 // Inroduce a Darwin-specific hack. If the default is PIC but the flags
1991 // specified while enabling PIC enabled level 1 PIC, just force it back to
1992 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
1993 // informal testing).
1994 if (PIC && getToolChain().getTriple().isOSDarwin())
1995 IsPICLevelTwo |= getToolChain().isPICDefault();
1996
Chandler Carruthc0c04552012-04-08 16:40:35 +00001997 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1998 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001999 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00002000 if (KernelOrKext &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002001 (Triple.getOS() != llvm::Triple::IOS ||
2002 Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002003 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002004 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002005 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002006
Chandler Carruth76a943b2012-11-19 03:52:03 +00002007 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2008 // This is a very special mode. It trumps the other modes, almost no one
2009 // uses it, and it isn't even valid on any OS but Darwin.
2010 if (!getToolChain().getTriple().isOSDarwin())
2011 D.Diag(diag::err_drv_unsupported_opt_for_target)
2012 << A->getSpelling() << getToolChain().getTriple().str();
2013
2014 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2015
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002016 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002017 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002018
Chandler Carruth76a943b2012-11-19 03:52:03 +00002019 // Only a forced PIC mode can cause the actual compile to have PIC defines
2020 // etc., no flags are sufficient. This behavior was selected to closely
2021 // match that of llvm-gcc and Apple GCC before that.
2022 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2023 CmdArgs.push_back("-pic-level");
2024 CmdArgs.push_back("2");
2025 }
2026 } else {
2027 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2028 // handled in Clang's IRGen by the -pie-level flag.
2029 CmdArgs.push_back("-mrelocation-model");
2030 CmdArgs.push_back(PIC ? "pic" : "static");
2031
2032 if (PIC) {
2033 CmdArgs.push_back("-pic-level");
2034 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2035 if (PIE) {
2036 CmdArgs.push_back("-pie-level");
2037 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2038 }
2039 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002040 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002041
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002042 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2043 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002044 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002045
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002046 // LLVM Code Generator Options.
2047
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002048 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2049 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002050 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002051 }
2052
Roman Divacky65b88cd2011-03-01 17:40:53 +00002053 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2054 CmdArgs.push_back("-mrtd");
2055
Rafael Espindola224dd632011-12-14 21:02:23 +00002056 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002057 CmdArgs.push_back("-mdisable-fp-elim");
2058 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2059 options::OPT_fno_zero_initialized_in_bss))
2060 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00002061 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
2062 options::OPT_fno_strict_aliasing,
2063 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00002064 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002065 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2066 false))
2067 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002068 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2069 options::OPT_fno_optimize_sibling_calls))
2070 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002071
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002072 // Handle various floating point optimization flags, mapping them to the
2073 // appropriate LLVM code generation flags. The pattern for all of these is to
2074 // default off the codegen optimizations, and if any flag enables them and no
2075 // flag disables them after the flag enabling them, enable the codegen
2076 // optimization. This is complicated by several "umbrella" flags.
2077 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002078 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002079 options::OPT_ffinite_math_only,
2080 options::OPT_fno_finite_math_only,
2081 options::OPT_fhonor_infinities,
2082 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002083 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2084 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002085 A->getOption().getID() != options::OPT_fhonor_infinities)
2086 CmdArgs.push_back("-menable-no-infs");
2087 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002088 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002089 options::OPT_ffinite_math_only,
2090 options::OPT_fno_finite_math_only,
2091 options::OPT_fhonor_nans,
2092 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002093 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2094 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002095 A->getOption().getID() != options::OPT_fhonor_nans)
2096 CmdArgs.push_back("-menable-no-nans");
2097
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002098 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2099 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002100 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002101 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002102 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00002103 options::OPT_fno_math_errno))
2104 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
2105 if (MathErrno)
2106 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002107
2108 // There are several flags which require disabling very specific
2109 // optimizations. Any of these being disabled forces us to turn off the
2110 // entire set of LLVM optimizations, so collect them through all the flag
2111 // madness.
2112 bool AssociativeMath = false;
2113 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002114 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002115 options::OPT_funsafe_math_optimizations,
2116 options::OPT_fno_unsafe_math_optimizations,
2117 options::OPT_fassociative_math,
2118 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002119 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2120 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002121 A->getOption().getID() != options::OPT_fno_associative_math)
2122 AssociativeMath = true;
2123 bool ReciprocalMath = false;
2124 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002125 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002126 options::OPT_funsafe_math_optimizations,
2127 options::OPT_fno_unsafe_math_optimizations,
2128 options::OPT_freciprocal_math,
2129 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002130 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2131 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002132 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2133 ReciprocalMath = true;
2134 bool SignedZeros = true;
2135 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002136 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002137 options::OPT_funsafe_math_optimizations,
2138 options::OPT_fno_unsafe_math_optimizations,
2139 options::OPT_fsigned_zeros,
2140 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002141 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2142 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002143 A->getOption().getID() != options::OPT_fsigned_zeros)
2144 SignedZeros = false;
2145 bool TrappingMath = true;
2146 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002147 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002148 options::OPT_funsafe_math_optimizations,
2149 options::OPT_fno_unsafe_math_optimizations,
2150 options::OPT_ftrapping_math,
2151 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002152 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2153 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002154 A->getOption().getID() != options::OPT_ftrapping_math)
2155 TrappingMath = false;
2156 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2157 !TrappingMath)
2158 CmdArgs.push_back("-menable-unsafe-fp-math");
2159
Lang Hamesaa53b932012-07-06 00:59:19 +00002160
2161 // Validate and pass through -fp-contract option.
2162 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002163 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002164 options::OPT_ffp_contract)) {
2165 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002166 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002167 if (Val == "fast" || Val == "on" || Val == "off") {
2168 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2169 } else {
2170 D.Diag(diag::err_drv_unsupported_option_argument)
2171 << A->getOption().getName() << Val;
2172 }
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002173 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002174 // If fast-math is set then set the fp-contract mode to fast.
2175 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2176 }
2177 }
2178
Bob Wilson6a039162012-07-19 03:52:53 +00002179 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2180 // and if we find them, tell the frontend to provide the appropriate
2181 // preprocessor macros. This is distinct from enabling any optimizations as
2182 // these options induce language changes which must survive serialization
2183 // and deserialization, etc.
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002184 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
2185 if (A->getOption().matches(options::OPT_ffast_math))
2186 CmdArgs.push_back("-ffast-math");
2187 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2188 if (A->getOption().matches(options::OPT_ffinite_math_only))
2189 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002190
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002191 // Decide whether to use verbose asm. Verbose assembly is the default on
2192 // toolchains which have the integrated assembler on by default.
2193 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2194 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002195 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002196 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002197 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002198
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002199 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2200 CmdArgs.push_back("-mdebug-pass");
2201 CmdArgs.push_back("Structure");
2202 }
2203 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2204 CmdArgs.push_back("-mdebug-pass");
2205 CmdArgs.push_back("Arguments");
2206 }
2207
John McCall8517abc2010-02-19 02:45:38 +00002208 // Enable -mconstructor-aliases except on darwin, where we have to
2209 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002210 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002211 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002212
John McCall7ef5cb32011-03-18 02:56:14 +00002213 // Darwin's kernel doesn't support guard variables; just die if we
2214 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002215 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002216 CmdArgs.push_back("-fforbid-guard-variables");
2217
Douglas Gregordbe39272011-02-01 15:15:22 +00002218 if (Args.hasArg(options::OPT_mms_bitfields)) {
2219 CmdArgs.push_back("-mms-bitfields");
2220 }
John McCall8517abc2010-02-19 02:45:38 +00002221
Daniel Dunbar306945d2009-09-16 06:17:29 +00002222 // This is a coarse approximation of what llvm-gcc actually does, both
2223 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2224 // complicated ways.
2225 bool AsynchronousUnwindTables =
2226 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2227 options::OPT_fno_asynchronous_unwind_tables,
2228 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002229 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002230 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2231 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002232 CmdArgs.push_back("-munwind-tables");
2233
Chandler Carruth05fb5852012-11-21 23:40:23 +00002234 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002235
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002236 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2237 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002238 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002239 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002240
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002241 // FIXME: Handle -mtune=.
2242 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002243
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002244 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002245 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002246 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002247 }
2248
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002249 // Add target specific cpu and features flags.
2250 switch(getToolChain().getTriple().getArch()) {
2251 default:
2252 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002253
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002254 case llvm::Triple::arm:
2255 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002256 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002257 break;
2258
Eric Christopher0b26a612010-03-02 02:41:08 +00002259 case llvm::Triple::mips:
2260 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002261 case llvm::Triple::mips64:
2262 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002263 AddMIPSTargetArgs(Args, CmdArgs);
2264 break;
2265
Hal Finkel8eb59282012-06-11 22:35:19 +00002266 case llvm::Triple::ppc:
2267 case llvm::Triple::ppc64:
2268 AddPPCTargetArgs(Args, CmdArgs);
2269 break;
2270
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002271 case llvm::Triple::sparc:
2272 AddSparcTargetArgs(Args, CmdArgs);
2273 break;
2274
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002275 case llvm::Triple::x86:
2276 case llvm::Triple::x86_64:
2277 AddX86TargetArgs(Args, CmdArgs);
2278 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002279
2280 case llvm::Triple::hexagon:
2281 AddHexagonTargetArgs(Args, CmdArgs);
2282 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002283 }
2284
Tony Linthicum76329bf2011-12-12 21:14:55 +00002285
2286
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002287 // Pass the linker version in use.
2288 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2289 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002290 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002291 }
2292
Nick Lewycky75033772011-02-02 06:43:03 +00002293 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002294 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00002295 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00002296 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002297 CmdArgs.push_back("-momit-leaf-frame-pointer");
2298
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002299 // Explicitly error on some things we know we don't support and can't just
2300 // ignore.
2301 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002302 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2303 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002304 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002305 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002306 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002307 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2308 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002309 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002310 << Unsupported->getOption().getName();
2311 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002312 }
2313
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002314 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002315 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002316 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002317 CmdArgs.push_back("-header-include-file");
2318 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2319 D.CCPrintHeadersFilename : "-");
2320 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002321 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002322 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002323
Chad Rosierbe10f982011-08-02 17:58:04 +00002324 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002325 CmdArgs.push_back("-diagnostic-log-file");
2326 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2327 D.CCLogDiagnosticsFilename : "-");
2328 }
2329
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002330 // Use the last option from "-g" group. "-gline-tables-only"
2331 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002332 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002333 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002334 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002335 CmdArgs.push_back("-gline-tables-only");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002336 else if (!A->getOption().matches(options::OPT_g0) &&
2337 !A->getOption().matches(options::OPT_ggdb0))
Chad Rosier8fe3b112011-11-07 19:52:29 +00002338 CmdArgs.push_back("-g");
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002339 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002340
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002341 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2342 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002343 if (Args.hasArg(options::OPT_gcolumn_info))
2344 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002345
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002346 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2347 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002348 // FIXME: Currently only works on Linux.
2349 if (getToolChain().getTriple().getOS() == llvm::Triple::Linux &&
2350 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002351 CmdArgs.push_back("-g");
2352 CmdArgs.push_back("-backend-option");
2353 CmdArgs.push_back("-split-dwarf=Enable");
2354 }
2355
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002356 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2357 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2358
Chris Lattner3c77a352010-06-22 00:03:40 +00002359 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2360
Nick Lewycky207bce32011-04-21 23:44:07 +00002361 if (Args.hasArg(options::OPT_ftest_coverage) ||
2362 Args.hasArg(options::OPT_coverage))
2363 CmdArgs.push_back("-femit-coverage-notes");
2364 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2365 Args.hasArg(options::OPT_coverage))
2366 CmdArgs.push_back("-femit-coverage-data");
2367
Nick Lewycky480cb992011-05-04 20:46:58 +00002368 if (C.getArgs().hasArg(options::OPT_c) ||
2369 C.getArgs().hasArg(options::OPT_S)) {
2370 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002371 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002372 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002373 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
2374 if (const char *pwd = ::getenv("PWD")) {
2375 if (llvm::sys::path::is_absolute(pwd)) {
2376 SmallString<128> Pwd(pwd);
2377 llvm::sys::path::append(Pwd, CoverageFilename.str());
2378 CoverageFilename.swap(Pwd);
2379 }
2380 }
2381 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002382 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002383 }
2384 }
2385
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002386 // Pass options for controlling the default header search paths.
2387 if (Args.hasArg(options::OPT_nostdinc)) {
2388 CmdArgs.push_back("-nostdsysteminc");
2389 CmdArgs.push_back("-nobuiltininc");
2390 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002391 if (Args.hasArg(options::OPT_nostdlibinc))
2392 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002393 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2394 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2395 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002396
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002397 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002398 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002399 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002400
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002401 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2402
Ted Kremenekf7639e12012-03-06 20:06:33 +00002403 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002404 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002405 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002406 options::OPT_ccc_arcmt_modify,
2407 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002408 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002409 switch (A->getOption().getID()) {
2410 default:
2411 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002412 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002413 CmdArgs.push_back("-arcmt-check");
2414 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002415 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002416 CmdArgs.push_back("-arcmt-modify");
2417 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002418 case options::OPT_ccc_arcmt_migrate:
2419 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002420 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002421 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002422
2423 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2424 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002425 break;
John McCalld70fb982011-06-15 23:25:17 +00002426 }
2427 }
2428 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002429
Ted Kremenekf7639e12012-03-06 20:06:33 +00002430 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2431 if (ARCMTEnabled) {
2432 D.Diag(diag::err_drv_argument_not_allowed_with)
2433 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2434 }
2435 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002436 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002437
2438 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2439 options::OPT_objcmt_migrate_subscripting)) {
2440 // None specified, means enable them all.
2441 CmdArgs.push_back("-objcmt-migrate-literals");
2442 CmdArgs.push_back("-objcmt-migrate-subscripting");
2443 } else {
2444 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2445 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2446 }
2447 }
2448
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002449 // Add preprocessing options like -I, -D, etc. if we are using the
2450 // preprocessor.
2451 //
2452 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002453 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002454 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002455
Rafael Espindolaa7431922011-07-21 23:40:37 +00002456 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2457 // that "The compiler can only warn and ignore the option if not recognized".
2458 // When building with ccache, it will pass -D options to clang even on
2459 // preprocessed inputs and configure concludes that -fPIC is not supported.
2460 Args.ClaimAllArgs(options::OPT_D);
2461
Daniel Dunbar58f78332009-09-17 06:53:36 +00002462 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002463 // others.
2464 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002465 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002466 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002467 else if (A->getOption().matches(options::OPT_O) &&
Richard Smithbd55daf2012-11-01 04:30:05 +00002468 A->getValue()[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002469 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002470 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002471 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002472 }
2473
Chad Rosier86b82082012-12-12 20:06:31 +00002474 // Don't warn about unused -flto. This can happen when we're preprocessing or
2475 // precompiling.
2476 Args.ClaimAllArgs(options::OPT_flto);
2477
Daniel Dunbar945577c2009-10-29 02:24:45 +00002478 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002479 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2480 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002481 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002482 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002483
2484 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2485 // (-ansi is equivalent to -std=c89).
2486 //
2487 // If a std is supplied, only add -trigraphs if it follows the
2488 // option.
2489 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2490 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002491 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002492 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002493 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002494 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002495 else
2496 Std->render(Args, CmdArgs);
2497
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002498 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2499 options::OPT_trigraphs))
2500 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002501 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002502 } else {
2503 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002504 //
2505 // FIXME: Clang doesn't correctly handle -std= when the input language
2506 // doesn't match. For the time being just ignore this for C++ inputs;
2507 // eventually we want to do all the standard defaulting here instead of
2508 // splitting it between the driver and clang -cc1.
2509 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002510 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2511 "-std=", /*Joined=*/true);
2512 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2513 CmdArgs.push_back("-std=c++11");
2514
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002515 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002516 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002517
Chandler Carruthb009b142011-04-23 06:30:43 +00002518 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2519 // '-fconst-strings'; this better indicates its actual behavior.
2520 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2521 false)) {
2522 // For perfect compatibility with GCC, we do this even in the presence of
2523 // '-w'. This flag names something other than a warning for GCC.
2524 CmdArgs.push_back("-fconst-strings");
2525 }
2526
Chandler Carruth61fbf622011-04-23 09:27:53 +00002527 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002528 // during C++ compilation, which it is by default. GCC keeps this define even
2529 // in the presence of '-w', match this behavior bug-for-bug.
2530 if (types::isCXX(InputType) &&
2531 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2532 true)) {
2533 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002534 }
2535
Chandler Carruthe0391482010-05-22 02:21:53 +00002536 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2537 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2538 if (Asm->getOption().matches(options::OPT_fasm))
2539 CmdArgs.push_back("-fgnu-keywords");
2540 else
2541 CmdArgs.push_back("-fno-gnu-keywords");
2542 }
2543
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002544 if (ShouldDisableCFI(Args, getToolChain()))
2545 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002546
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002547 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2548 CmdArgs.push_back("-fno-dwarf-directory-asm");
2549
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002550 // Add in -fdebug-compilation-dir if necessary.
2551 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002552
Richard Smith9a568822011-11-21 19:36:32 +00002553 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2554 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002555 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002556 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002557 }
2558
Richard Smith9a568822011-11-21 19:36:32 +00002559 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2560 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002561 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002562 }
2563
Richard Smithb3a14522013-02-22 01:59:51 +00002564 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2565 CmdArgs.push_back("-fbracket-depth");
2566 CmdArgs.push_back(A->getValue());
2567 }
2568
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002569 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2570 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002571 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002572 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002573 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2574 } else
2575 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002576 }
2577
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002578
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002579 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002580 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002581
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002582 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2583 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002584 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002585 }
David Chisnall5778fce2009-08-31 16:41:57 +00002586
Chris Lattnere23003d2010-01-09 21:54:33 +00002587 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2588 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002589 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002590 }
2591
Chris Lattnerb35583d2010-04-07 20:49:23 +00002592 CmdArgs.push_back("-ferror-limit");
2593 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002594 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002595 else
2596 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002597
Chandler Carrutha77a7272010-05-06 04:55:18 +00002598 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2599 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002600 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002601 }
2602
2603 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2604 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002605 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002606 }
2607
Richard Smithf6f003a2011-12-16 19:06:07 +00002608 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2609 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002610 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002611 }
2612
Daniel Dunbar2c978472009-11-04 06:24:47 +00002613 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002614 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002615 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002616 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002617 } else {
2618 // If -fmessage-length=N was not specified, determine whether this is a
2619 // terminal and, if so, implicitly define -fmessage-length appropriately.
2620 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002621 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002622 }
2623
John McCallb4a99d32013-02-19 01:57:35 +00002624 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2625 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2626 options::OPT_fvisibility_ms_compat)) {
2627 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2628 CmdArgs.push_back("-fvisibility");
2629 CmdArgs.push_back(A->getValue());
2630 } else {
2631 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2632 CmdArgs.push_back("-fvisibility");
2633 CmdArgs.push_back("hidden");
2634 CmdArgs.push_back("-ftype-visibility");
2635 CmdArgs.push_back("default");
2636 }
Daniel Dunbare357d562009-12-03 18:42:11 +00002637 }
2638
Douglas Gregor08329632010-06-15 17:05:35 +00002639 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002640
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002641 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2642
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002643 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002644 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2645 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002646 CmdArgs.push_back("-ffreestanding");
2647
Daniel Dunbare357d562009-12-03 18:42:11 +00002648 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002649 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002650 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002651 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002652 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002653 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002654 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002655 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2656 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002657
Alexey Samsonov627b10f2012-11-06 15:09:03 +00002658 SanitizerArgs Sanitize(D, Args);
Richard Smith52be6192012-11-05 22:04:41 +00002659 Sanitize.addArgs(Args, CmdArgs);
2660
Will Dietz3676d562012-12-30 20:53:28 +00002661 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2662 options::OPT_fno_sanitize_recover,
2663 true))
2664 CmdArgs.push_back("-fno-sanitize-recover");
2665
Chad Rosierae229d52013-01-29 23:31:22 +00002666 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2667 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2668 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2669 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2670
Eric Christopher459d2712013-02-19 06:16:53 +00002671 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00002672 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2673 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2674 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2675 D.Diag(diag::err_drv_argument_only_allowed_with)
2676 << A->getAsString(Args) << "ppc/ppc64";
2677
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002678 if (getToolChain().SupportsProfiling())
2679 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002680
2681 // -flax-vector-conversions is default.
2682 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2683 options::OPT_fno_lax_vector_conversions))
2684 CmdArgs.push_back("-fno-lax-vector-conversions");
2685
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002686 if (Args.getLastArg(options::OPT_fapple_kext))
2687 CmdArgs.push_back("-fapple-kext");
2688
David Blaikie690f21e2012-06-14 18:55:27 +00002689 if (Args.hasFlag(options::OPT_frewrite_includes,
2690 options::OPT_fno_rewrite_includes, false))
2691 CmdArgs.push_back("-frewrite-includes");
2692
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002693 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002694 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002695 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002696 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2697 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002698
2699 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2700 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002701 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002702 }
2703
Bob Wilson14adb362012-02-03 06:27:22 +00002704 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002705
Chandler Carruth6e501032011-03-27 00:04:55 +00002706 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2707 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2708 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2709 options::OPT_fno_wrapv)) {
2710 if (A->getOption().matches(options::OPT_fwrapv))
2711 CmdArgs.push_back("-fwrapv");
2712 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2713 options::OPT_fno_strict_overflow)) {
2714 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2715 CmdArgs.push_back("-fwrapv");
2716 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002717 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002718 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002719
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002720 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2721
Mahesha S6a682be42012-10-27 07:47:56 +00002722
Daniel Dunbar4930e332009-11-17 08:07:36 +00002723 // -stack-protector=0 is default.
2724 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002725 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2726 options::OPT_fstack_protector_all,
2727 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002728 if (A->getOption().matches(options::OPT_fstack_protector))
2729 StackProtectorLevel = 1;
2730 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2731 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002732 } else {
2733 StackProtectorLevel =
2734 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2735 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002736 if (StackProtectorLevel) {
2737 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002738 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002739 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002740
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002741 // --param ssp-buffer-size=
2742 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2743 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002744 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002745 if (Str.startswith("ssp-buffer-size=")) {
2746 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002747 CmdArgs.push_back("-stack-protector-buffer-size");
2748 // FIXME: Verify the argument is a valid integer.
2749 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002750 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002751 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002752 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002753 }
2754
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002755 // Translate -mstackrealign
2756 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2757 false)) {
2758 CmdArgs.push_back("-backend-option");
2759 CmdArgs.push_back("-force-align-stack");
2760 }
2761 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2762 false)) {
2763 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2764 }
2765
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002766 if (Args.hasArg(options::OPT_mstack_alignment)) {
2767 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2768 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002769 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00002770 // -mkernel implies -mstrict-align; don't add the redundant option.
2771 if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) {
Chad Rosierd87e4f72012-11-09 18:27:01 +00002772 CmdArgs.push_back("-backend-option");
2773 CmdArgs.push_back("-arm-strict-align");
Chad Rosier60027022012-11-09 17:29:19 +00002774 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002775
Daniel Dunbard18049a2009-04-07 21:16:11 +00002776 // Forward -f options with positive and negative forms; we translate
2777 // these by hand.
2778
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002779 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002780 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002781 CmdArgs.push_back("-fapple-kext");
2782 if (!Args.hasArg(options::OPT_fbuiltin))
2783 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002784 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002785 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002786 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002787 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002788 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002789
Nuno Lopes13c88c72009-12-16 16:59:22 +00002790 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2791 options::OPT_fno_assume_sane_operator_new))
2792 CmdArgs.push_back("-fno-assume-sane-operator-new");
2793
Daniel Dunbar4930e332009-11-17 08:07:36 +00002794 // -fblocks=0 is default.
2795 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002796 getToolChain().IsBlocksDefault()) ||
2797 (Args.hasArg(options::OPT_fgnu_runtime) &&
2798 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2799 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002800 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002801
2802 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2803 !getToolChain().hasBlocksRuntime())
2804 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002805 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002806
Douglas Gregor226173a2012-01-18 15:19:58 +00002807 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2808 // users must also pass -fcxx-modules. The latter flag will disappear once the
2809 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00002810 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00002811 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2812 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2813 options::OPT_fno_cxx_modules,
2814 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00002815 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00002816 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00002817 HaveModules = true;
2818 }
2819 }
2820
Douglas Gregor35b04d62013-02-07 19:01:24 +00002821 // If a module path was provided, pass it along. Otherwise, use a temporary
2822 // directory.
2823 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
2824 A->claim();
2825 if (HaveModules) {
2826 A->render(Args, CmdArgs);
2827 }
2828 } else if (HaveModules) {
2829 SmallString<128> DefaultModuleCache;
2830 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
2831 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00002832 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
2833 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00002834 const char Arg[] = "-fmodules-cache-path=";
2835 DefaultModuleCache.insert(DefaultModuleCache.begin(),
2836 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00002837 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
2838 }
2839
2840 // Pass through all -fmodules-ignore-macro arguments.
2841 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00002842 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
2843 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00002844
Douglas Gregorc60437f2013-01-16 01:23:41 +00002845 // -fmodules-autolink (on by default when modules is enabled) automatically
Ted Kremenekacd31db2013-03-12 21:08:08 +00002846 // links against libraries for imported modules. This requires the
2847 // integrated assembler.
Rafael Espindola84b588b2013-03-18 18:10:27 +00002848 if (HaveModules && getToolChain().useIntegratedAs() &&
Douglas Gregorc60437f2013-01-16 01:23:41 +00002849 Args.hasFlag(options::OPT_fmodules_autolink,
2850 options::OPT_fno_modules_autolink,
2851 true)) {
2852 CmdArgs.push_back("-fmodules-autolink");
Douglas Gregor226173a2012-01-18 15:19:58 +00002853 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002854
John McCalldfea9982010-04-09 19:12:06 +00002855 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002856 if (Args.hasFlag(options::OPT_fno_access_control,
2857 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002858 false))
John McCall3155f572010-04-09 19:03:51 +00002859 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002860
Anders Carlssond470fef2010-11-21 00:09:52 +00002861 // -felide-constructors is the default.
2862 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2863 options::OPT_felide_constructors,
2864 false))
2865 CmdArgs.push_back("-fno-elide-constructors");
2866
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002867 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002868 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00002869 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00002870 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002871
Richard Smith52be6192012-11-05 22:04:41 +00002872 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00002873 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00002874 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00002875 Args.getLastArg(options::OPT_mkernel,
2876 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00002877 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00002878 D.Diag(diag::err_drv_argument_not_allowed_with)
2879 << "-fsanitize=vptr" << NoRttiArg;
2880 }
2881 }
2882
Tony Linthicum76329bf2011-12-12 21:14:55 +00002883 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002884 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002885 options::OPT_fno_short_enums,
2886 getToolChain().getTriple().getArch() ==
2887 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002888 CmdArgs.push_back("-fshort-enums");
2889
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002890 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002891 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002892 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002893 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002894
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002895 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002896 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002897 options::OPT_fno_threadsafe_statics))
2898 CmdArgs.push_back("-fno-threadsafe-statics");
2899
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002900 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002901 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2902 options::OPT_fno_use_cxa_atexit,
2903 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002904 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002905 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2906 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002907 CmdArgs.push_back("-fno-use-cxa-atexit");
2908
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002909 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002910 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002911 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2912 CmdArgs.push_back("-fms-extensions");
2913
Francois Pichet1b4f1632011-09-17 04:32:15 +00002914 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002915 if (Args.hasFlag(options::OPT_fms_compatibility,
2916 options::OPT_fno_ms_compatibility,
2917 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2918 Args.hasFlag(options::OPT_fms_extensions,
2919 options::OPT_fno_ms_extensions,
2920 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002921 CmdArgs.push_back("-fms-compatibility");
2922
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002923 // -fmsc-version=1300 is default.
2924 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2925 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2926 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002927 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002928 if (msc_ver.empty())
2929 CmdArgs.push_back("-fmsc-version=1300");
2930 else
2931 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2932 }
2933
2934
Eric Christopher5ecce122013-02-18 00:38:31 +00002935 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002936 if (Args.hasFlag(options::OPT_fborland_extensions,
2937 options::OPT_fno_borland_extensions, false))
2938 CmdArgs.push_back("-fborland-extensions");
2939
Francois Pichet02744872011-09-01 16:38:08 +00002940 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2941 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002942 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2943 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002944 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002945 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002946
Chandler Carruthe03aa552010-04-17 20:17:31 +00002947 // -fgnu-keywords default varies depending on language; only pass if
2948 // specified.
2949 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002950 options::OPT_fno_gnu_keywords))
2951 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002952
Rafael Espindola922a6242011-06-02 17:30:53 +00002953 if (Args.hasFlag(options::OPT_fgnu89_inline,
2954 options::OPT_fno_gnu89_inline,
2955 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002956 CmdArgs.push_back("-fgnu89-inline");
2957
Chad Rosier9c76d242012-03-15 22:31:42 +00002958 if (Args.hasArg(options::OPT_fno_inline))
2959 CmdArgs.push_back("-fno-inline");
2960
Chad Rosier64d6be92012-03-06 21:17:19 +00002961 if (Args.hasArg(options::OPT_fno_inline_functions))
2962 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002963
John McCall5fb5df92012-06-20 06:18:46 +00002964 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002965
John McCall5fb5df92012-06-20 06:18:46 +00002966 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2967 // legacy is the default.
2968 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002969 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2970 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002971 objcRuntime.isLegacyDispatchDefaultForArch(
2972 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002973 if (getToolChain().UseObjCMixedDispatch())
2974 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2975 else
2976 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2977 }
2978 }
2979
Nico Weber97bd94b2012-03-09 21:19:44 +00002980 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2981 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002982 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002983 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2984 }
2985
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00002986 // -fencode-extended-block-signature=1 is default.
2987 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
2988 CmdArgs.push_back("-fencode-extended-block-signature");
2989 }
2990
John McCall24fc0de2011-07-06 00:26:06 +00002991 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2992 // NOTE: This logic is duplicated in ToolChains.cpp.
2993 bool ARC = isObjCAutoRefCount(Args);
2994 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002995 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002996
John McCall24fc0de2011-07-06 00:26:06 +00002997 CmdArgs.push_back("-fobjc-arc");
2998
Chandler Carruth491db322011-11-04 07:34:47 +00002999 // FIXME: It seems like this entire block, and several around it should be
3000 // wrapped in isObjC, but for now we just use it here as this is where it
3001 // was being used previously.
3002 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3003 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3004 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3005 else
3006 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3007 }
3008
John McCall24fc0de2011-07-06 00:26:06 +00003009 // Allow the user to enable full exceptions code emission.
3010 // We define off for Objective-CC, on for Objective-C++.
3011 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3012 options::OPT_fno_objc_arc_exceptions,
3013 /*default*/ types::isCXX(InputType)))
3014 CmdArgs.push_back("-fobjc-arc-exceptions");
3015 }
3016
3017 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3018 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003019 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003020 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003021
John McCall24fc0de2011-07-06 00:26:06 +00003022 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3023 // takes precedence.
3024 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3025 if (!GCArg)
3026 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3027 if (GCArg) {
3028 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003029 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003030 << GCArg->getAsString(Args);
3031 } else if (getToolChain().SupportsObjCGC()) {
3032 GCArg->render(Args, CmdArgs);
3033 } else {
3034 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003035 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003036 << GCArg->getAsString(Args);
3037 }
3038 }
3039
John McCallb5f652e2011-06-22 00:53:57 +00003040 // Add exception args.
3041 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003042 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003043
3044 if (getToolChain().UseSjLjExceptions())
3045 CmdArgs.push_back("-fsjlj-exceptions");
3046
3047 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003048 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3049 options::OPT_fno_assume_sane_operator_new))
3050 CmdArgs.push_back("-fno-assume-sane-operator-new");
3051
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003052 // -fconstant-cfstrings is default, and may be subject to argument translation
3053 // on Darwin.
3054 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3055 options::OPT_fno_constant_cfstrings) ||
3056 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3057 options::OPT_mno_constant_cfstrings))
3058 CmdArgs.push_back("-fno-constant-cfstrings");
3059
John Thompsoned4e2952009-11-05 20:14:16 +00003060 // -fshort-wchar default varies depending on platform; only
3061 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003062 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3063 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003064
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00003065 // -fno-pascal-strings is default, only pass non-default. If the tool chain
3066 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00003067 //
3068 // FIXME: This is gross; that translation should be pulled from the
3069 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003070 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003071 options::OPT_fno_pascal_strings,
3072 false) ||
3073 Args.hasFlag(options::OPT_mpascal_strings,
3074 options::OPT_mno_pascal_strings,
3075 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003076 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003077
Daniel Dunbar096ed292011-10-05 21:04:55 +00003078 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3079 // -fno-pack-struct doesn't apply to -fpack-struct=.
3080 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003081 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003082 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003083 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003084 } else if (Args.hasFlag(options::OPT_fpack_struct,
3085 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003086 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003087 }
3088
Eric Christopher8d56caa2013-02-18 01:16:37 +00003089 if (KernelOrKext) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003090 if (!Args.hasArg(options::OPT_fcommon))
3091 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003092 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003093 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003094
Daniel Dunbard18049a2009-04-07 21:16:11 +00003095 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003096 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003097 CmdArgs.push_back("-fno-common");
3098
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003099 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003100 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003101 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003102 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003103 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003104 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3105
Daniel Dunbar6358d682010-10-15 22:30:42 +00003106 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3107 if (!Args.hasFlag(options::OPT_ffor_scope,
3108 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003109 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003110 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3111
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003112 // -fcaret-diagnostics is default.
3113 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3114 options::OPT_fno_caret_diagnostics, true))
3115 CmdArgs.push_back("-fno-caret-diagnostics");
3116
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003117 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003118 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003119 options::OPT_fno_diagnostics_fixit_info))
3120 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003121
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003122 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003123 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003124 options::OPT_fno_diagnostics_show_option))
3125 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003126
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003127 if (const Arg *A =
3128 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3129 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003130 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003131 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003132
Douglas Gregor643c9222011-05-21 17:07:29 +00003133 if (const Arg *A =
3134 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3135 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003136 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003137 }
3138
Chandler Carruthb6766f02011-03-27 01:50:55 +00003139 if (Arg *A = Args.getLastArg(
3140 options::OPT_fdiagnostics_show_note_include_stack,
3141 options::OPT_fno_diagnostics_show_note_include_stack)) {
3142 if (A->getOption().matches(
3143 options::OPT_fdiagnostics_show_note_include_stack))
3144 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3145 else
3146 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3147 }
3148
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003149 // Color diagnostics are the default, unless the terminal doesn't support
3150 // them.
3151 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00003152 options::OPT_fno_color_diagnostics,
3153 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003154 CmdArgs.push_back("-fcolor-diagnostics");
3155
Daniel Dunbardb097022009-06-08 21:13:54 +00003156 if (!Args.hasFlag(options::OPT_fshow_source_location,
3157 options::OPT_fno_show_source_location))
3158 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003159
Douglas Gregor643c9222011-05-21 17:07:29 +00003160 if (!Args.hasFlag(options::OPT_fshow_column,
3161 options::OPT_fno_show_column,
3162 true))
3163 CmdArgs.push_back("-fno-show-column");
3164
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003165 if (!Args.hasFlag(options::OPT_fspell_checking,
3166 options::OPT_fno_spell_checking))
3167 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003168
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003169
Chad Rosierc8e56e82012-12-05 21:08:21 +00003170 // -fno-asm-blocks is default.
3171 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3172 false))
3173 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003174
Nadav Rotem1cd71a72012-12-18 23:10:16 +00003175 // -fvectorize is default.
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003176 if (Args.hasFlag(options::OPT_fvectorize,
Nadav Rotem1cd71a72012-12-18 23:10:16 +00003177 options::OPT_fno_vectorize, true)) {
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003178 CmdArgs.push_back("-backend-option");
3179 CmdArgs.push_back("-vectorize-loops");
3180 }
3181
Hal Finkel061f1652012-12-11 19:59:32 +00003182 // -fno-slp-vectorize is default.
3183 if (Args.hasFlag(options::OPT_fslp_vectorize,
3184 options::OPT_fno_slp_vectorize, false)) {
3185 CmdArgs.push_back("-backend-option");
3186 CmdArgs.push_back("-vectorize");
3187 }
3188
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003189 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3190 A->render(Args, CmdArgs);
3191
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003192 // -fdollars-in-identifiers default varies depending on platform and
3193 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003194 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003195 options::OPT_fno_dollars_in_identifiers)) {
3196 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003197 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003198 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003199 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003200 }
3201
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003202 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3203 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003204 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003205 options::OPT_fno_unit_at_a_time)) {
3206 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003207 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003208 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003209
Eli Friedman055c9702011-11-02 01:53:16 +00003210 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3211 options::OPT_fno_apple_pragma_pack, false))
3212 CmdArgs.push_back("-fapple-pragma-pack");
3213
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003214 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003215 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003216 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003217#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003218 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003219 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3220 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
3221 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3222 CmdArgs.push_back("-fno-builtin-strcat");
3223 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3224 CmdArgs.push_back("-fno-builtin-strcpy");
3225 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003226#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003227
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003228 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003229 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003230 options::OPT_traditional_cpp)) {
3231 if (isa<PreprocessJobAction>(JA))
3232 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003233 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003234 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003235 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003236
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003237 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003238 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003239
3240 // Handle serialized diagnostics.
3241 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3242 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003243 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003244 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003245
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003246 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3247 CmdArgs.push_back("-fretain-comments-from-system-headers");
3248
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003249 // Forward -fcomment-block-commands to -cc1.
3250 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
3251
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003252 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3253 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003254 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003255 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3256 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003257 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003258
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003259 // We translate this by hand to the -cc1 argument, since nightly test uses
3260 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003261 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003262 CmdArgs.push_back("-disable-llvm-optzns");
3263 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003264 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003265 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003266
Daniel Dunbard67a3222009-03-30 06:36:42 +00003267 if (Output.getType() == types::TY_Dependencies) {
3268 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003269 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003270 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003271 CmdArgs.push_back(Output.getFilename());
3272 } else {
3273 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003274 }
3275
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003276 for (InputInfoList::const_iterator
3277 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3278 const InputInfo &II = *it;
3279 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003280 if (Args.hasArg(options::OPT_rewrite_objc))
3281 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3282 else
3283 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003284 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003285 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003286 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003287 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003288 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003289
Chris Lattnere9d7d782009-11-03 19:50:27 +00003290 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3291
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003292 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003293
3294 // Optionally embed the -cc1 level arguments into the debug info, for build
3295 // analysis.
3296 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003297 ArgStringList OriginalArgs;
3298 for (ArgList::const_iterator it = Args.begin(),
3299 ie = Args.end(); it != ie; ++it)
3300 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003301
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003302 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003303 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003304 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003305 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003306 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003307 }
3308 CmdArgs.push_back("-dwarf-debug-flags");
3309 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3310 }
3311
Eric Christopherd3804002013-02-22 20:12:52 +00003312 // Add the split debug info name to the command lines here so we
3313 // can propagate it to the backend.
3314 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
3315 (getToolChain().getTriple().getOS() == llvm::Triple::Linux) &&
Eric Christopherf1545832013-02-22 23:50:16 +00003316 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003317 const char *SplitDwarfOut;
3318 if (SplitDwarf) {
3319 CmdArgs.push_back("-split-dwarf-file");
3320 SplitDwarfOut = SplitDebugName(Args, Inputs);
3321 CmdArgs.push_back(SplitDwarfOut);
3322 }
3323
3324 // Finally add the compile command to the compilation.
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003325 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00003326
Eric Christopherf1545832013-02-22 23:50:16 +00003327 // Handle the debug info splitting at object creation time if we're
3328 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003329 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003330 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003331 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003332
Roman Divacky178e01602011-02-10 16:52:03 +00003333 if (Arg *A = Args.getLastArg(options::OPT_pg))
3334 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003335 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003336 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003337
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003338 // Claim some arguments which clang supports automatically.
3339
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003340 // -fpch-preprocess is used with gcc to add a special marker in the output to
3341 // include the PCH file. Clang's PTH solution is completely transparent, so we
3342 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003343 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003344
Daniel Dunbar17731772009-03-23 19:03:36 +00003345 // Claim some arguments which clang doesn't support, but we don't
3346 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003347 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3348 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003349
Rafael Espindolad95a8122011-03-01 05:25:27 +00003350 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00003351 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003352 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003353}
3354
Jim Grosbach576452b2012-02-10 20:37:10 +00003355void ClangAs::AddARMTargetArgs(const ArgList &Args,
3356 ArgStringList &CmdArgs) const {
3357 const Driver &D = getToolChain().getDriver();
3358 llvm::Triple Triple = getToolChain().getTriple();
3359
3360 // Set the CPU based on -march= and -mcpu=.
3361 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00003362 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00003363
3364 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00003365 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00003366 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00003367
3368 // Honor -mfpmath=.
3369 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00003370 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00003371}
3372
Benjamin Kramerb164d672013-02-22 20:55:17 +00003373void ClangAs::AddX86TargetArgs(const ArgList &Args,
3374 ArgStringList &CmdArgs) const {
3375 // Set the CPU based on -march=.
3376 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
3377 CmdArgs.push_back("-target-cpu");
3378 CmdArgs.push_back(CPUName);
3379 }
3380}
3381
John McCall5fb5df92012-06-20 06:18:46 +00003382/// Add options related to the Objective-C runtime/ABI.
3383///
3384/// Returns true if the runtime is non-fragile.
3385ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3386 ArgStringList &cmdArgs,
3387 RewriteKind rewriteKind) const {
3388 // Look for the controlling runtime option.
3389 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3390 options::OPT_fgnu_runtime,
3391 options::OPT_fobjc_runtime_EQ);
3392
3393 // Just forward -fobjc-runtime= to the frontend. This supercedes
3394 // options about fragility.
3395 if (runtimeArg &&
3396 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3397 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003398 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003399 if (runtime.tryParse(value)) {
3400 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3401 << value;
3402 }
3403
3404 runtimeArg->render(args, cmdArgs);
3405 return runtime;
3406 }
3407
3408 // Otherwise, we'll need the ABI "version". Version numbers are
3409 // slightly confusing for historical reasons:
3410 // 1 - Traditional "fragile" ABI
3411 // 2 - Non-fragile ABI, version 1
3412 // 3 - Non-fragile ABI, version 2
3413 unsigned objcABIVersion = 1;
3414 // If -fobjc-abi-version= is present, use that to set the version.
3415 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003416 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003417 if (value == "1")
3418 objcABIVersion = 1;
3419 else if (value == "2")
3420 objcABIVersion = 2;
3421 else if (value == "3")
3422 objcABIVersion = 3;
3423 else
3424 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3425 << value;
3426 } else {
3427 // Otherwise, determine if we are using the non-fragile ABI.
3428 bool nonFragileABIIsDefault =
3429 (rewriteKind == RK_NonFragile ||
3430 (rewriteKind == RK_None &&
3431 getToolChain().IsObjCNonFragileABIDefault()));
3432 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3433 options::OPT_fno_objc_nonfragile_abi,
3434 nonFragileABIIsDefault)) {
3435 // Determine the non-fragile ABI version to use.
3436#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3437 unsigned nonFragileABIVersion = 1;
3438#else
3439 unsigned nonFragileABIVersion = 2;
3440#endif
3441
3442 if (Arg *abiArg = args.getLastArg(
3443 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003444 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003445 if (value == "1")
3446 nonFragileABIVersion = 1;
3447 else if (value == "2")
3448 nonFragileABIVersion = 2;
3449 else
3450 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3451 << value;
3452 }
3453
3454 objcABIVersion = 1 + nonFragileABIVersion;
3455 } else {
3456 objcABIVersion = 1;
3457 }
3458 }
3459
3460 // We don't actually care about the ABI version other than whether
3461 // it's non-fragile.
3462 bool isNonFragile = objcABIVersion != 1;
3463
3464 // If we have no runtime argument, ask the toolchain for its default runtime.
3465 // However, the rewriter only really supports the Mac runtime, so assume that.
3466 ObjCRuntime runtime;
3467 if (!runtimeArg) {
3468 switch (rewriteKind) {
3469 case RK_None:
3470 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3471 break;
3472 case RK_Fragile:
3473 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3474 break;
3475 case RK_NonFragile:
3476 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3477 break;
3478 }
3479
3480 // -fnext-runtime
3481 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3482 // On Darwin, make this use the default behavior for the toolchain.
3483 if (getToolChain().getTriple().isOSDarwin()) {
3484 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3485
3486 // Otherwise, build for a generic macosx port.
3487 } else {
3488 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3489 }
3490
3491 // -fgnu-runtime
3492 } else {
3493 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003494 // Legacy behaviour is to target the gnustep runtime if we are i
3495 // non-fragile mode or the GCC runtime in fragile mode.
3496 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003497 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003498 else
3499 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003500 }
3501
3502 cmdArgs.push_back(args.MakeArgString(
3503 "-fobjc-runtime=" + runtime.getAsString()));
3504 return runtime;
3505}
3506
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003507void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003508 const InputInfo &Output,
3509 const InputInfoList &Inputs,
3510 const ArgList &Args,
3511 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003512 ArgStringList CmdArgs;
3513
3514 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3515 const InputInfo &Input = Inputs[0];
3516
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003517 // Don't warn about "clang -w -c foo.s"
3518 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003519 // and "clang -emit-llvm -c foo.s"
3520 Args.ClaimAllArgs(options::OPT_emit_llvm);
3521 // and "clang -use-gold-plugin -c foo.s"
3522 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003523
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003524 // Invoke ourselves in -cc1as mode.
3525 //
3526 // FIXME: Implement custom jobs for internal actions.
3527 CmdArgs.push_back("-cc1as");
3528
3529 // Add the "effective" target triple.
3530 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003531 std::string TripleStr =
3532 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003533 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3534
3535 // Set the output mode, we currently only expect to be used as a real
3536 // assembler.
3537 CmdArgs.push_back("-filetype");
3538 CmdArgs.push_back("obj");
3539
Eric Christopher45f2e712012-12-18 00:31:10 +00003540 // Set the main file name, so that debug info works even with
3541 // -save-temps or preprocessed assembly.
3542 CmdArgs.push_back("-main-file-name");
3543 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3544
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003545 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003546 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003547
Jim Grosbach576452b2012-02-10 20:37:10 +00003548 // Add target specific cpu and features flags.
3549 switch(getToolChain().getTriple().getArch()) {
3550 default:
3551 break;
3552
3553 case llvm::Triple::arm:
3554 case llvm::Triple::thumb:
3555 AddARMTargetArgs(Args, CmdArgs);
3556 break;
Benjamin Kramerb164d672013-02-22 20:55:17 +00003557
3558 case llvm::Triple::x86:
3559 case llvm::Triple::x86_64:
3560 AddX86TargetArgs(Args, CmdArgs);
3561 break;
Jim Grosbach576452b2012-02-10 20:37:10 +00003562 }
3563
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003564 // Ignore explicit -force_cpusubtype_ALL option.
3565 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003566
Eric Christopherfc3ee562012-01-10 00:38:01 +00003567 // Determine the original source input.
3568 const Action *SourceAction = &JA;
3569 while (SourceAction->getKind() != Action::InputClass) {
3570 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3571 SourceAction = SourceAction->getInputs()[0];
3572 }
3573
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003574 // Forward -g and handle debug info related flags, assuming we are dealing
3575 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00003576 if (SourceAction->getType() == types::TY_Asm ||
3577 SourceAction->getType() == types::TY_PP_Asm) {
3578 Args.ClaimAllArgs(options::OPT_g_Group);
3579 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3580 if (!A->getOption().matches(options::OPT_g0))
3581 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003582
3583 // Add the -fdebug-compilation-dir flag if needed.
3584 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00003585
3586 // Set the AT_producer to the clang version when using the integrated
3587 // assembler on assembly source files.
3588 CmdArgs.push_back("-dwarf-debug-producer");
3589 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00003590 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003591
3592 // Optionally embed the -cc1as level arguments into the debug info, for build
3593 // analysis.
3594 if (getToolChain().UseDwarfDebugFlags()) {
3595 ArgStringList OriginalArgs;
3596 for (ArgList::const_iterator it = Args.begin(),
3597 ie = Args.end(); it != ie; ++it)
3598 (*it)->render(Args, OriginalArgs);
3599
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003600 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003601 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3602 Flags += Exec;
3603 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3604 Flags += " ";
3605 Flags += OriginalArgs[i];
3606 }
3607 CmdArgs.push_back("-dwarf-debug-flags");
3608 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3609 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003610
3611 // FIXME: Add -static support, once we have it.
3612
3613 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3614 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003615 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003616
3617 assert(Output.isFilename() && "Unexpected lipo output.");
3618 CmdArgs.push_back("-o");
3619 CmdArgs.push_back(Output.getFilename());
3620
Daniel Dunbarb440f562010-08-02 02:38:21 +00003621 assert(Input.isFilename() && "Invalid input.");
3622 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003623
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003624 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003625 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003626}
3627
Daniel Dunbara3246a02009-03-18 08:07:30 +00003628void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003629 const InputInfo &Output,
3630 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003631 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003632 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003633 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003634 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003635
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003636 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003637 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003638 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003639 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003640 // Don't forward any -g arguments to assembly steps.
3641 if (isa<AssembleJobAction>(JA) &&
3642 A->getOption().matches(options::OPT_g_Group))
3643 continue;
3644
Daniel Dunbar2da02722009-03-19 07:55:12 +00003645 // It is unfortunate that we have to claim here, as this means
3646 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003647 // platforms using a generic gcc, even if we are just using gcc
3648 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003649 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003650 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003651 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003652 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003653
Daniel Dunbar4e295052010-01-25 22:35:08 +00003654 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003655
3656 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003657 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00003658 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003659 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003660
3661 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003662 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003663 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003664 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003665 CmdArgs.push_back("ppc64");
3666 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003667 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003668 }
3669
Daniel Dunbar5716d872009-05-02 21:41:52 +00003670 // Try to force gcc to match the tool chain we want, if we recognize
3671 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003672 //
3673 // FIXME: The triple class should directly provide the information we want
3674 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003675 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003676 CmdArgs.push_back("-m32");
Hans Wennborgc5f4c362013-03-20 07:34:27 +00003677 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003678 CmdArgs.push_back("-m64");
3679
Daniel Dunbarb440f562010-08-02 02:38:21 +00003680 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003681 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003682 CmdArgs.push_back(Output.getFilename());
3683 } else {
3684 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003685 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003686 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003687
Tony Linthicum76329bf2011-12-12 21:14:55 +00003688 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3689 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003690
3691 // Only pass -x if gcc will understand it; otherwise hope gcc
3692 // understands the suffix correctly. The main use case this would go
3693 // wrong in is for linker inputs if they happened to have an odd
3694 // suffix; really the only way to get this to happen is a command
3695 // like '-x foobar a.c' which will treat a.c like a linker input.
3696 //
3697 // FIXME: For the linker case specifically, can we safely convert
3698 // inputs into '-Wl,' options?
3699 for (InputInfoList::const_iterator
3700 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3701 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003702
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003703 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003704 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3705 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003706 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003707 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003708 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003709 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003710 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003711 else if (II.getType() == types::TY_ModuleFile)
3712 D.Diag(diag::err_drv_no_module_support)
3713 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003714
Daniel Dunbara3246a02009-03-18 08:07:30 +00003715 if (types::canTypeBeUserSpecified(II.getType())) {
3716 CmdArgs.push_back("-x");
3717 CmdArgs.push_back(types::getTypeName(II.getType()));
3718 }
3719
Daniel Dunbarb440f562010-08-02 02:38:21 +00003720 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003721 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003722 else {
3723 const Arg &A = II.getInputArg();
3724
3725 // Reverse translate some rewritten options.
3726 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3727 CmdArgs.push_back("-lstdc++");
3728 continue;
3729 }
3730
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003731 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003732 A.render(Args, CmdArgs);
3733 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003734 }
3735
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003736 const std::string customGCCName = D.getCCCGenericGCCName();
3737 const char *GCCName;
3738 if (!customGCCName.empty())
3739 GCCName = customGCCName.c_str();
3740 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003741 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003742 } else
3743 GCCName = "gcc";
3744
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003745 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003746 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003747 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003748}
3749
Daniel Dunbar4e295052010-01-25 22:35:08 +00003750void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3751 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003752 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003753}
3754
Daniel Dunbar4e295052010-01-25 22:35:08 +00003755void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3756 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003757 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003758}
3759
Daniel Dunbar4e295052010-01-25 22:35:08 +00003760void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3761 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003762 const Driver &D = getToolChain().getDriver();
3763
Daniel Dunbar4e295052010-01-25 22:35:08 +00003764 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003765 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3766 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003767 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003768 else {
3769 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003770 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003771 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003772
Daniel Dunbar4e295052010-01-25 22:35:08 +00003773 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003774 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003775}
3776
Daniel Dunbar4e295052010-01-25 22:35:08 +00003777void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3778 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003779 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003780}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003781
Daniel Dunbar4e295052010-01-25 22:35:08 +00003782void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3783 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003784 // The types are (hopefully) good enough.
3785}
3786
Tony Linthicum76329bf2011-12-12 21:14:55 +00003787// Hexagon tools start.
3788void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3789 ArgStringList &CmdArgs) const {
3790
3791}
3792void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3793 const InputInfo &Output,
3794 const InputInfoList &Inputs,
3795 const ArgList &Args,
3796 const char *LinkingOutput) const {
3797
3798 const Driver &D = getToolChain().getDriver();
3799 ArgStringList CmdArgs;
3800
3801 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00003802 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003803 CmdArgs.push_back(Args.MakeArgString(MarchString));
3804
3805 RenderExtraToolArgs(JA, CmdArgs);
3806
3807 if (Output.isFilename()) {
3808 CmdArgs.push_back("-o");
3809 CmdArgs.push_back(Output.getFilename());
3810 } else {
3811 assert(Output.isNothing() && "Unexpected output");
3812 CmdArgs.push_back("-fsyntax-only");
3813 }
3814
Matthew Curtise8f80a12012-12-06 17:49:03 +00003815 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
3816 if (!SmallDataThreshold.empty())
3817 CmdArgs.push_back(
3818 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003819
Matthew Curtise5df3812012-12-07 17:23:04 +00003820 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3821 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3822 options::OPT_Xassembler);
3823
Tony Linthicum76329bf2011-12-12 21:14:55 +00003824 // Only pass -x if gcc will understand it; otherwise hope gcc
3825 // understands the suffix correctly. The main use case this would go
3826 // wrong in is for linker inputs if they happened to have an odd
3827 // suffix; really the only way to get this to happen is a command
3828 // like '-x foobar a.c' which will treat a.c like a linker input.
3829 //
3830 // FIXME: For the linker case specifically, can we safely convert
3831 // inputs into '-Wl,' options?
3832 for (InputInfoList::const_iterator
3833 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3834 const InputInfo &II = *it;
3835
3836 // Don't try to pass LLVM or AST inputs to a generic gcc.
3837 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3838 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3839 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3840 << getToolChain().getTripleString();
3841 else if (II.getType() == types::TY_AST)
3842 D.Diag(clang::diag::err_drv_no_ast_support)
3843 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003844 else if (II.getType() == types::TY_ModuleFile)
3845 D.Diag(diag::err_drv_no_module_support)
3846 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00003847
3848 if (II.isFilename())
3849 CmdArgs.push_back(II.getFilename());
3850 else
3851 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3852 II.getInputArg().render(Args, CmdArgs);
3853 }
3854
3855 const char *GCCName = "hexagon-as";
3856 const char *Exec =
3857 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3858 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3859
3860}
3861void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3862 ArgStringList &CmdArgs) const {
3863 // The types are (hopefully) good enough.
3864}
3865
3866void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3867 const InputInfo &Output,
3868 const InputInfoList &Inputs,
3869 const ArgList &Args,
3870 const char *LinkingOutput) const {
3871
Matthew Curtise689b052012-12-06 15:46:07 +00003872 const toolchains::Hexagon_TC& ToolChain =
3873 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
3874 const Driver &D = ToolChain.getDriver();
3875
Tony Linthicum76329bf2011-12-12 21:14:55 +00003876 ArgStringList CmdArgs;
3877
Matthew Curtise689b052012-12-06 15:46:07 +00003878 //----------------------------------------------------------------------------
3879 //
3880 //----------------------------------------------------------------------------
3881 bool hasStaticArg = Args.hasArg(options::OPT_static);
3882 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00003883 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00003884 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
3885 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
3886 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
3887 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003888
Matthew Curtise689b052012-12-06 15:46:07 +00003889 //----------------------------------------------------------------------------
3890 // Silence warnings for various options
3891 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00003892
Matthew Curtise689b052012-12-06 15:46:07 +00003893 Args.ClaimAllArgs(options::OPT_g_Group);
3894 Args.ClaimAllArgs(options::OPT_emit_llvm);
3895 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
3896 // handled somewhere else.
3897 Args.ClaimAllArgs(options::OPT_static_libgcc);
3898
3899 //----------------------------------------------------------------------------
3900 //
3901 //----------------------------------------------------------------------------
3902 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
3903 e = ToolChain.ExtraOpts.end();
3904 i != e; ++i)
3905 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00003906
Matthew Curtisf10a5952012-12-06 14:16:43 +00003907 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
3908 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00003909
Matthew Curtise689b052012-12-06 15:46:07 +00003910 if (buildingLib) {
3911 CmdArgs.push_back("-shared");
3912 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
3913 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00003914 }
3915
Matthew Curtise689b052012-12-06 15:46:07 +00003916 if (hasStaticArg)
3917 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00003918
Matthew Curtise8f80a12012-12-06 17:49:03 +00003919 if (buildPIE && !buildingLib)
3920 CmdArgs.push_back("-pie");
3921
3922 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
3923 if (!SmallDataThreshold.empty()) {
3924 CmdArgs.push_back(
3925 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
3926 }
3927
Matthew Curtise689b052012-12-06 15:46:07 +00003928 //----------------------------------------------------------------------------
3929 //
3930 //----------------------------------------------------------------------------
3931 CmdArgs.push_back("-o");
3932 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00003933
Matthew Curtise689b052012-12-06 15:46:07 +00003934 const std::string MarchSuffix = "/" + MarchString;
3935 const std::string G0Suffix = "/G0";
3936 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
3937 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
3938 + "/";
3939 const std::string StartFilesDir = RootDir
3940 + "hexagon/lib"
3941 + (buildingLib
3942 ? MarchG0Suffix : MarchSuffix);
3943
3944 //----------------------------------------------------------------------------
3945 // moslib
3946 //----------------------------------------------------------------------------
3947 std::vector<std::string> oslibs;
3948 bool hasStandalone= false;
3949
3950 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
3951 ie = Args.filtered_end(); it != ie; ++it) {
3952 (*it)->claim();
3953 oslibs.push_back((*it)->getValue());
3954 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00003955 }
Matthew Curtise689b052012-12-06 15:46:07 +00003956 if (oslibs.empty()) {
3957 oslibs.push_back("standalone");
3958 hasStandalone = true;
3959 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00003960
Matthew Curtise689b052012-12-06 15:46:07 +00003961 //----------------------------------------------------------------------------
3962 // Start Files
3963 //----------------------------------------------------------------------------
3964 if (incStdLib && incStartFiles) {
3965
3966 if (!buildingLib) {
3967 if (hasStandalone) {
3968 CmdArgs.push_back(
3969 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
3970 }
3971 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
3972 }
3973 std::string initObj = useShared ? "/initS.o" : "/init.o";
3974 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
3975 }
3976
3977 //----------------------------------------------------------------------------
3978 // Library Search Paths
3979 //----------------------------------------------------------------------------
3980 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
3981 for (ToolChain::path_list::const_iterator
3982 i = LibPaths.begin(),
3983 e = LibPaths.end();
3984 i != e;
3985 ++i)
3986 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
3987
3988 //----------------------------------------------------------------------------
3989 //
3990 //----------------------------------------------------------------------------
3991 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
3992 Args.AddAllArgs(CmdArgs, options::OPT_e);
3993 Args.AddAllArgs(CmdArgs, options::OPT_s);
3994 Args.AddAllArgs(CmdArgs, options::OPT_t);
3995 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
3996
3997 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
3998
3999 //----------------------------------------------------------------------------
4000 // Libraries
4001 //----------------------------------------------------------------------------
4002 if (incStdLib && incDefLibs) {
4003 if (D.CCCIsCXX) {
4004 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4005 CmdArgs.push_back("-lm");
4006 }
4007
4008 CmdArgs.push_back("--start-group");
4009
4010 if (!buildingLib) {
4011 for(std::vector<std::string>::iterator i = oslibs.begin(),
4012 e = oslibs.end(); i != e; ++i)
4013 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4014 CmdArgs.push_back("-lc");
4015 }
4016 CmdArgs.push_back("-lgcc");
4017
4018 CmdArgs.push_back("--end-group");
4019 }
4020
4021 //----------------------------------------------------------------------------
4022 // End files
4023 //----------------------------------------------------------------------------
4024 if (incStdLib && incStartFiles) {
4025 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4026 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4027 }
4028
4029 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
4030 C.addCommand(
4031 new Command(
4032 JA, *this,
4033 Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004034}
4035// Hexagon tools end.
4036
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004037llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4038 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4039 // archs which Darwin doesn't use.
4040
4041 // The matching this routine does is fairly pointless, since it is neither the
4042 // complete architecture list, nor a reasonable subset. The problem is that
4043 // historically the driver driver accepts this and also ties its -march=
4044 // handling to the architecture name, so we need to be careful before removing
4045 // support for it.
4046
4047 // This code must be kept in sync with Clang's Darwin specific argument
4048 // translation.
4049
4050 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4051 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4052 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4053 .Case("ppc64", llvm::Triple::ppc64)
4054 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4055 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4056 llvm::Triple::x86)
4057 .Case("x86_64", llvm::Triple::x86_64)
4058 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004059 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4060 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4061 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004062 .Case("r600", llvm::Triple::r600)
4063 .Case("nvptx", llvm::Triple::nvptx)
4064 .Case("nvptx64", llvm::Triple::nvptx64)
4065 .Case("amdil", llvm::Triple::amdil)
4066 .Case("spir", llvm::Triple::spir)
4067 .Default(llvm::Triple::UnknownArch);
4068}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004069
Bob Wilsondecc03e2012-11-23 06:14:39 +00004070const char *Clang::getBaseInputName(const ArgList &Args,
4071 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004072 return Args.MakeArgString(
4073 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004074}
4075
Bob Wilsondecc03e2012-11-23 06:14:39 +00004076const char *Clang::getBaseInputStem(const ArgList &Args,
4077 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004078 const char *Str = getBaseInputName(Args, Inputs);
4079
Chris Lattner906bb902011-01-16 08:14:11 +00004080 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004081 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004082
4083 return Str;
4084}
4085
Bob Wilsondecc03e2012-11-23 06:14:39 +00004086const char *Clang::getDependencyFileName(const ArgList &Args,
4087 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004088 // FIXME: Think about this more.
4089 std::string Res;
4090
4091 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004092 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004093 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004094 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004095 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004096 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004097 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004098}
4099
Daniel Dunbarbe220842009-03-20 16:06:39 +00004100void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004101 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004102 const InputInfoList &Inputs,
4103 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004104 const char *LinkingOutput) const {
4105 ArgStringList CmdArgs;
4106
4107 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4108 const InputInfo &Input = Inputs[0];
4109
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004110 // Determine the original source input.
4111 const Action *SourceAction = &JA;
4112 while (SourceAction->getKind() != Action::InputClass) {
4113 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4114 SourceAction = SourceAction->getInputs()[0];
4115 }
4116
4117 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004118 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004119 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004120 if (Args.hasArg(options::OPT_gstabs))
4121 CmdArgs.push_back("--gstabs");
4122 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004123 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004124 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004125
Daniel Dunbarbe220842009-03-20 16:06:39 +00004126 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004127 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004128
Daniel Dunbar6d484762010-07-22 01:47:22 +00004129 // Use -force_cpusubtype_ALL on x86 by default.
4130 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4131 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004132 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4133 CmdArgs.push_back("-force_cpusubtype_ALL");
4134
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004135 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004136 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004137 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004138 (!getDarwinToolChain().isTargetIPhoneOS() ||
4139 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4140 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004141 CmdArgs.push_back("-static");
4142
Daniel Dunbarbe220842009-03-20 16:06:39 +00004143 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4144 options::OPT_Xassembler);
4145
4146 assert(Output.isFilename() && "Unexpected lipo output.");
4147 CmdArgs.push_back("-o");
4148 CmdArgs.push_back(Output.getFilename());
4149
Daniel Dunbarb440f562010-08-02 02:38:21 +00004150 assert(Input.isFilename() && "Invalid input.");
4151 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004152
4153 // asm_final spec is empty.
4154
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004155 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004156 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004157 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004158}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004159
David Blaikie68e081d2011-12-20 02:48:34 +00004160void darwin::DarwinTool::anchor() {}
4161
Daniel Dunbare9ded432009-09-09 18:36:20 +00004162void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4163 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004164 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004165
Daniel Dunbarc1964212009-03-26 16:23:12 +00004166 // Derived from darwin_arch spec.
4167 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004168 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004169
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004170 // FIXME: Is this needed anymore?
4171 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004172 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004173}
4174
Bill Wendling3b2000f2012-10-02 18:02:50 +00004175bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4176 // We only need to generate a temp path for LTO if we aren't compiling object
4177 // files. When compiling source files, we run 'dsymutil' after linking. We
4178 // don't run 'dsymutil' when compiling object files.
4179 for (InputInfoList::const_iterator
4180 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4181 if (it->getType() != types::TY_Object)
4182 return true;
4183
4184 return false;
4185}
4186
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004187void darwin::Link::AddLinkArgs(Compilation &C,
4188 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004189 ArgStringList &CmdArgs,
4190 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004191 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004192 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004193
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004194 unsigned Version[3] = { 0, 0, 0 };
4195 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4196 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004197 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004198 Version[1], Version[2], HadExtra) ||
4199 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004200 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004201 << A->getAsString(Args);
4202 }
4203
4204 // Newer linkers support -demangle, pass it if supported and not disabled by
4205 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004206 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004207 // Don't pass -demangle to ld_classic.
4208 //
4209 // FIXME: This is a temporary workaround, ld should be handling this.
4210 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4211 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004212 if (getToolChain().getArch() == llvm::Triple::x86) {
4213 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4214 options::OPT_Wl_COMMA),
4215 ie = Args.filtered_end(); it != ie; ++it) {
4216 const Arg *A = *it;
4217 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004218 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004219 UsesLdClassic = true;
4220 }
4221 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004222 if (!UsesLdClassic)
4223 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004224 }
4225
Bill Wendling313b6bf2012-11-16 23:03:00 +00004226 // If we are using LTO, then automatically create a temporary file path for
4227 // the linker to use, so that it's lifetime will extend past a possible
4228 // dsymutil step.
4229 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4230 const char *TmpPath = C.getArgs().MakeArgString(
4231 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4232 C.addTempFile(TmpPath);
4233 CmdArgs.push_back("-object_path_lto");
4234 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004235 }
4236
Daniel Dunbarc1964212009-03-26 16:23:12 +00004237 // Derived from the "link" spec.
4238 Args.AddAllArgs(CmdArgs, options::OPT_static);
4239 if (!Args.hasArg(options::OPT_static))
4240 CmdArgs.push_back("-dynamic");
4241 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4242 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4243 // here. How do we wish to handle such things?
4244 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004245
Daniel Dunbarc1964212009-03-26 16:23:12 +00004246 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004247 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004248 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004249 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004250
4251 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4252 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4253 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4254
4255 Arg *A;
4256 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4257 (A = Args.getLastArg(options::OPT_current__version)) ||
4258 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004259 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004260 << A->getAsString(Args) << "-dynamiclib";
4261
4262 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4263 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4264 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4265 } else {
4266 CmdArgs.push_back("-dylib");
4267
4268 Arg *A;
4269 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4270 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4271 (A = Args.getLastArg(options::OPT_client__name)) ||
4272 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4273 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4274 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004275 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004276 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004277
Daniel Dunbarc1964212009-03-26 16:23:12 +00004278 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4279 "-dylib_compatibility_version");
4280 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4281 "-dylib_current_version");
4282
Daniel Dunbara48823f2010-01-22 02:04:52 +00004283 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004284
4285 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4286 "-dylib_install_name");
4287 }
4288
4289 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4290 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4291 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004292 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004293 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004294 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4295 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4296 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4297 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4298 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4299 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004300 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004301 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4302 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4303 Args.AddAllArgs(CmdArgs, options::OPT_init);
4304
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004305 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004306 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004307
4308 // If we had an explicit -mios-simulator-version-min argument, honor that,
4309 // otherwise use the traditional deployment targets. We can't just check the
4310 // is-sim attribute because existing code follows this path, and the linker
4311 // may not handle the argument.
4312 //
4313 // FIXME: We may be able to remove this, once we can verify no one depends on
4314 // it.
4315 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4316 CmdArgs.push_back("-ios_simulator_version_min");
4317 else if (DarwinTC.isTargetIPhoneOS())
4318 CmdArgs.push_back("-iphoneos_version_min");
4319 else
4320 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004321 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004322
Daniel Dunbarc1964212009-03-26 16:23:12 +00004323 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4324 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4325 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4326 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4327 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004328
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004329 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4330 options::OPT_fno_pie,
4331 options::OPT_fno_PIE)) {
4332 if (A->getOption().matches(options::OPT_fpie) ||
4333 A->getOption().matches(options::OPT_fPIE))
4334 CmdArgs.push_back("-pie");
4335 else
4336 CmdArgs.push_back("-no_pie");
4337 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004338
4339 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4340 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4341 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4342 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4343 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4344 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4345 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4346 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4347 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4348 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4349 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4350 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4351 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4352 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4353 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4354 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004355
Daniel Dunbar84384642011-05-02 21:03:47 +00004356 // Give --sysroot= preference, over the Apple specific behavior to also use
4357 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004358 StringRef sysroot = C.getSysRoot();
4359 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004360 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004361 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004362 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4363 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004364 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004365 }
4366
Daniel Dunbarc1964212009-03-26 16:23:12 +00004367 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4368 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4369 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4370 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4371 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004372 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004373 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4374 Args.AddAllArgs(CmdArgs, options::OPT_y);
4375 Args.AddLastArg(CmdArgs, options::OPT_w);
4376 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4377 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4378 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4379 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4380 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4381 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4382 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4383 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4384 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4385 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4386 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4387 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4388}
4389
4390void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004391 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004392 const InputInfoList &Inputs,
4393 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004394 const char *LinkingOutput) const {
4395 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004396
Daniel Dunbarc1964212009-03-26 16:23:12 +00004397 // The logic here is derived from gcc's behavior; most of which
4398 // comes from specs (starting with link_command). Consult gcc for
4399 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004400 ArgStringList CmdArgs;
4401
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004402 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4403 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4404 options::OPT_ccc_arcmt_migrate)) {
4405 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4406 (*I)->claim();
4407 const char *Exec =
4408 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4409 CmdArgs.push_back(Output.getFilename());
4410 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4411 return;
4412 }
4413
Daniel Dunbarc1964212009-03-26 16:23:12 +00004414 // I'm not sure why this particular decomposition exists in gcc, but
4415 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004416 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004417
Daniel Dunbarc1964212009-03-26 16:23:12 +00004418 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4419 Args.AddAllArgs(CmdArgs, options::OPT_s);
4420 Args.AddAllArgs(CmdArgs, options::OPT_t);
4421 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4422 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004423 Args.AddLastArg(CmdArgs, options::OPT_e);
4424 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4425 Args.AddAllArgs(CmdArgs, options::OPT_r);
4426
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004427 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4428 // members of static archive libraries which implement Objective-C classes or
4429 // categories.
4430 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4431 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004432
Bill Wendling58979742012-12-10 21:48:41 +00004433 if (Args.hasArg(options::OPT_rdynamic))
4434 CmdArgs.push_back("-export_dynamic");
4435
Daniel Dunbarc1964212009-03-26 16:23:12 +00004436 CmdArgs.push_back("-o");
4437 CmdArgs.push_back(Output.getFilename());
4438
Chad Rosier06fd3c62012-05-16 23:45:12 +00004439 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004440 !Args.hasArg(options::OPT_nostartfiles)) {
4441 // Derived from startfile spec.
4442 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004443 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004444 if (getDarwinToolChain().isTargetIOSSimulator()) {
4445 // The simulator doesn't have a versioned crt1 file.
4446 CmdArgs.push_back("-ldylib1.o");
4447 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004448 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4449 CmdArgs.push_back("-ldylib1.o");
4450 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004451 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004452 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004453 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004454 CmdArgs.push_back("-ldylib1.10.5.o");
4455 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004456 } else {
4457 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004458 if (!Args.hasArg(options::OPT_static)) {
4459 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004460 if (getDarwinToolChain().isTargetIOSSimulator()) {
4461 // The simulator doesn't have a versioned crt1 file.
4462 CmdArgs.push_back("-lbundle1.o");
4463 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004464 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4465 CmdArgs.push_back("-lbundle1.o");
4466 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004467 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004468 CmdArgs.push_back("-lbundle1.o");
4469 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004470 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004471 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004472 if (Args.hasArg(options::OPT_pg) &&
4473 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004474 if (Args.hasArg(options::OPT_static) ||
4475 Args.hasArg(options::OPT_object) ||
4476 Args.hasArg(options::OPT_preload)) {
4477 CmdArgs.push_back("-lgcrt0.o");
4478 } else {
4479 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004480
Daniel Dunbarc1964212009-03-26 16:23:12 +00004481 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004482 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004483 // By default on OS X 10.8 and later, we don't link with a crt1.o
4484 // file and the linker knows to use _main as the entry point. But,
4485 // when compiling with -pg, we need to link with the gcrt1.o file,
4486 // so pass the -no_new_main option to tell the linker to use the
4487 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004488 if (getDarwinToolChain().isTargetMacOS() &&
4489 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4490 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004491 } else {
4492 if (Args.hasArg(options::OPT_static) ||
4493 Args.hasArg(options::OPT_object) ||
4494 Args.hasArg(options::OPT_preload)) {
4495 CmdArgs.push_back("-lcrt0.o");
4496 } else {
4497 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004498 if (getDarwinToolChain().isTargetIOSSimulator()) {
4499 // The simulator doesn't have a versioned crt1 file.
4500 CmdArgs.push_back("-lcrt1.o");
4501 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004502 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4503 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004504 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004505 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004506 } else {
4507 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4508 CmdArgs.push_back("-lcrt1.o");
4509 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4510 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004511 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004512 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004513
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004514 // darwin_crt2 spec is empty.
4515 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004516 }
4517 }
4518 }
4519 }
4520
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004521 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4522 Args.hasArg(options::OPT_shared_libgcc) &&
4523 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004524 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004525 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004526 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004527 }
4528 }
4529
4530 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004531
Alexey Samsonov627b10f2012-11-06 15:09:03 +00004532 SanitizerArgs Sanitize(getToolChain().getDriver(), Args);
Alexey Samsonov969be242013-01-21 08:45:02 +00004533 // If we're building a dynamic lib with -fsanitize=address,
4534 // unresolved symbols may appear. Mark all
Alexey Samsonovcc429802012-11-16 12:53:14 +00004535 // of them as dynamic_lookup. Linking executables is handled in
4536 // lib/Driver/ToolChains.cpp.
Alexey Samsonov969be242013-01-21 08:45:02 +00004537 if (Sanitize.needsAsanRt()) {
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004538 if (Args.hasArg(options::OPT_dynamiclib) ||
4539 Args.hasArg(options::OPT_bundle)) {
4540 CmdArgs.push_back("-undefined");
4541 CmdArgs.push_back("dynamic_lookup");
4542 }
4543 }
4544
Daniel Dunbarc1964212009-03-26 16:23:12 +00004545 if (Args.hasArg(options::OPT_fopenmp))
4546 // This is more complicated in gcc...
4547 CmdArgs.push_back("-lgomp");
4548
Douglas Gregor9295df02012-05-15 21:00:27 +00004549 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4550
Bob Wilson16d93952012-05-15 18:57:39 +00004551 if (isObjCRuntimeLinked(Args) &&
4552 !Args.hasArg(options::OPT_nostdlib) &&
4553 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004554 // Avoid linking compatibility stubs on i386 mac.
4555 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004556 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004557 // If we don't have ARC or subscripting runtime support, link in the
4558 // runtime stubs. We have to do this *before* adding any of the normal
4559 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004560 ObjCRuntime runtime =
4561 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004562 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004563 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004564 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004565 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004566 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004567 CmdArgs.push_back("-framework");
4568 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004569 // Link libobj.
4570 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004571 }
John McCall31168b02011-06-15 23:02:42 +00004572
Daniel Dunbarc1964212009-03-26 16:23:12 +00004573 if (LinkingOutput) {
4574 CmdArgs.push_back("-arch_multiple");
4575 CmdArgs.push_back("-final_output");
4576 CmdArgs.push_back(LinkingOutput);
4577 }
4578
Daniel Dunbarc1964212009-03-26 16:23:12 +00004579 if (Args.hasArg(options::OPT_fnested_functions))
4580 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004581
Daniel Dunbarc1964212009-03-26 16:23:12 +00004582 if (!Args.hasArg(options::OPT_nostdlib) &&
4583 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004584 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004585 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004586
Daniel Dunbarc1964212009-03-26 16:23:12 +00004587 // link_ssp spec is empty.
4588
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004589 // Let the tool chain choose which runtime library to link.
4590 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004591 }
4592
Chad Rosier06fd3c62012-05-16 23:45:12 +00004593 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004594 !Args.hasArg(options::OPT_nostartfiles)) {
4595 // endfile_spec is empty.
4596 }
4597
4598 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4599 Args.AddAllArgs(CmdArgs, options::OPT_F);
4600
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004601 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004602 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004603 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004604}
4605
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004606void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004607 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004608 const InputInfoList &Inputs,
4609 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004610 const char *LinkingOutput) const {
4611 ArgStringList CmdArgs;
4612
4613 CmdArgs.push_back("-create");
4614 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004615
4616 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004617 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004618
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004619 for (InputInfoList::const_iterator
4620 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4621 const InputInfo &II = *it;
4622 assert(II.isFilename() && "Unexpected lipo input.");
4623 CmdArgs.push_back(II.getFilename());
4624 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004625 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004626 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004627 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004628}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004629
Daniel Dunbar88299622010-06-04 18:28:36 +00004630void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004631 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004632 const InputInfoList &Inputs,
4633 const ArgList &Args,
4634 const char *LinkingOutput) const {
4635 ArgStringList CmdArgs;
4636
Daniel Dunbareb86b042011-05-09 17:23:16 +00004637 CmdArgs.push_back("-o");
4638 CmdArgs.push_back(Output.getFilename());
4639
Daniel Dunbar88299622010-06-04 18:28:36 +00004640 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4641 const InputInfo &Input = Inputs[0];
4642 assert(Input.isFilename() && "Unexpected dsymutil input.");
4643 CmdArgs.push_back(Input.getFilename());
4644
Daniel Dunbar88299622010-06-04 18:28:36 +00004645 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004646 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004647 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004648}
4649
Eric Christopher551ef452011-08-23 17:56:55 +00004650void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00004651 const InputInfo &Output,
4652 const InputInfoList &Inputs,
4653 const ArgList &Args,
4654 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00004655 ArgStringList CmdArgs;
4656 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004657 CmdArgs.push_back("--debug-info");
4658 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004659 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004660
4661 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4662 const InputInfo &Input = Inputs[0];
4663 assert(Input.isFilename() && "Unexpected verify input");
4664
4665 // Grabbing the output of the earlier dsymutil run.
4666 CmdArgs.push_back(Input.getFilename());
4667
4668 const char *Exec =
4669 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4670 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4671}
4672
David Chisnallf571cde2012-02-15 13:39:01 +00004673void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4674 const InputInfo &Output,
4675 const InputInfoList &Inputs,
4676 const ArgList &Args,
4677 const char *LinkingOutput) const {
4678 ArgStringList CmdArgs;
4679
4680 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4681 options::OPT_Xassembler);
4682
4683 CmdArgs.push_back("-o");
4684 CmdArgs.push_back(Output.getFilename());
4685
4686 for (InputInfoList::const_iterator
4687 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4688 const InputInfo &II = *it;
4689 CmdArgs.push_back(II.getFilename());
4690 }
4691
4692 const char *Exec =
4693 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4694 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4695}
4696
4697
4698void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4699 const InputInfo &Output,
4700 const InputInfoList &Inputs,
4701 const ArgList &Args,
4702 const char *LinkingOutput) const {
4703 // FIXME: Find a real GCC, don't hard-code versions here
4704 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4705 const llvm::Triple &T = getToolChain().getTriple();
4706 std::string LibPath = "/usr/lib/";
4707 llvm::Triple::ArchType Arch = T.getArch();
4708 switch (Arch) {
4709 case llvm::Triple::x86:
4710 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4711 T.getOSName()).str() + "/4.5.2/";
4712 break;
4713 case llvm::Triple::x86_64:
4714 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4715 T.getOSName()).str();
4716 GCCLibPath += "/4.5.2/amd64/";
4717 LibPath += "amd64/";
4718 break;
4719 default:
4720 assert(0 && "Unsupported architecture");
4721 }
4722
4723 ArgStringList CmdArgs;
4724
David Chisnall272a0712012-02-29 15:06:12 +00004725 // Demangle C++ names in errors
4726 CmdArgs.push_back("-C");
4727
David Chisnallf571cde2012-02-15 13:39:01 +00004728 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4729 (!Args.hasArg(options::OPT_shared))) {
4730 CmdArgs.push_back("-e");
4731 CmdArgs.push_back("_start");
4732 }
4733
4734 if (Args.hasArg(options::OPT_static)) {
4735 CmdArgs.push_back("-Bstatic");
4736 CmdArgs.push_back("-dn");
4737 } else {
4738 CmdArgs.push_back("-Bdynamic");
4739 if (Args.hasArg(options::OPT_shared)) {
4740 CmdArgs.push_back("-shared");
4741 } else {
4742 CmdArgs.push_back("--dynamic-linker");
4743 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4744 }
4745 }
4746
4747 if (Output.isFilename()) {
4748 CmdArgs.push_back("-o");
4749 CmdArgs.push_back(Output.getFilename());
4750 } else {
4751 assert(Output.isNothing() && "Invalid output.");
4752 }
4753
4754 if (!Args.hasArg(options::OPT_nostdlib) &&
4755 !Args.hasArg(options::OPT_nostartfiles)) {
4756 if (!Args.hasArg(options::OPT_shared)) {
4757 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4758 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004759 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004760 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4761 } else {
4762 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004763 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4764 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004765 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004766 if (getToolChain().getDriver().CCCIsCXX)
4767 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004768 }
4769
4770 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4771
4772 Args.AddAllArgs(CmdArgs, options::OPT_L);
4773 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4774 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004775 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004776
4777 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4778
4779 if (!Args.hasArg(options::OPT_nostdlib) &&
4780 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004781 if (getToolChain().getDriver().CCCIsCXX)
4782 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004783 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004784 if (!Args.hasArg(options::OPT_shared)) {
4785 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004786 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004787 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004788 }
David Chisnallf571cde2012-02-15 13:39:01 +00004789 }
4790
4791 if (!Args.hasArg(options::OPT_nostdlib) &&
4792 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004793 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004794 }
David Chisnall96de9932012-02-16 16:00:47 +00004795 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004796
4797 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4798
4799 const char *Exec =
4800 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4801 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4802}
4803
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004804void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004805 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004806 const InputInfoList &Inputs,
4807 const ArgList &Args,
4808 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004809 ArgStringList CmdArgs;
4810
4811 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4812 options::OPT_Xassembler);
4813
4814 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004815 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004816
4817 for (InputInfoList::const_iterator
4818 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4819 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004820 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004821 }
4822
4823 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004824 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004825 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004826}
4827
4828void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004829 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004830 const InputInfoList &Inputs,
4831 const ArgList &Args,
4832 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004833 ArgStringList CmdArgs;
4834
4835 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004836 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004837 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004838 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004839 }
4840
4841 if (Args.hasArg(options::OPT_static)) {
4842 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004843 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004844 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004845// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004846 CmdArgs.push_back("-Bdynamic");
4847 if (Args.hasArg(options::OPT_shared)) {
4848 CmdArgs.push_back("-shared");
4849 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004850 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004851 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4852 }
4853 }
4854
Daniel Dunbarb440f562010-08-02 02:38:21 +00004855 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004856 CmdArgs.push_back("-o");
4857 CmdArgs.push_back(Output.getFilename());
4858 } else {
4859 assert(Output.isNothing() && "Invalid output.");
4860 }
4861
4862 if (!Args.hasArg(options::OPT_nostdlib) &&
4863 !Args.hasArg(options::OPT_nostartfiles)) {
4864 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004865 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004866 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004867 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004868 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004869 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004870 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004871 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004872 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004873 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004874 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004875 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004876 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004877 }
4878
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004879 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4880 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004881 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004882
4883 Args.AddAllArgs(CmdArgs, options::OPT_L);
4884 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4885 Args.AddAllArgs(CmdArgs, options::OPT_e);
4886
Daniel Dunbar54423b22010-09-17 00:24:54 +00004887 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004888
4889 if (!Args.hasArg(options::OPT_nostdlib) &&
4890 !Args.hasArg(options::OPT_nodefaultlibs)) {
4891 // FIXME: For some reason GCC passes -lgcc before adding
4892 // the default system libraries. Just mimic this for now.
4893 CmdArgs.push_back("-lgcc");
4894
4895 if (Args.hasArg(options::OPT_pthread))
4896 CmdArgs.push_back("-pthread");
4897 if (!Args.hasArg(options::OPT_shared))
4898 CmdArgs.push_back("-lc");
4899 CmdArgs.push_back("-lgcc");
4900 }
4901
4902 if (!Args.hasArg(options::OPT_nostdlib) &&
4903 !Args.hasArg(options::OPT_nostartfiles)) {
4904 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004905 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004906 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004907 }
4908
Bill Wendling08760582011-06-27 19:15:03 +00004909 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004910
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004911 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004912 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004913 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004914}
4915
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004916void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004917 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004918 const InputInfoList &Inputs,
4919 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004920 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004921 ArgStringList CmdArgs;
4922
4923 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4924 options::OPT_Xassembler);
4925
4926 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004927 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004928
4929 for (InputInfoList::const_iterator
4930 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4931 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004932 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004933 }
4934
4935 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004936 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004937 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004938}
4939
4940void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004941 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004942 const InputInfoList &Inputs,
4943 const ArgList &Args,
4944 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004945 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004946 ArgStringList CmdArgs;
4947
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00004948 // Silence warning for "clang -g foo.o -o foo"
4949 Args.ClaimAllArgs(options::OPT_g_Group);
4950 // and "clang -emit-llvm foo.o -o foo"
4951 Args.ClaimAllArgs(options::OPT_emit_llvm);
4952 // and for "clang -w foo.o -o foo". Other warning options are already
4953 // handled somewhere else.
4954 Args.ClaimAllArgs(options::OPT_w);
4955
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004956 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004957 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004958 CmdArgs.push_back("-e");
4959 CmdArgs.push_back("__start");
4960 }
4961
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004962 if (Args.hasArg(options::OPT_static)) {
4963 CmdArgs.push_back("-Bstatic");
4964 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004965 if (Args.hasArg(options::OPT_rdynamic))
4966 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004967 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004968 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004969 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004970 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004971 } else {
4972 CmdArgs.push_back("-dynamic-linker");
4973 CmdArgs.push_back("/usr/libexec/ld.so");
4974 }
4975 }
4976
Daniel Dunbarb440f562010-08-02 02:38:21 +00004977 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004978 CmdArgs.push_back("-o");
4979 CmdArgs.push_back(Output.getFilename());
4980 } else {
4981 assert(Output.isNothing() && "Invalid output.");
4982 }
4983
4984 if (!Args.hasArg(options::OPT_nostdlib) &&
4985 !Args.hasArg(options::OPT_nostartfiles)) {
4986 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004987 if (Args.hasArg(options::OPT_pg))
4988 CmdArgs.push_back(Args.MakeArgString(
4989 getToolChain().GetFilePath("gcrt0.o")));
4990 else
4991 CmdArgs.push_back(Args.MakeArgString(
4992 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004993 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004994 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004995 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004996 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004997 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004998 }
4999 }
5000
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005001 std::string Triple = getToolChain().getTripleString();
5002 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005003 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005004 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005005 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005006
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005007 Args.AddAllArgs(CmdArgs, options::OPT_L);
5008 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5009 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005010 Args.AddAllArgs(CmdArgs, options::OPT_s);
5011 Args.AddAllArgs(CmdArgs, options::OPT_t);
5012 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5013 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005014
Daniel Dunbar54423b22010-09-17 00:24:54 +00005015 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005016
5017 if (!Args.hasArg(options::OPT_nostdlib) &&
5018 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005019 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005020 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005021 if (Args.hasArg(options::OPT_pg))
5022 CmdArgs.push_back("-lm_p");
5023 else
5024 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005025 }
5026
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005027 // FIXME: For some reason GCC passes -lgcc before adding
5028 // the default system libraries. Just mimic this for now.
5029 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005030
Eric Christopher17674ec2012-09-13 06:32:34 +00005031 if (Args.hasArg(options::OPT_pthread)) {
5032 if (!Args.hasArg(options::OPT_shared) &&
5033 Args.hasArg(options::OPT_pg))
5034 CmdArgs.push_back("-lpthread_p");
5035 else
5036 CmdArgs.push_back("-lpthread");
5037 }
5038
Chandler Carruth45661652011-12-17 22:32:42 +00005039 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005040 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005041 CmdArgs.push_back("-lc_p");
5042 else
5043 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005044 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005045
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005046 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005047 }
5048
5049 if (!Args.hasArg(options::OPT_nostdlib) &&
5050 !Args.hasArg(options::OPT_nostartfiles)) {
5051 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005052 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005053 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005054 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005055 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005056 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005057 }
5058
5059 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005060 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005061 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005062}
Ed Schoutene33194b2009-04-02 19:13:12 +00005063
Eli Friedman9fa28852012-08-08 23:57:20 +00005064void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5065 const InputInfo &Output,
5066 const InputInfoList &Inputs,
5067 const ArgList &Args,
5068 const char *LinkingOutput) const {
5069 ArgStringList CmdArgs;
5070
5071 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5072 options::OPT_Xassembler);
5073
5074 CmdArgs.push_back("-o");
5075 CmdArgs.push_back(Output.getFilename());
5076
5077 for (InputInfoList::const_iterator
5078 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5079 const InputInfo &II = *it;
5080 CmdArgs.push_back(II.getFilename());
5081 }
5082
5083 const char *Exec =
5084 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5085 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5086}
5087
5088void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5089 const InputInfo &Output,
5090 const InputInfoList &Inputs,
5091 const ArgList &Args,
5092 const char *LinkingOutput) const {
5093 const Driver &D = getToolChain().getDriver();
5094 ArgStringList CmdArgs;
5095
5096 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5097 (!Args.hasArg(options::OPT_shared))) {
5098 CmdArgs.push_back("-e");
5099 CmdArgs.push_back("__start");
5100 }
5101
5102 if (Args.hasArg(options::OPT_static)) {
5103 CmdArgs.push_back("-Bstatic");
5104 } else {
5105 if (Args.hasArg(options::OPT_rdynamic))
5106 CmdArgs.push_back("-export-dynamic");
5107 CmdArgs.push_back("--eh-frame-hdr");
5108 CmdArgs.push_back("-Bdynamic");
5109 if (Args.hasArg(options::OPT_shared)) {
5110 CmdArgs.push_back("-shared");
5111 } else {
5112 CmdArgs.push_back("-dynamic-linker");
5113 CmdArgs.push_back("/usr/libexec/ld.so");
5114 }
5115 }
5116
5117 if (Output.isFilename()) {
5118 CmdArgs.push_back("-o");
5119 CmdArgs.push_back(Output.getFilename());
5120 } else {
5121 assert(Output.isNothing() && "Invalid output.");
5122 }
5123
5124 if (!Args.hasArg(options::OPT_nostdlib) &&
5125 !Args.hasArg(options::OPT_nostartfiles)) {
5126 if (!Args.hasArg(options::OPT_shared)) {
5127 if (Args.hasArg(options::OPT_pg))
5128 CmdArgs.push_back(Args.MakeArgString(
5129 getToolChain().GetFilePath("gcrt0.o")));
5130 else
5131 CmdArgs.push_back(Args.MakeArgString(
5132 getToolChain().GetFilePath("crt0.o")));
5133 CmdArgs.push_back(Args.MakeArgString(
5134 getToolChain().GetFilePath("crtbegin.o")));
5135 } else {
5136 CmdArgs.push_back(Args.MakeArgString(
5137 getToolChain().GetFilePath("crtbeginS.o")));
5138 }
5139 }
5140
5141 Args.AddAllArgs(CmdArgs, options::OPT_L);
5142 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5143 Args.AddAllArgs(CmdArgs, options::OPT_e);
5144
5145 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5146
5147 if (!Args.hasArg(options::OPT_nostdlib) &&
5148 !Args.hasArg(options::OPT_nodefaultlibs)) {
5149 if (D.CCCIsCXX) {
5150 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5151 if (Args.hasArg(options::OPT_pg))
5152 CmdArgs.push_back("-lm_p");
5153 else
5154 CmdArgs.push_back("-lm");
5155 }
5156
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005157 if (Args.hasArg(options::OPT_pthread)) {
5158 if (!Args.hasArg(options::OPT_shared) &&
5159 Args.hasArg(options::OPT_pg))
5160 CmdArgs.push_back("-lpthread_p");
5161 else
5162 CmdArgs.push_back("-lpthread");
5163 }
5164
Eli Friedman9fa28852012-08-08 23:57:20 +00005165 if (!Args.hasArg(options::OPT_shared)) {
5166 if (Args.hasArg(options::OPT_pg))
5167 CmdArgs.push_back("-lc_p");
5168 else
5169 CmdArgs.push_back("-lc");
5170 }
5171
5172 std::string myarch = "-lclang_rt.";
5173 const llvm::Triple &T = getToolChain().getTriple();
5174 llvm::Triple::ArchType Arch = T.getArch();
5175 switch (Arch) {
5176 case llvm::Triple::arm:
5177 myarch += ("arm");
5178 break;
5179 case llvm::Triple::x86:
5180 myarch += ("i386");
5181 break;
5182 case llvm::Triple::x86_64:
5183 myarch += ("amd64");
5184 break;
5185 default:
5186 assert(0 && "Unsupported architecture");
5187 }
5188 CmdArgs.push_back(Args.MakeArgString(myarch));
5189 }
5190
5191 if (!Args.hasArg(options::OPT_nostdlib) &&
5192 !Args.hasArg(options::OPT_nostartfiles)) {
5193 if (!Args.hasArg(options::OPT_shared))
5194 CmdArgs.push_back(Args.MakeArgString(
5195 getToolChain().GetFilePath("crtend.o")));
5196 else
5197 CmdArgs.push_back(Args.MakeArgString(
5198 getToolChain().GetFilePath("crtendS.o")));
5199 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005200
5201 const char *Exec =
5202 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5203 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005204}
5205
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005206void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005207 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005208 const InputInfoList &Inputs,
5209 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005210 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005211 ArgStringList CmdArgs;
5212
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005213 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5214 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005215 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005216 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005217 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005218 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005219 else if (getToolChain().getArch() == llvm::Triple::mips ||
5220 getToolChain().getArch() == llvm::Triple::mipsel ||
5221 getToolChain().getArch() == llvm::Triple::mips64 ||
5222 getToolChain().getArch() == llvm::Triple::mips64el) {
5223 StringRef CPUName;
5224 StringRef ABIName;
5225 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005226
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005227 CmdArgs.push_back("-march");
5228 CmdArgs.push_back(CPUName.data());
5229
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005230 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005231 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005232
5233 if (getToolChain().getArch() == llvm::Triple::mips ||
5234 getToolChain().getArch() == llvm::Triple::mips64)
5235 CmdArgs.push_back("-EB");
5236 else
5237 CmdArgs.push_back("-EL");
5238
5239 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5240 options::OPT_fpic, options::OPT_fno_pic,
5241 options::OPT_fPIE, options::OPT_fno_PIE,
5242 options::OPT_fpie, options::OPT_fno_pie);
5243 if (LastPICArg &&
5244 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5245 LastPICArg->getOption().matches(options::OPT_fpic) ||
5246 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5247 LastPICArg->getOption().matches(options::OPT_fpie))) {
5248 CmdArgs.push_back("-KPIC");
5249 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005250 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5251 getToolChain().getArch() == llvm::Triple::thumb) {
5252 CmdArgs.push_back("-mfpu=softvfp");
5253 switch(getToolChain().getTriple().getEnvironment()) {
5254 case llvm::Triple::GNUEABI:
5255 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005256 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005257 break;
5258
5259 default:
5260 CmdArgs.push_back("-matpcs");
5261 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005262 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005263
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005264 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5265 options::OPT_Xassembler);
5266
5267 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005268 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005269
5270 for (InputInfoList::const_iterator
5271 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5272 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005273 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005274 }
5275
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005276 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005277 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005278 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005279}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005280
5281void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005282 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005283 const InputInfoList &Inputs,
5284 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005285 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005286 const toolchains::FreeBSD& ToolChain =
5287 static_cast<const toolchains::FreeBSD&>(getToolChain());
5288 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005289 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005290
5291 // Silence warning for "clang -g foo.o -o foo"
5292 Args.ClaimAllArgs(options::OPT_g_Group);
5293 // and "clang -emit-llvm foo.o -o foo"
5294 Args.ClaimAllArgs(options::OPT_emit_llvm);
5295 // and for "clang -w foo.o -o foo". Other warning options are already
5296 // handled somewhere else.
5297 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005298
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005299 if (!D.SysRoot.empty())
5300 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5301
Roman Divackyafe2f232012-08-28 15:09:03 +00005302 if (Args.hasArg(options::OPT_pie))
5303 CmdArgs.push_back("-pie");
5304
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005305 if (Args.hasArg(options::OPT_static)) {
5306 CmdArgs.push_back("-Bstatic");
5307 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005308 if (Args.hasArg(options::OPT_rdynamic))
5309 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005310 CmdArgs.push_back("--eh-frame-hdr");
5311 if (Args.hasArg(options::OPT_shared)) {
5312 CmdArgs.push_back("-Bshareable");
5313 } else {
5314 CmdArgs.push_back("-dynamic-linker");
5315 CmdArgs.push_back("/libexec/ld-elf.so.1");
5316 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005317 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5318 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005319 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5320 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5321 CmdArgs.push_back("--hash-style=both");
5322 }
5323 }
5324 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005325 }
5326
5327 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5328 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005329 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005330 CmdArgs.push_back("-m");
5331 CmdArgs.push_back("elf_i386_fbsd");
5332 }
5333
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005334 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005335 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005336 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005337 }
5338
Daniel Dunbarb440f562010-08-02 02:38:21 +00005339 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005340 CmdArgs.push_back("-o");
5341 CmdArgs.push_back(Output.getFilename());
5342 } else {
5343 assert(Output.isNothing() && "Invalid output.");
5344 }
5345
5346 if (!Args.hasArg(options::OPT_nostdlib) &&
5347 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005348 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005349 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005350 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005351 crt1 = "gcrt1.o";
5352 else if (Args.hasArg(options::OPT_pie))
5353 crt1 = "Scrt1.o";
5354 else
5355 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005356 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005357 if (crt1)
5358 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5359
5360 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5361
5362 const char *crtbegin = NULL;
5363 if (Args.hasArg(options::OPT_static))
5364 crtbegin = "crtbeginT.o";
5365 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5366 crtbegin = "crtbeginS.o";
5367 else
5368 crtbegin = "crtbegin.o";
5369
5370 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005371 }
5372
5373 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005374 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005375 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5376 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005377 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005378 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5379 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005380 Args.AddAllArgs(CmdArgs, options::OPT_s);
5381 Args.AddAllArgs(CmdArgs, options::OPT_t);
5382 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5383 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005384
Roman Divackyafe2f232012-08-28 15:09:03 +00005385 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005386
5387 if (!Args.hasArg(options::OPT_nostdlib) &&
5388 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005389 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005390 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005391 if (Args.hasArg(options::OPT_pg))
5392 CmdArgs.push_back("-lm_p");
5393 else
5394 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005395 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005396 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5397 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005398 if (Args.hasArg(options::OPT_pg))
5399 CmdArgs.push_back("-lgcc_p");
5400 else
5401 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005402 if (Args.hasArg(options::OPT_static)) {
5403 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005404 } else if (Args.hasArg(options::OPT_pg)) {
5405 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005406 } else {
5407 CmdArgs.push_back("--as-needed");
5408 CmdArgs.push_back("-lgcc_s");
5409 CmdArgs.push_back("--no-as-needed");
5410 }
5411
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005412 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005413 if (Args.hasArg(options::OPT_pg))
5414 CmdArgs.push_back("-lpthread_p");
5415 else
5416 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005417 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005418
Roman Divacky66f22762011-02-10 16:59:40 +00005419 if (Args.hasArg(options::OPT_pg)) {
5420 if (Args.hasArg(options::OPT_shared))
5421 CmdArgs.push_back("-lc");
5422 else
5423 CmdArgs.push_back("-lc_p");
5424 CmdArgs.push_back("-lgcc_p");
5425 } else {
5426 CmdArgs.push_back("-lc");
5427 CmdArgs.push_back("-lgcc");
5428 }
5429
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005430 if (Args.hasArg(options::OPT_static)) {
5431 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005432 } else if (Args.hasArg(options::OPT_pg)) {
5433 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005434 } else {
5435 CmdArgs.push_back("--as-needed");
5436 CmdArgs.push_back("-lgcc_s");
5437 CmdArgs.push_back("--no-as-needed");
5438 }
5439 }
5440
5441 if (!Args.hasArg(options::OPT_nostdlib) &&
5442 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005443 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005444 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005445 else
5446 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005447 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005448 }
5449
Roman Divackyafe2f232012-08-28 15:09:03 +00005450 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005451
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005452 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005453 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005454 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005455}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005456
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005457void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5458 const InputInfo &Output,
5459 const InputInfoList &Inputs,
5460 const ArgList &Args,
5461 const char *LinkingOutput) const {
5462 ArgStringList CmdArgs;
5463
5464 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5465 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005466 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005467 CmdArgs.push_back("--32");
5468
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005469 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005470 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005471 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005472 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005473 CmdArgs.push_back("-EL");
5474
5475 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5476 options::OPT_Xassembler);
5477
5478 CmdArgs.push_back("-o");
5479 CmdArgs.push_back(Output.getFilename());
5480
5481 for (InputInfoList::const_iterator
5482 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5483 const InputInfo &II = *it;
5484 CmdArgs.push_back(II.getFilename());
5485 }
5486
David Chisnallddbd68f2011-09-27 22:03:18 +00005487 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005488 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5489}
5490
5491void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5492 const InputInfo &Output,
5493 const InputInfoList &Inputs,
5494 const ArgList &Args,
5495 const char *LinkingOutput) const {
5496 const Driver &D = getToolChain().getDriver();
5497 ArgStringList CmdArgs;
5498
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005499 if (!D.SysRoot.empty())
5500 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5501
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005502 if (Args.hasArg(options::OPT_static)) {
5503 CmdArgs.push_back("-Bstatic");
5504 } else {
5505 if (Args.hasArg(options::OPT_rdynamic))
5506 CmdArgs.push_back("-export-dynamic");
5507 CmdArgs.push_back("--eh-frame-hdr");
5508 if (Args.hasArg(options::OPT_shared)) {
5509 CmdArgs.push_back("-Bshareable");
5510 } else {
5511 CmdArgs.push_back("-dynamic-linker");
5512 CmdArgs.push_back("/libexec/ld.elf_so");
5513 }
5514 }
5515
5516 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5517 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005518 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005519 CmdArgs.push_back("-m");
5520 CmdArgs.push_back("elf_i386");
5521 }
5522
5523 if (Output.isFilename()) {
5524 CmdArgs.push_back("-o");
5525 CmdArgs.push_back(Output.getFilename());
5526 } else {
5527 assert(Output.isNothing() && "Invalid output.");
5528 }
5529
5530 if (!Args.hasArg(options::OPT_nostdlib) &&
5531 !Args.hasArg(options::OPT_nostartfiles)) {
5532 if (!Args.hasArg(options::OPT_shared)) {
5533 CmdArgs.push_back(Args.MakeArgString(
5534 getToolChain().GetFilePath("crt0.o")));
5535 CmdArgs.push_back(Args.MakeArgString(
5536 getToolChain().GetFilePath("crti.o")));
5537 CmdArgs.push_back(Args.MakeArgString(
5538 getToolChain().GetFilePath("crtbegin.o")));
5539 } else {
5540 CmdArgs.push_back(Args.MakeArgString(
5541 getToolChain().GetFilePath("crti.o")));
5542 CmdArgs.push_back(Args.MakeArgString(
5543 getToolChain().GetFilePath("crtbeginS.o")));
5544 }
5545 }
5546
5547 Args.AddAllArgs(CmdArgs, options::OPT_L);
5548 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5549 Args.AddAllArgs(CmdArgs, options::OPT_e);
5550 Args.AddAllArgs(CmdArgs, options::OPT_s);
5551 Args.AddAllArgs(CmdArgs, options::OPT_t);
5552 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5553 Args.AddAllArgs(CmdArgs, options::OPT_r);
5554
5555 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5556
5557 if (!Args.hasArg(options::OPT_nostdlib) &&
5558 !Args.hasArg(options::OPT_nodefaultlibs)) {
5559 if (D.CCCIsCXX) {
5560 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5561 CmdArgs.push_back("-lm");
5562 }
5563 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5564 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005565 if (Args.hasArg(options::OPT_static)) {
5566 CmdArgs.push_back("-lgcc_eh");
5567 } else {
5568 CmdArgs.push_back("--as-needed");
5569 CmdArgs.push_back("-lgcc_s");
5570 CmdArgs.push_back("--no-as-needed");
5571 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005572 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005573
5574 if (Args.hasArg(options::OPT_pthread))
5575 CmdArgs.push_back("-lpthread");
5576 CmdArgs.push_back("-lc");
5577
5578 CmdArgs.push_back("-lgcc");
5579 if (Args.hasArg(options::OPT_static)) {
5580 CmdArgs.push_back("-lgcc_eh");
5581 } else {
5582 CmdArgs.push_back("--as-needed");
5583 CmdArgs.push_back("-lgcc_s");
5584 CmdArgs.push_back("--no-as-needed");
5585 }
5586 }
5587
5588 if (!Args.hasArg(options::OPT_nostdlib) &&
5589 !Args.hasArg(options::OPT_nostartfiles)) {
5590 if (!Args.hasArg(options::OPT_shared))
5591 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5592 "crtend.o")));
5593 else
5594 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5595 "crtendS.o")));
5596 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5597 "crtn.o")));
5598 }
5599
Bill Wendling08760582011-06-27 19:15:03 +00005600 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005601
David Chisnallddbd68f2011-09-27 22:03:18 +00005602 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005603 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5604}
5605
Thomas Schwinge4e555262013-03-28 19:04:25 +00005606void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5607 const InputInfo &Output,
5608 const InputInfoList &Inputs,
5609 const ArgList &Args,
5610 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00005611 ArgStringList CmdArgs;
5612
5613 // Add --32/--64 to make sure we get the format we want.
5614 // This is incomplete
5615 if (getToolChain().getArch() == llvm::Triple::x86) {
5616 CmdArgs.push_back("--32");
5617 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5618 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005619 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5620 CmdArgs.push_back("-a32");
5621 CmdArgs.push_back("-mppc");
5622 CmdArgs.push_back("-many");
5623 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5624 CmdArgs.push_back("-a64");
5625 CmdArgs.push_back("-mppc64");
5626 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005627 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005628 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005629 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5630 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005631
5632 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5633 getToolChain().getTriple());
5634 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005635
5636 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5637 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5638 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005639 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5640 getToolChain().getArch() == llvm::Triple::mipsel ||
5641 getToolChain().getArch() == llvm::Triple::mips64 ||
5642 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005643 StringRef CPUName;
5644 StringRef ABIName;
5645 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005646
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005647 CmdArgs.push_back("-march");
5648 CmdArgs.push_back(CPUName.data());
5649
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005650 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005651 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005652
5653 if (getToolChain().getArch() == llvm::Triple::mips ||
5654 getToolChain().getArch() == llvm::Triple::mips64)
5655 CmdArgs.push_back("-EB");
5656 else
5657 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005658
5659 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5660 options::OPT_fpic, options::OPT_fno_pic,
5661 options::OPT_fPIE, options::OPT_fno_PIE,
5662 options::OPT_fpie, options::OPT_fno_pie);
5663 if (LastPICArg &&
5664 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5665 LastPICArg->getOption().matches(options::OPT_fpic) ||
5666 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5667 LastPICArg->getOption().matches(options::OPT_fpie))) {
5668 CmdArgs.push_back("-KPIC");
5669 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005670 }
5671
5672 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5673 options::OPT_Xassembler);
5674
5675 CmdArgs.push_back("-o");
5676 CmdArgs.push_back(Output.getFilename());
5677
5678 for (InputInfoList::const_iterator
5679 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5680 const InputInfo &II = *it;
5681 CmdArgs.push_back(II.getFilename());
5682 }
5683
5684 const char *Exec =
5685 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5686 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5687}
5688
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005689static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5690 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005691 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00005692 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
5693 Args.hasArg(options::OPT_static);
Rafael Espindolacc354322011-10-17 21:39:04 +00005694 if (!D.CCCIsCXX)
5695 CmdArgs.push_back("-lgcc");
5696
Logan Chien3d3373c2012-11-19 12:04:11 +00005697 if (StaticLibgcc || isAndroid) {
Rafael Espindolacc354322011-10-17 21:39:04 +00005698 if (D.CCCIsCXX)
5699 CmdArgs.push_back("-lgcc");
5700 } else {
5701 if (!D.CCCIsCXX)
5702 CmdArgs.push_back("--as-needed");
5703 CmdArgs.push_back("-lgcc_s");
5704 if (!D.CCCIsCXX)
5705 CmdArgs.push_back("--no-as-needed");
5706 }
5707
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005708 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005709 CmdArgs.push_back("-lgcc_eh");
5710 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5711 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00005712
5713 // According to Android ABI, we have to link with libdl if we are
5714 // linking with non-static libgcc.
5715 //
5716 // NOTE: This fixes a link error on Android MIPS as well. The non-static
5717 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
5718 if (isAndroid && !StaticLibgcc)
5719 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00005720}
5721
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005722static bool hasMipsN32ABIArg(const ArgList &Args) {
5723 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00005724 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005725}
5726
Thomas Schwinge4e555262013-03-28 19:04:25 +00005727void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5728 const InputInfo &Output,
5729 const InputInfoList &Inputs,
5730 const ArgList &Args,
5731 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005732 const toolchains::Linux& ToolChain =
5733 static_cast<const toolchains::Linux&>(getToolChain());
5734 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00005735 const bool isAndroid =
5736 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005737
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005738 ArgStringList CmdArgs;
5739
Rafael Espindolad1002f62010-11-15 18:28:16 +00005740 // Silence warning for "clang -g foo.o -o foo"
5741 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005742 // and "clang -emit-llvm foo.o -o foo"
5743 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005744 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005745 // handled somewhere else.
5746 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005747
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005748 if (!D.SysRoot.empty())
5749 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005750
Peter Collingbourne24c67c62013-01-17 20:17:16 +00005751 if (Args.hasArg(options::OPT_pie) && !Args.hasArg(options::OPT_shared))
Rafael Espindolad47ac232010-11-17 22:26:15 +00005752 CmdArgs.push_back("-pie");
5753
Rafael Espindola1c76c592010-11-07 22:57:16 +00005754 if (Args.hasArg(options::OPT_rdynamic))
5755 CmdArgs.push_back("-export-dynamic");
5756
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005757 if (Args.hasArg(options::OPT_s))
5758 CmdArgs.push_back("-s");
5759
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005760 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5761 e = ToolChain.ExtraOpts.end();
5762 i != e; ++i)
5763 CmdArgs.push_back(i->c_str());
5764
5765 if (!Args.hasArg(options::OPT_static)) {
5766 CmdArgs.push_back("--eh-frame-hdr");
5767 }
5768
5769 CmdArgs.push_back("-m");
5770 if (ToolChain.getArch() == llvm::Triple::x86)
5771 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00005772 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5773 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005774 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005775 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005776 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005777 else if (ToolChain.getArch() == llvm::Triple::ppc)
5778 CmdArgs.push_back("elf32ppclinux");
5779 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5780 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005781 else if (ToolChain.getArch() == llvm::Triple::mips)
5782 CmdArgs.push_back("elf32btsmip");
5783 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5784 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005785 else if (ToolChain.getArch() == llvm::Triple::mips64) {
5786 if (hasMipsN32ABIArg(Args))
5787 CmdArgs.push_back("elf32btsmipn32");
5788 else
5789 CmdArgs.push_back("elf64btsmip");
5790 }
5791 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
5792 if (hasMipsN32ABIArg(Args))
5793 CmdArgs.push_back("elf32ltsmipn32");
5794 else
5795 CmdArgs.push_back("elf64ltsmip");
5796 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005797 else
5798 CmdArgs.push_back("elf_x86_64");
5799
5800 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005801 if (ToolChain.getArch() == llvm::Triple::arm
5802 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005803 CmdArgs.push_back("-Bstatic");
5804 else
5805 CmdArgs.push_back("-static");
5806 } else if (Args.hasArg(options::OPT_shared)) {
5807 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00005808 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005809 CmdArgs.push_back("-Bsymbolic");
5810 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005811 }
5812
5813 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005814 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005815 (!Args.hasArg(options::OPT_static) &&
5816 !Args.hasArg(options::OPT_shared))) {
5817 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005818 if (isAndroid)
5819 CmdArgs.push_back("/system/bin/linker");
5820 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005821 CmdArgs.push_back("/lib/ld-linux.so.2");
Tim Northover9bb857a2013-01-31 12:13:10 +00005822 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5823 CmdArgs.push_back("/lib/ld-linux-aarch64.so.1");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005824 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005825 ToolChain.getArch() == llvm::Triple::thumb) {
5826 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5827 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5828 else
5829 CmdArgs.push_back("/lib/ld-linux.so.3");
5830 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005831 else if (ToolChain.getArch() == llvm::Triple::mips ||
5832 ToolChain.getArch() == llvm::Triple::mipsel)
5833 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005834 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005835 ToolChain.getArch() == llvm::Triple::mips64el) {
5836 if (hasMipsN32ABIArg(Args))
5837 CmdArgs.push_back("/lib32/ld.so.1");
5838 else
5839 CmdArgs.push_back("/lib64/ld.so.1");
5840 }
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005841 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005842 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005843 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005844 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005845 else
5846 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5847 }
5848
5849 CmdArgs.push_back("-o");
5850 CmdArgs.push_back(Output.getFilename());
5851
Rafael Espindola81937ec2010-12-01 01:52:43 +00005852 if (!Args.hasArg(options::OPT_nostdlib) &&
5853 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005854 if (!isAndroid) {
5855 const char *crt1 = NULL;
5856 if (!Args.hasArg(options::OPT_shared)){
5857 if (Args.hasArg(options::OPT_pie))
5858 crt1 = "Scrt1.o";
5859 else
5860 crt1 = "crt1.o";
5861 }
5862 if (crt1)
5863 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005864
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005865 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5866 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005867
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005868 const char *crtbegin;
5869 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005870 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005871 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005872 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005873 else if (Args.hasArg(options::OPT_pie))
5874 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005875 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005876 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005877 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00005878
5879 // Add crtfastmath.o if available and fast math is enabled.
5880 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005881 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005882
5883 Args.AddAllArgs(CmdArgs, options::OPT_L);
5884
5885 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5886
Roman Divackyee8188a2011-03-01 17:53:14 +00005887 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5888 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005889 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005890
Rafael Espindola9446d762012-04-09 23:53:34 +00005891 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5892 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5893 // forward.
5894 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5895 CmdArgs.push_back("-plugin");
5896 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5897 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth953fb082013-01-13 11:46:33 +00005898
5899 // Try to pass driver level flags relevant to LTO code generation down to
5900 // the plugin.
5901
5902 // Handle architecture-specific flags for selecting CPU variants.
5903 if (ToolChain.getArch() == llvm::Triple::x86 ||
5904 ToolChain.getArch() == llvm::Triple::x86_64)
5905 CmdArgs.push_back(
5906 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
5907 getX86TargetCPU(Args, ToolChain.getTriple())));
5908 else if (ToolChain.getArch() == llvm::Triple::arm ||
5909 ToolChain.getArch() == llvm::Triple::thumb)
5910 CmdArgs.push_back(
5911 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
5912 getARMTargetCPU(Args, ToolChain.getTriple())));
5913
5914 // FIXME: Factor out logic for MIPS, PPC, and other targets to support this
5915 // as well.
Rafael Espindola9446d762012-04-09 23:53:34 +00005916 }
5917
Chandler Carruth953fb082013-01-13 11:46:33 +00005918
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005919 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5920 CmdArgs.push_back("--no-demangle");
5921
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005922 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5923
Alexey Samsonov627b10f2012-11-06 15:09:03 +00005924 SanitizerArgs Sanitize(D, Args);
Richard Smith52be6192012-11-05 22:04:41 +00005925
Eric Christopher04997782012-11-29 18:51:05 +00005926 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00005927 if (Sanitize.needsUbsanRt())
Richard Smithcff3cde2013-03-20 23:49:07 +00005928 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX,
5929 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
5930 Sanitize.needsMsanRt());
Eric Christopher04997782012-11-29 18:51:05 +00005931 if (Sanitize.needsAsanRt())
5932 addAsanRTLinux(getToolChain(), Args, CmdArgs);
5933 if (Sanitize.needsTsanRt())
5934 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00005935 if (Sanitize.needsMsanRt())
5936 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00005937
Chandler Carruth94a32012012-05-14 18:31:18 +00005938 if (D.CCCIsCXX &&
5939 !Args.hasArg(options::OPT_nostdlib) &&
5940 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005941 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5942 !Args.hasArg(options::OPT_static);
5943 if (OnlyLibstdcxxStatic)
5944 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005945 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005946 if (OnlyLibstdcxxStatic)
5947 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005948 CmdArgs.push_back("-lm");
5949 }
5950
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005951 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005952 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5953 if (Args.hasArg(options::OPT_static))
5954 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005955
Chandler Carruth01538002013-01-17 13:19:29 +00005956 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
5957 if (OpenMP) {
5958 CmdArgs.push_back("-lgomp");
5959
5960 // FIXME: Exclude this for platforms whith libgomp that doesn't require
5961 // librt. Most modern Linux platfroms require it, but some may not.
5962 CmdArgs.push_back("-lrt");
5963 }
5964
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005965 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005966
Chandler Carruth94a32012012-05-14 18:31:18 +00005967 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00005968 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00005969 CmdArgs.push_back("-lpthread");
5970
5971 CmdArgs.push_back("-lc");
5972
5973 if (Args.hasArg(options::OPT_static))
5974 CmdArgs.push_back("--end-group");
5975 else
5976 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5977 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005978
Rafael Espindola81937ec2010-12-01 01:52:43 +00005979 if (!Args.hasArg(options::OPT_nostartfiles)) {
5980 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005981 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005982 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005983 else if (Args.hasArg(options::OPT_pie))
5984 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005985 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005986 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005987
Rafael Espindola81937ec2010-12-01 01:52:43 +00005988 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005989 if (!isAndroid)
5990 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005991 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005992 }
5993
Bill Wendling08760582011-06-27 19:15:03 +00005994 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005995
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005996 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5997}
Rafael Espindola92b00932010-08-10 00:25:48 +00005998
Chris Lattner3e2ee142010-07-07 16:01:42 +00005999void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006000 const InputInfo &Output,
6001 const InputInfoList &Inputs,
6002 const ArgList &Args,
6003 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006004 ArgStringList CmdArgs;
6005
6006 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6007 options::OPT_Xassembler);
6008
6009 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006010 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006011
6012 for (InputInfoList::const_iterator
6013 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6014 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006015 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006016 }
6017
6018 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006019 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006020 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006021}
6022
6023void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006024 const InputInfo &Output,
6025 const InputInfoList &Inputs,
6026 const ArgList &Args,
6027 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006028 const Driver &D = getToolChain().getDriver();
6029 ArgStringList CmdArgs;
6030
Daniel Dunbarb440f562010-08-02 02:38:21 +00006031 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006032 CmdArgs.push_back("-o");
6033 CmdArgs.push_back(Output.getFilename());
6034 } else {
6035 assert(Output.isNothing() && "Invalid output.");
6036 }
6037
6038 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006039 !Args.hasArg(options::OPT_nostartfiles)) {
6040 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6041 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6042 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6043 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6044 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006045
6046 Args.AddAllArgs(CmdArgs, options::OPT_L);
6047 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6048 Args.AddAllArgs(CmdArgs, options::OPT_e);
6049
Daniel Dunbar54423b22010-09-17 00:24:54 +00006050 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006051
Eli Friedman83de5132011-12-08 23:54:21 +00006052 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6053
Chris Lattner3e2ee142010-07-07 16:01:42 +00006054 if (!Args.hasArg(options::OPT_nostdlib) &&
6055 !Args.hasArg(options::OPT_nodefaultlibs)) {
6056 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006057 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006058 CmdArgs.push_back("-lm");
6059 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006060 }
6061
6062 if (!Args.hasArg(options::OPT_nostdlib) &&
6063 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006064 if (Args.hasArg(options::OPT_pthread))
6065 CmdArgs.push_back("-lpthread");
6066 CmdArgs.push_back("-lc");
6067 CmdArgs.push_back("-lCompilerRT-Generic");
6068 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6069 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006070 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006071 }
6072
Eli Friedman83de5132011-12-08 23:54:21 +00006073 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006074 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006075}
6076
Daniel Dunbarcc912342009-05-02 18:28:39 +00006077/// DragonFly Tools
6078
6079// For now, DragonFly Assemble does just about the same as for
6080// FreeBSD, but this may change soon.
6081void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006082 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006083 const InputInfoList &Inputs,
6084 const ArgList &Args,
6085 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006086 ArgStringList CmdArgs;
6087
6088 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6089 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006090 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006091 CmdArgs.push_back("--32");
6092
6093 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6094 options::OPT_Xassembler);
6095
6096 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006097 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006098
6099 for (InputInfoList::const_iterator
6100 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6101 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006102 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006103 }
6104
6105 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006106 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006107 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006108}
6109
6110void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006111 const InputInfo &Output,
6112 const InputInfoList &Inputs,
6113 const ArgList &Args,
6114 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006115 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006116 ArgStringList CmdArgs;
6117
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006118 if (!D.SysRoot.empty())
6119 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6120
Daniel Dunbarcc912342009-05-02 18:28:39 +00006121 if (Args.hasArg(options::OPT_static)) {
6122 CmdArgs.push_back("-Bstatic");
6123 } else {
6124 if (Args.hasArg(options::OPT_shared))
6125 CmdArgs.push_back("-Bshareable");
6126 else {
6127 CmdArgs.push_back("-dynamic-linker");
6128 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6129 }
6130 }
6131
6132 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6133 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006134 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006135 CmdArgs.push_back("-m");
6136 CmdArgs.push_back("elf_i386");
6137 }
6138
Daniel Dunbarb440f562010-08-02 02:38:21 +00006139 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006140 CmdArgs.push_back("-o");
6141 CmdArgs.push_back(Output.getFilename());
6142 } else {
6143 assert(Output.isNothing() && "Invalid output.");
6144 }
6145
6146 if (!Args.hasArg(options::OPT_nostdlib) &&
6147 !Args.hasArg(options::OPT_nostartfiles)) {
6148 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006149 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006150 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006151 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006152 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006153 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006154 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006155 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006156 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006157 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006158 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006159 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006160 }
6161 }
6162
6163 Args.AddAllArgs(CmdArgs, options::OPT_L);
6164 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6165 Args.AddAllArgs(CmdArgs, options::OPT_e);
6166
Daniel Dunbar54423b22010-09-17 00:24:54 +00006167 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006168
6169 if (!Args.hasArg(options::OPT_nostdlib) &&
6170 !Args.hasArg(options::OPT_nodefaultlibs)) {
6171 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6172 // rpaths
6173 CmdArgs.push_back("-L/usr/lib/gcc41");
6174
6175 if (!Args.hasArg(options::OPT_static)) {
6176 CmdArgs.push_back("-rpath");
6177 CmdArgs.push_back("/usr/lib/gcc41");
6178
6179 CmdArgs.push_back("-rpath-link");
6180 CmdArgs.push_back("/usr/lib/gcc41");
6181
6182 CmdArgs.push_back("-rpath");
6183 CmdArgs.push_back("/usr/lib");
6184
6185 CmdArgs.push_back("-rpath-link");
6186 CmdArgs.push_back("/usr/lib");
6187 }
6188
Rafael Espindola38360b32010-07-20 12:59:03 +00006189 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006190 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006191 CmdArgs.push_back("-lm");
6192 }
6193
Daniel Dunbarcc912342009-05-02 18:28:39 +00006194 if (Args.hasArg(options::OPT_shared)) {
6195 CmdArgs.push_back("-lgcc_pic");
6196 } else {
6197 CmdArgs.push_back("-lgcc");
6198 }
6199
6200
6201 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006202 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006203
6204 if (!Args.hasArg(options::OPT_nolibc)) {
6205 CmdArgs.push_back("-lc");
6206 }
6207
6208 if (Args.hasArg(options::OPT_shared)) {
6209 CmdArgs.push_back("-lgcc_pic");
6210 } else {
6211 CmdArgs.push_back("-lgcc");
6212 }
6213 }
6214
6215 if (!Args.hasArg(options::OPT_nostdlib) &&
6216 !Args.hasArg(options::OPT_nostartfiles)) {
6217 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006218 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006219 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006220 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006221 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006222 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006223 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006224 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006225 }
6226
Bill Wendling08760582011-06-27 19:15:03 +00006227 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006228
Daniel Dunbarcc912342009-05-02 18:28:39 +00006229 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006230 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006231 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006232}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006233
6234void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6235 const InputInfo &Output,
6236 const InputInfoList &Inputs,
6237 const ArgList &Args,
6238 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006239 ArgStringList CmdArgs;
6240
6241 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006242 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6243 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006244 } else {
6245 assert(Output.isNothing() && "Invalid output.");
6246 }
6247
6248 if (!Args.hasArg(options::OPT_nostdlib) &&
6249 !Args.hasArg(options::OPT_nostartfiles)) {
6250 CmdArgs.push_back("-defaultlib:libcmt");
6251 }
6252
6253 CmdArgs.push_back("-nologo");
6254
Michael J. Spencere2f49362012-06-18 16:56:04 +00006255 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6256
6257 // Add filenames immediately.
6258 for (InputInfoList::const_iterator
6259 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6260 if (it->isFilename())
6261 CmdArgs.push_back(it->getFilename());
6262 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006263
6264 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006265 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006266 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6267}